我正在用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和套接字比较陌生,所以我可能没有看到它.希望有人可以帮我弄清楚什么是错的?如有必要,我可以提供其他信息.
解决方法:
你收到它就好了.您的调试代码不会按照您的想法执行.
printf的x说明符以十六进制格式输出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-3,linux,sockets,udp 来源: https://codeday.me/bug/20190826/1724582.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。