2012-11-22 4 views
1

C로 네트워킹하는 방법에 대한 예제를 많이 읽었습니다. SYN 플래그가있는 TCP 패킷이 와이어 (wireshark 포함)에 있음을 알 수 있지만 수신 측 (테스트 목적으로 가상 컴퓨터를 설정 함)은 RST가 아닌 아무 것도 보내지 않습니다.TCP : TCP 연결 설정

#include <stdio.h> 
#include <stdlib.h> 
#include <sys/types.h> 
#include <sys/socket.h> 
#include <netdb.h> 
#include <strings.h> 


int establish_tcp(int port) { 
    char *ip = "10.0.2.15"; /* Virtual Machine */ 
    struct sockaddr_in sockaddrin; 
    struct hostent *host; 
    int sock; 

    sock = socket(AF_INET, SOCK_STREAM, 0); 
    if(sock == -1) { 
     fprintf(stderr, "Socket Error\n"); 
     exit(1); 
    } 

    sockaddrin.sin_family = AF_INET; 

    host = gethostbyname(ip); 
    if(host == NULL) { 
     fprintf(stderr, "%s unknown host.\n", ip); 
     exit(2); 
    } 

    /* copies the internet address into the struct */ 
    bcopy(host->h_addr, &sockaddrin.sin_addr, host->h_length); 

    /* specify port (used by TCP a layer above */ 
    sockaddrin.sin_port = port; 

    /* try to connect */ 
    return connect(sock, (struct sockaddr*) &sockaddrin, sizeof(struct sockaddr_in)); 
} 

int main(void) { 
    printf("status: %i\n", establish_tcp(80)); 
    return 0; 
} 

패킷이 시간 초과되고 -1이 상태 코드로 반환 될 때까지 시간이 걸립니다. 대상 컴퓨터가 회신을 보내지 않는 이유는 무엇입니까? 나는 무엇을 간과 했는가?


나는 내가 그것을 하지 셋업 문제가 있음을 알아 낸 것 같아요. 우분투 12.04를 사용하고 있습니다. 가상 머신은 Debian Wheezy입니다. IP를 ifconfig으로 확인합니다. 기계가 telnet으로 연결할 수 있으면 시도했습니다.
가상 박스와 관련된 문제를 피하기 위해 IP를 Google로 대체하려고 시도했지만 동일한 결과가 나타났습니다.

+0

이 프로그램 자체에 대한보다 네트워크 설정에 대한 추가 질문입니다. 질문을 현재 테스트중인 환경에 대한 세부 정보로 업데이트하십시오. 대부분의 경우 연결할 수없는 IP 주소에 연결하려고 시도하고 있으며 그 이유는 다양합니다. –

+0

그리고 아마도 당신은 예를 들면 다음과 같은 것을 사용합니다. telnet 또는 netcat을 사용하여이 IP/포트에 먼저 연결하십시오. –

답변

3

가능성이 가장 높은 문제는 이것이다 :

sockaddrin.sin_port = port; 

포트 번호는 x86 및 x86_64의 기계의 기본 바이트 순서와 다른 네트워크 바이트 순서에 있어야한다.

변경에 :

sockaddrin.sin_port = htons(port); 
+2

좋은 지적. 그러나 단순히 난수의 닫힌 포트에 연결했다면 'RST'가 되돌아 오는 것을 관찰 할 수 있습니다. 따라서 IP에 도달 할 수 없거나 방화벽이 관련되어 있습니다. –

+0

대단히 감사합니다! 이제 포트 80에서 Google에 연결하는 TCP를 설정합니다. 폐쇄 된 항구에서 시간 제한을두고 살아야 할 것 같아요? – phineas

+1

다릅니다. 일반적으로 닫힌 포트에 연결하는 것은 즉시 실패합니다 (로컬 호스트에서 사용되지 않는 포트로 텔넷을 시도하십시오). 그러나 사용되지 않는 포트로 향하는 패키지를 방치하는 방화벽, 다양한 이유로 꽤 일반적인 설정이 있습니다. 그래서 기다려야합니다. –