2011-04-07 3 views
0

C에서 간단한 서버 응용 프로그램을 작성했습니다.이 서버는받은 메시지를 인쇄 한 다음 종료합니다. 여기에 내가 192.168.1.2 서버의 로컬 IP가 어디에 텔넷을 사용하고소켓 원격 연결 문제 C

telnet 192.168.1.2 20600 

를 실행하는 연결을 설정하는 관리되는 코드

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); 

입니다. 기계는 라우터 ZyXel p-660HW-61 (192.168.0.1) 뒤에 있습니다. 문제는 컴퓨터의 공용 IP (151.53.150.45)를 지정하면 서버에 연결할 수 없다는 것입니다. 내가 21000 http://img593.imageshack.us/img593/3959/schermata20110405a22492.png

포트 20600에 20000에서 모든 포트에서 서버 로컬 IP에 NAT 구성을 설정 사실 (canyouseeme.org/ 및 yougetsignal.com/tools/open-ports/에 따라 공개 될 것으로 보인다 콘솔에서 패킷을 받았음을 읽을 수는 있지만 실행하면

"Connection Refused"오류가 발생합니다. 라우터와 서버 컴퓨터 (동일한 실행 텔넷)에서 방화벽이 비활성화되어 있습니다.

어떤 도움이 필요합니까?

+0

라우터에는 핑 (ping), 텔넷 (telnet) 등을 받아들이거나 거부하도록 설정하는 설정이 있습니다. 텔넷을 사용하거나 라우터를 검색하여 설정 설정을 확인하십시오. –

+0

이미 물었습니다 - http://stackoverflow.com/questions/5558042/remote-socket-connection-c. Emil이 해당 스레드에서 언급 했으므로 http://superuser.com을 확인해보십시오. 이것은 귀하의 코드에 특정한 문제가 아닌 것 같습니다. – jwd

답변

0

당신이 입력하는 경우 : LAN에서보다는 WAN에서

telnet 151.53.150.45 20600 

, 다음 NAT는 아마 제대로 머리 핀의 자형으로 상황을 처리하지 않습니다. 즉, WAN에서 변환 된 주소 만 사용해야합니다.

해결 방법은 LAN의 변환 된 주소를 사용할 수 있도록 NAT 구성을 변경할 수 있는지 여부를 확인하는 것입니다 (P2P 시스템의 경우 가끔 필요합니다). 이러한 기능을 사용할 수없는 경우 새 NAT가 필요합니다.