2017-01-26 1 views
0

"Hello World"를 클라이언트에게 다시 보내는 매우 간단한 서버 프로그램을 만들었습니다. 텔넷을 사용하여 서버 (로컬 호스트)에 연결 했으므로 제대로 작동합니다. 이제는 인터넷을 통해 실행하고 작동하지 않으려 고합니다. 내 공용 IP 주소 (구글 검색)에 바인딩 해봤지만 작동하지 않습니다.`server_socket = socket (AF_INET, SOCK_STREAM, 0);C 언어로 작성된 TCP 서버가 인터넷에서 작동하지 않습니다.

serverAddr.sin_family = AF_INET; 
serverAddr.sin_port= htons(7892); 
serverAddr.sin_addr.s_addr = inet_addr("192.168.43.241");//htonl(INADDR_ANY);//INADDR_ANY;//inet_addr("157.48.97.106"); 

memset(serverAddr.sin_zero,'\0',sizeof serverAddr.sin_zero); 

bind(server_socket, (struct sockaddr *)&serverAddr,sizeof(serverAddr)); 

if(listen(server_socket,5)==0) 
    printf("listening\n"); 

addr_size=sizeof client_addr; 


printf("IP address is: %s\n", inet_ntoa(serverAddr.sin_addr)); 


while(1) 
{ 
    client_socket= accept(server_socket,(struct sockaddr *)&client_addr,&addr_size); 
    printf("Waiting\n"); 
    printf("client_socket %d\n",client_socket); 
    int pid=fork(); 
    if(pid>0) 
    { 
     printf("PID:%d\n",pid); 
     dup2(0,client_socket); 
    } 
    else 
    { 
     dup2(client_socket,0); 
     printf("%d %d\n",pid,client_socket); 
     send(client_socket,buffer,strlen(buffer),0); 
     printf("Message Sent\n"); 
     shutdown(client_socket,0); 
     close(client_socket); 
     perror("CLOSE"); 
     printf("Connection Closed\n"); 
     exit(0); 
    } 
}` 

답변

0

은 원칙적으로 모든 IPv4 주소에서 수신하는 (당신이 코멘트에있는 INADDR_ANY와 동일해야 함) 0.0.0.0에 바인딩 할 수 있습니다. 즉, 모든 네트워크 카드 (및 외부에서)의 연결뿐만 아니라 루프백 연결을 받아 들일 수 있습니다. 이것은 당신을 위해 일해야합니다 (잔여 프로그램이 루프백에서 안정적으로 작동한다고 가정).

같은 네트워크에있는 PC 외부에서 연결할 수없는 경우 방화벽 구성 문제가있을 가능성이 큽니다. 일부 OS는 기본적으로 허용하는 명시적인 방화벽 규칙이없는 경우 외부에서 들어오는 연결을 차단합니다.

인터넷에서 PC로 연결하려는 경우 NAT가있는 라우터를 통해 연결되어 있으면 올바르게 연결되도록 라우터를 구성해야합니다.

+0

OP는 라우팅 할 수없는 주소 인 192.168.43.241에 바인딩됩니다. 따라서 OP에서 방화벽 문제가 발생할 수 있다는 귀하의 관찰이 맞을 것입니다. OP에 라우팅 할 수없는 IP 주소가 무엇인지 설명 할 수 있습니까? –

+0

사실 저는 소켓 프로그래밍 (네트워크 프로그래밍)에서 초보자입니다. 192.168.43.241은 Google에서 검색 한 공개 사이트입니다. –

관련 문제