LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1316|回复: 2

在kernel mod内的udp包发送已经成功,但不能收取,求kernel_recvmsg例程

[复制链接]
发表于 2008-3-3 00:31:22 | 显示全部楼层 |阅读模式
我现在的接收代码如下
static int my_recvfrom(struct socket *sock, char *buff, size_t len)
{
        struct msghdr  msg = {NULL,};
        struct kvec  vec;
        int   revlen;
        vec.iov_base     = buff;
        vec.iov_len      = len;
        memset(&msg, 0x00, sizeof(msg));
        revlen = kernel_recvmsg(sock, &msg, &vec, 1, len, 0);
        printk("len is %d \n",revlen);
return revlen;
}
网上找了个原装的也不行
static int
ip_vs_receive(struct socket *sock, char *buffer, const size_t buflen)
{
struct msghdr  msg = {NULL,};
struct kvec  iov;
int   len;
/* Receive a packet */
iov.iov_base     = buffer;
iov.iov_len      = (size_t)buflen;
len = kernel_recvmsg(sock, &msg, &iov, 1, buflen, 0);
if (len < 0)
  return -1;
printk("len is %s\n",buffer);
return len;
}


都不能取得行数,buff也没有内容,但我用nc -u 192.168.0.1 8888测试server端一切正常,有返回的,server端的sendto如下
           memset(str1,0,strlen(str1));
                strcpy(str1,"char is:");
                strcat(str1,recvbuf);
            memset(sendbuf,0,strlen(sendbuf));
            memcpy(sendbuf,str1,strlen(str1));

            snd = sendto(sock,sendbuf,strlen(str1),0,
            (struct sockaddr *) &client,structlength);


我就搞不懂了,既然sock_create和sock_release都提供了,再提供个sock_recvfrom和sock_sendto又有何妨啊......
 楼主| 发表于 2008-3-3 00:43:46 | 显示全部楼层
发送用的是如下代码
static int my_sendto(struct socket *sock, void * buff, size_t len,
unsigned flags, struct sockaddr *addr, int addr_len)
{
        struct kvec vec;
        struct msghdr msg;
        vec.iov_base=buff;
        vec.iov_len=len;

        memset(&msg, 0x00, sizeof(msg));
        msg.msg_name=addr;
        msg.msg_namelen=addr_len;
        msg.msg_flags = flags | MSG_DONTWAIT;

        return kernel_sendmsg(sock, &msg, &vec, 1, len);
}


会不会是因为被阻塞了啊
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-3-3 01:29:26 | 显示全部楼层
tcpdump抓包也没问题...........
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表