0

我正在编写一个 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);
 }
} 
4

1 回答 1

2

对评论中引用的 TCP/IP Illustrated 表示敬意,但它有点陈旧。抓包工具 Wireshark 会很高兴地向您展示 UDP 校验和。

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

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

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

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

于 2013-09-05T18:24:00.857 回答