我正在编写一个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);
}
}
答案 0 :(得分:1)
在评论中引用了对TCP / IP Illustrated的称赞,但它有点老化。数据包捕获工具Wireshark将很高兴地向您展示UDP校验和。
您没有提及您的特定平台,但现在可以安全地假设它可能是Linux。民间传说(我没有参考)说它可能依赖于网络接口设备驱动程序,但根据我的经验,当你通过常规UDP套接字发送数据包时,总是会在Linux上添加UDP校验和。
您的代码尝试捕获它自己发送的数据包的方式有点奇怪。我调整了一些代码并使用netcat作为接收服务器。 我通过在客户端运行wireshark来验证UDP校验和是否存在且正确。
以下是稍加修改的代码http://pastebin.com/X9cgH1S3
的链接使用Linux进行localhost测试时,会失败。我的猜测是wireshark捕获套接字在流中的错误点(在计算校验和之前)或者localhost的网络堆栈获取快捷方式时获取数据包。无论如何,如果可以,请测试真正的互联网。