2017-07-17 34 views
0

我有一个模块接收两部分的数据。首先是一个无符号整数,表示接下来将要跟随的数据的长度。然后是数据本身。我这样做如下无限循环kernel_recvmsg有时会得到错误的数据

unsigned int z; 
struct kvec vec; 
struct msghdr msg; 
while(1) { 
    memset(&vec, 0, sizeof(vec)); 
    memset(&msg, 0, sizeof(msg)); 
    vec.iov_base = &z; 
    vec.iov_len = sizeof(unsigned int); 

    ret = kernel_recvmsg(client_socket, &msg, &vec, 1, vec.iov_len, 0); 
    if(!z) 
     break; 
    data = kmalloc(z, GFP_KERNEL); 
    if(!data) 
     break; 
    memset(&vec, 0, sizeof(vec)); 
    memset(&msg, 0, sizeof(msg)); 
    vec.iov_base = data; 
    vec.iov_len = z; 
    ret = kernel_recvmsg(client_socket, &msg, &vec, 1, vec.iov_len, 0); 
    ... 
    ... 
    kfree(data); 
} 

编辑:我正因为不完整的接收错误的数据。我的回复< vec.iov_len。有没有办法解决这个问题?

谢谢。

回答

0

我修改了它的标志。 这些链接将帮助

http://www.beej.us/guide/bgnet/output/html/multipage/recvman.html

http://elixir.free-electrons.com/linux/latest/source/include/linux/socket.h#L277

在第二个链接,你可以找到所有可用的标志和这些标志的一个子集的描述。我之前曾经使用flag字段作为0,这意味着没有特别的选择,通过将其更改为MSG_WAITALL,该命令在返回之前等待整个iov.len大小的消息。不完整的接收早已破坏我的数据。

+0

@Pang,谢谢你的回复。这足够吗? –

+0

如果整个消息永不到来会怎么样?你有没有想过?并可能测试它? – Malkocoglu

相关问题