c - recv 只获取包的前 4 个字节

标签 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++ 和套接字还比较陌生,所以可能有些东西我只是没看到。希望有人能帮我弄清楚出了什么问题?如有必要,我可以提供更多信息。

最佳答案

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

printfx 说明符以十六进制打印 unsigned int 参数。您平台上的整数可能是 32 位。所以你只打印前 4 个字节。

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

例如,我警告你我的 C 有点生疏(而且这不是执行此操作的最佳性能方法)......此外,这假设你的缓冲区始终是 sizeof(int) 的倍数,否则它会丢失一些数据:

nbyt = recv(sockfd, buf, BUFFERSIZE, 0);            
fprintf(file, "%s %d; %s\n", "Bytes received:", nbyt, "Message:");
for (offset = 0; offset < nbyt/sizeof(int); ++offset) {
    fprintf(file, "%x ", buf[offset]);
}
fprintf(file, "\n");

关于c - recv 只获取包的前 4 个字节,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14147173/

相关文章:

C:架构 x86_64 的重复符号

c - 双指针(struct tree_st **root)实际上是如何工作的?

python - Ubuntu 上 PIL 的问题

sockets - 带有选项卡的 Golang telnet 自动完成命令

c - 读/写原子性是否适用于多计算机内存?

c - C中实现Tree的指针问题

linux - 如何从 X session 之外(例如从控制台或 SSH)运行 X 程序

linux - 如何在与 ubuntu 中默认端口 6379 不同的端口上启动 redis-server

python - 类型错误 : 'module' object is not callable

Python 套接字客户端 SSL 连接