recv只获取包的前4个字节

时间:2013-01-03 21:01:10

标签: c linux sockets udp

我正在用C ++编写客户端应用程序以通过UDP广播接收二进制数据,但是无论缓冲区大小如何,我都无法接收超过前4个字节的任何内容。我已经检查过Wireshark中的数据包,我可以看到我的机器正在接收大约1200字节的数据。当我将其与我的客户端收到的内容进行比较时,我可以看到我收到了数据包,但剩下的数据丢失了。这是我的代码:

#define BUFFERSIZE 4096
int main()
{
    struct addrinfo hints, *servinfo, *p;
    int sockfd, i, nbyt;

    int *buf = (int*) malloc(BUFFERSIZE);

    memset(&hints, 0, sizeof hints);
    hints.ai_family = AF_INET;
    hints.ai_socktype = SOCK_DGRAM;
    hints.ai_flags = AI_PASSIVE;

    getaddrinfo(NULL, "9011", &hints, &servinfo);

    sockfd = socket(servinfo->ai_family, servinfo->ai_socktype, servinfo->ai_protocol);
    bind(sockfd, servinfo->ai_addr, servinfo->ai_addrlen);

    FILE *file;
    file = fopen("file.txt", "w+");

    for (i=0;i<=45;i++)
    {
        nbyt = recv(sockfd, buf, BUFFERSIZE, 0);            
        fprintf(file, "%s %d; %s %x\n", "Bytes received:", nbyt, "Message:", *buf);
    }

    fclose(file);
    close(sockfd);
    free(buf);

    printf("%s\n", "Execution ended.");

    return 0;
}

我收到的一些数据的例子:

Bytes received: 1131; Message: 5b0
Bytes received: 1131; Message: 5b3
Bytes received: 1131; Message: 5b6
Bytes received: 1092; Message: 4e0

我尝试使用MSG_DONTWAIT标志将套接字设置为非阻塞,因为这解决了类似Python应用程序的问题,但这只会返回错误:

Bytes received: -1; Message: 0

我对C ++和套接字比较陌生,所以我可能没有看到它。希望有人可以帮我弄清楚什么是错的?如有必要,我可以提供更多信息。

2 个答案:

答案 0 :(得分:4)

你收到它就好了。您的调试代码没有按照您的想法执行。

x的{​​{1}}说明符以十六进制格式输出unsigned int参数。平台上的整数可能是32位。所以你只打印前4个字节。

如果你想用十六进制打印整个缓冲区,你需要自己编写循环(或者当然使用库)。

例如,我警告你我的C有点生锈(这是目前执行此操作的最佳方式)...此外,这假设您的缓冲区始终是sizeof(int)的倍数,或者它会丢失一些数据:

printf

答案 1 :(得分:1)

代码中的

*buf表示接收数据数组中的第一个整数,因此您只打印收到的UDP有效负载的四个第一个字节。