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



我正在编写一个UDP客户端来连接到服务器并发送一些数据。我要连接的服务器可确保 UDP 数据包校验和正确。在我使用的文档中,包括以下行:The optional 16 bit checksum must be included in the 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。民间传说(我没有参考资料)说它可能取决于网络接口设备驱动程序,但根据我的经验,当您通过常规 UDP 套接字发送数据包时,UDP 校验和总是在 Linux 上添加的。

您的代码尝试捕获自己发送的数据包的方式有点奇怪。我稍微调整了一下代码,并使用netcat作为接收服务器。我通过在客户端运行 wireshark 来验证 UDP 校验和是否存在且正确

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

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

最新更新