[英]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.