2011-04-07 97 views
0

我用C编写了一个简单的服务器应用程序。除了打印收到的消息之外,此服务器什么都不做,然后退出。下面是代码套接字远程连接问题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的所有端口上的服务器的本地IP设置为21000 http://img593.imageshack.us/img593/3959/schermata20110405a22492.png

端口20600似乎是开据canyouseeme.org/和yougetsignal.com/tools/open-ports/(其实我可以在一个数据包已经收到控制台)读取,但如果我跑

telnet 151.53.150.45 20600 

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

任何帮助?

+0

路由器经常有配置设置,告诉他们接受/拒绝ping,telnet等。你可以telnet或浏览到路由器,看看配置设置发生了什么? – 2011-04-07 18:04:17

+0

你已经问过这个 - http://stackoverflow.com/questions/5558042/remote-socket-connection-c。正如Emil在该主题中提到的那样,您可能想要查看http://superuser.com。这似乎不是特定于您的代码的问题。 – jwd 2011-04-07 18:05:32

回答

0

如果你打字:

telnet 151.53.150.45 20600 

从局域网而不是广域网,那么你的NAT最有可能不能正确处理发夹情况。这意味着它只希望你使用广域网的翻译地址。

解决方案是检查您是否可以更改NAT的配置,以便也可以在局域网上使用转换后的地址(有时候这是P2P系统的必需条件)。如果这些功能不可用,那么您需要一个新的NAT。