仅出于学习C语言中原始套接字的目的,我正在编写一个使用原始套接字接收和发送消息的简单服务器。
我创建了套接字
if ((r_sock = socket(AF_INET, SOCK_RAW, IPPROTO_UDP))< 0){
perror("socket");
exit(-1);
}
然后我创建一个无限循环,开始接收,处理和回复
while(1){
if((n = recvfrom(r_sock, buffer, BUFLEN, 0, (struct sockaddr *) &client, &client_len))<0){
perror("recvfrom");
exit(-1);
}
// Discard messages not intended to the server
if(htons(udp->uh_dport) != my_port){
continue;
}
//Do whatever with the data received and then send reply to client
// ....
if((n = sendto(r_sock, udp, ntohs(udp->uh_len), 0, (struct sockaddr *) &client, client_len))<0){
perror("sendto");
exit(-1);
}
}
这里我没有显示每个变量的定义,但是为了完整起见,buffer是一个大小为BUFLEN(足够大)的char数组,而udp是指向缓冲区中正确位置的struct udphdr指针。
关键是我有另一个程序使用标准UDP套接字(SOCK_DGRAM)充当客户端,事实证明它可以正常工作(我也尝试使用netcat以防万一)。当我与客户端发送消息时,它永远不会收到回复。看来,当服务器将答复发送给客户端时,服务器本身会收到消息,而客户端却一无所获。
所以,我的问题是:是否可以通过原始套接字解决此问题?也就是说,要使服务器不接收自己的消息并阻止其他人接收它们?
谢谢!
答案 0 :(得分:0)
我刚刚意识到这是校验和的问题...一旦我在UDP中获得了正确的校验和,客户端就正确接收了该数据包。
Wireshark给了我解决方案的线索。我看到校验和未经验证,因此我去了“编辑”>“首选项”>“协议”>“ UDP”>“如果可能的话,请验证UDP校验和”并进行检查。
希望有帮助