gpt4 book ai didi

c - 在 C INET 套接字代码中启用 UDP 数据包校验和

转载 作者:行者123 更新时间:2023-11-30 15:46:04 24 4
gpt4 key购买 nike

我正在编写一个 UDP 客户端来连接到服务器并发送一些数据。我连接的服务器确保 UDP 数据包校验和正确。在我使用的文档中包含以下行:可选的 16 位校验和必须包含在 header 中

我只是想知道如何确保将其包含在内。这是到目前为止我的客户端代码:

#include <sys/socket.h>
#include <netinet/in.h>
#include <stdio.h>

#define ip_address "127.0.0.1"
#define port_num 32000

int main(int argc, char**argv)
{
int sockfd,n;
struct sockaddr_in servaddr,cliaddr;
char sendline[1000];
char recvline[1000];

sockfd=socket(AF_INET,SOCK_DGRAM,0);

bzero(&servaddr,sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr=inet_addr(ip_address);
servaddr.sin_port=htons(port_num);

while (fgets(sendline, 10000,stdin) != NULL)
{
sendto(sockfd,sendline,strlen(sendline),0,
(struct sockaddr *)&servaddr,sizeof(servaddr));
n=recvfrom(sockfd,recvline,10000,0,NULL,NULL);
recvline[n]=0;
fputs(recvline,stdout);
}
}

最佳答案

感谢评论中引用的 TCP/IP 插图,但它有点过时了。数据包捕获工具 Wireshark 会很高兴地向您显示 UDP 校验和。

您没有提及您的特定平台,但现在可以安全地假设它可能是 Linux。 Folklore(我没有引用资料)说它可能取决于网络接口(interface)设备驱动程序,但根据我的经验,当您通过常规 UDP 套接字发送数据包时,UDP 校验和总是添加在 Linux 上。

您的代码 try catch 自己发送的数据包的方式有点奇怪。我对代码做了一些修改,并使用 netcat 作为接收服务器。 我通过在客户端运行wireshark来验证UDP校验和是否存在且正确

这里是稍微修改过的代码的链接 http://pastebin.com/X9cgH1S3

买者自负,使用 Linux 在本地主机上进行测试将会失败。我的猜测是,wireshark 捕获套接字在流中的错误点获取数据包(在计算校验和之前),或者本地主机的网络堆栈采用了快捷方式。无论如何,如果可以的话,请在真实的互联网上进行测试。

关于c - 在 C INET 套接字代码中启用 UDP 数据包校验和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18639296/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com