原始套接字发送和接收

时间:2018-12-16 07:14:42

标签: c linux sockets networking udp

仅出于学习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以防万一)。当我与客户端发送消息时,它永远不会收到回复。看来,当服务器将答复发送给客户端时,服务器本身会收到消息,而客户端却一无所获。

所以,我的问题是:是否可以通过原始套接字解决此问题?也就是说,要使服务器不接收自己的消息并阻止其他人接收它们?

谢谢!

1 个答案:

答案 0 :(得分:0)

我刚刚意识到这是校验和的问题...一旦我在UDP中获得了正确的校验和,客户端就正确接收了该数据包。

Wireshark给了我解决方案的线索。我看到校验和未经验证,因此我去了“编辑”>“首选项”>“协议”>“ UDP”>“如果可能的话,请验证UDP校验和”并进行检查。

希望有帮助