2011-04-07 539 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。