0

我用 C 编写了一个简单的服务器应用程序。这个服务器除了打印接收到的消息之外什么都不做,然后退出。这是代码

int listenfd,connfd,n;
struct sockaddr_in servaddr,cliaddr;
socklen_t clilen;

char *mesg = (char*) malloc(1000*sizeof(char));

listenfd=socket(PF_INET,SOCK_STREAM,0);

bzero(&servaddr,sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = INADDR_ANY;
servaddr.sin_port=htons(20600);

bind(listenfd,(struct sockaddr *)&servaddr,sizeof(servaddr));

listen(listenfd,5);

clilen=sizeof(cliaddr);
connfd = accept(listenfd,(struct sockaddr *)&cliaddr,&clilen);


n = (int) recvfrom(connfd,mesg,1000,0,(struct sockaddr *)&cliaddr,&clilen);
sendto(connfd,mesg,n,0,(struct sockaddr *)&cliaddr,sizeof(cliaddr));
printf("-------------------------------------------------------\n");
mesg[n] = 0;
printf("Received the following:\n");
printf("%s\n",mesg);
printf("-------------------------------------------------------\n");


close(connfd);
close(listenfd);

我设法使用 telnet 建立连接并运行

telnet 192.168.1.2 20600

其中 192.168.1.2 是服务器的本地 IP。该机器在路由器 ZyXel p-660HW-61 (192.168.0.1) 后面运行。问题是如果我指定机器的公共 ip (151.53.150.45),我无法访问服务器。我将 NAT 配置设置为从 20000 到 21000 的所有端口上的服务器本地 ip http://img593.imageshack.us/img593/3959/schermata20110405a22492.png

根据 canyouseeme.org/ 和 yougetsignal.com/tools/open-ports/ 的说法,端口 20600 似乎是打开的(实际上我可以在控制台中读到已收到数据包),但如果我运行

telnet 151.53.150.45 20600

我收到“拒绝连接”错误。防火墙在路由器和服务器机器上都被禁用(即相同的运行 telnet)。

有什么帮助吗?

4

1 回答 1

0

如果您正在输入:

telnet 151.53.150.45 20600

来自 LAN 而不是来自 WAN,那么您的 NAT 很可能无法正确处理发夹情况。这意味着它只希望您使用来自 WAN 的转换地址。

解决方案是检查您是否可以更改 NAT 的配置以启用 LAN 上的转换地址的使用(有时这是 P2P 系统的要求)。如果这些功能不可用,那么您需要一个新的 NAT。

于 2011-04-13T19:17:40.160 回答