我打開ubuntu機器上的udp阻塞套接字,它成功(沒有錯誤返回)。Linux阻塞udp套接字不會收到
當從另一臺機器向該機器和端口發送數據時,接收並不違反,並在我看到的wireshark嗅探器和Icmp錯誤「端口不可達」中看到。
我雖然它可能是一個iptables的問題,並打開端口接受。
其他建議如何調試?
謝謝。
Timmy
我打開ubuntu機器上的udp阻塞套接字,它成功(沒有錯誤返回)。Linux阻塞udp套接字不會收到
當從另一臺機器向該機器和端口發送數據時,接收並不違反,並在我看到的wireshark嗅探器和Icmp錯誤「端口不可達」中看到。
我雖然它可能是一個iptables的問題,並打開端口接受。
其他建議如何調試?
謝謝。
Timmy
您應該顯示一個最小的測試用例。
你看到你的
sudo netstat -4lp
過程?它的套接字綁定了什麼本地地址(由netstat報告)?
我通常使用netcat
弄清楚,如果問題來自於網絡/防火牆或從自己的代碼
嘗試運行測試服務器netcat
: 如。
nc -l -u -p 9999
將打開並監聽的UDP套接字,端口9999
現在,你可以嘗試使用
nc -u <ipaddress> 9999
然後輸入一些東西,看到從相同或從另一臺計算機發送一個數據包如果它到達第一臺電腦。
netcat中還有很多其他很酷的東西,請看手冊。
您是否使用bind()
正確地將套接字綁定到本地端口?
您是否記得通過htons()
將本地端口號碼轉換爲網絡字節順序?
bind()
返回什麼值?
試試這個簡單的服務器,看看它是否適合你:
#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;
}
查看是否所有必要的步驟都沒有在你的代碼。
你爲什麼看到icmp錯誤端口無法訪問? ICMP和UDP是完全不同的東西。 – 2010-07-04 08:27:07
Tom:http://en.wikipedia.org/wiki/ICMP_Destination_Unreachable – Timmy 2010-07-04 08:34:46
Q.我看到Icmp錯誤「port unreachable」 A. ICMP不使用端口。 – 2010-07-04 09:22:35