【问题标题】:Raw socket send and receive原始套接字发送和接收
【发布时间】:2018-12-16 07:14:41
【问题描述】:

只是为了学习 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 以防万一)。当我向客户端发送消息时,它永远不会收到回复。看来,当服务器向客户端发送回复时,服务器自己得到消息,而客户端什么也得不到。

所以,我的问题是:有没有办法用原始套接字解决这个问题?也就是让服务器不接收自己的消息,阻止别人接收?

提前致谢!

【问题讨论】:

    标签: c linux sockets networking udp


    【解决方案1】:

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

    Wireshark 为我提供了解决方案。我看到校验和没有被验证,所以我去编辑 > 首选项 > 协议 > UDP > 如果可能的话验证 UDP 校验和并检查它。

    希望对你有帮助

    【讨论】:

      猜你喜欢
      • 2023-03-17
      • 2010-11-05
      • 2014-09-18
      • 1970-01-01
      • 2010-11-14
      • 2016-02-21
      • 2013-04-01
      • 2011-03-15
      • 1970-01-01
      相关资源
      最近更新 更多