我正在编写一个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 的网络堆栈采用快捷方式。无论如何,如果可以的话,请在真实的互联网上进行测试。