簡體   English   中英

原始套接字發送和接收

[英]Raw socket send and receive

僅僅為了學習CI中的原始套接字,我編寫了一個使用原始套接字來接收和發送消息的簡單服務器。

我創建套接字

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以防萬一)。 當我與客戶端發送消息時,它永遠不會收到回復。 看來,當服務器將答復發送給客戶端時,服務器本身會收到消息,而客戶端卻什么也沒有。

因此,我的問題是:是否可以使用原始套接字解決此問題? 也就是說,要使服務器不接收自己的消息並阻止其他人接收它們嗎?

提前致謝!

我剛剛意識到這是校驗和的問題...一旦我在UDP中獲得了正確的校驗和,客戶端便正確接收了該數據包。

Wireshark給了我解決方案的線索。 我看到校驗和未經驗證,因此我去了“編輯”>“首選項”>“協議”>“ UDP”>“如果可能的話,請驗證UDP校驗和”並進行檢查。

希望能幫助到你

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM