2010-07-04 70 views
2

我打開ubuntu機器上的udp阻塞套接字,它成功(沒有錯誤返回)。Linux阻塞udp套接字不會收到

當從另一臺機器向該機器和端口發送數據時,接收並不違反,並在我看到的wireshark嗅探器和Icmp錯誤「端口不可達」中看到。

我雖然它可能是一個iptables的問題,並打開端口接受。

其他建議如何調試?

謝謝。

Timmy

+0

你爲什麼看到icmp錯誤端口無法訪問? ICMP和UDP是完全不同的東西。 – 2010-07-04 08:27:07

+0

Tom:http://en.wikipedia.org/wiki/ICMP_Destination_Unreachable – Timmy 2010-07-04 08:34:46

+0

Q.我看到Icmp錯誤「port unreachable」 A. ICMP不使用端口。 – 2010-07-04 09:22:35

回答

1

您應該顯示一個最小的測試用例。

你看到你的

sudo netstat -4lp 

過程?它的套接字綁定了什麼本地地址(由netstat報告)?

+0

嘗試了這一點,並在列表中返回有問題的套接字似乎並未出現。不過,我確實看到了我在程序中打開的其他套接字。 – Timmy 2010-07-04 10:53:13

+0

也許bind()失敗。你檢查它的返回值嗎?然後errno應該給你提示有什麼不對。 (狂猜)你是否嘗試綁定到沒有root權限的低端口? 請給我們看看代碼。 – 2010-07-04 11:10:04

+0

你的答案有助於發現錯誤。套接字被打開,然後由於未初始化的套接字描述符而關閉。非常感謝! – Timmy 2010-07-05 14:41:58

4

我通常使用netcat弄清楚,如果問題來自於網絡/防火牆或從自己的代碼

嘗試運行測試服務器netcat: 如。

nc -l -u -p 9999 

將打開並監聽的UDP套接字,端口9999

現在,你可以嘗試使用

nc -u <ipaddress> 9999 

然後輸入一些東西,看到從相同或從另一臺計算機發送一個數據包如果它到達第一臺電腦。

netcat中還有很多其他很酷的東西,請看手冊。

+0

好主意,謝謝!做了它,我看到了傳入的數據,所以它可能是與套接字有關的東西。問題是什麼?因爲打開並綁定時沒有錯誤返回... – Timmy 2010-07-04 10:51:14

+0

哼哼試着發表你的代碼 – Ben 2010-07-04 14:00:37

2

您是否使用bind()正確地將套接字綁定到本地端口?

您是否記得通過htons()將本地端口號碼轉換爲網絡字節順序?

bind()返回什麼值?

0

試試這個簡單的服務器,看看它是否適合你:

#include <sys/socket.h> 
#include <arpa/inet.h> 
#include <netinet/in.h> 
#include <err.h> 
#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <unistd.h> 

#define BUFSZ 4096 
#define PORTNUM 1099 
char buffer[BUFSZ]; 

int main(int argc, char* argv[]) 
{ 
    int fd; 
    struct sockaddr_in servaddr, cliaddr; 
    socklen_t clilen = sizeof(cliaddr); 
    ssize_t nread; 

    if ((fd = socket(AF_INET, SOCK_DGRAM, 0)) == -1) 
     err(1, "socket"); 

    bzero(&cliaddr, sizeof(cliaddr)); 
    bzero(&servaddr, sizeof(servaddr)); 

    servaddr.sin_family = AF_INET; 
    servaddr.sin_addr.s_addr = htonl(INADDR_ANY); 
    servaddr.sin_port = htons(PORTNUM); 

    if (bind(fd, (struct sockaddr*)&servaddr, sizeof(servaddr)) == -1) 
     err(1, "bind"); 

    printf("bound to %s:%d\n", inet_ntoa(servaddr.sin_addr), 
     ntohs(servaddr.sin_port)); 

    while ((nread = recvfrom(fd, buffer, BUFSZ, 0, 
     (struct sockaddr*)&cliaddr, &clilen)) != -1) 
    { 
     printf("received %lu bytes from %s:%d\n", nread, 
      inet_ntoa(cliaddr.sin_addr), 
      ntohs(cliaddr.sin_port)); 
    } 

    return 1; 
} 

查看是否所有必要的步驟都沒有在你的代碼。