recvfrom()没有收到完整的缓冲区

时间:2019-08-21 09:04:41

标签: c sockets udp

在基于客户端-服务器体系结构的设置中,我的客户端通过UDP套接字发送数据,该套接字大小为116字节。但是在服务器端,该程序仅接收24个字节。任何帮助表示赞赏。

我尝试使用Wireshark捕获数据包。但是数据包看起来是完整的。但是在服务器(接收)端,缓冲区数据丢失。我怀疑我的recvfrom()错了

//Client sends data
uint32_t final_cmd[DISC_REQ_SIZE] = {0};
..
..
n = sendto(sockfd, (const char *) final_cmd, sizeof(final_cmd), 0,
            (struct sockaddr *) &serveraddr, ser_len);


//Server receives data
uint32_t buffer[BUFSIZE];
..
..
while(1)
{
    bzero(buffer, BUFSIZE);
    n = recvfrom(sockfd, buffer, BUFSIZE, 
            0, ( struct sockaddr *) &cliaddr, 
            &len); 
..
..

预期结果:服务器收到完整的116 B数据 实际结果:服务器仅接收24 B数据

1 个答案:

答案 0 :(得分:1)

recvfrom的第三个参数(长度)需要缓冲区的长度(以字节为单位),但是您正在传递元素数。

尝试更改

n = recvfrom(sockfd, buffer, BUFSIZE, ...

n = recvfrom(sockfd, buffer, sizeof buffer, ...

此外,在现代系统上,请勿使用bzero(已弃用),而是:

memset(buffer, 0, sizeof buffer);