2014-11-06 2 views
0

소켓을 통해 두 프로세스간에 통신하기 위해 C 프로그램을 작성 중이며 연결 함수 호출에 다음 오류가 표시됩니다.C - 연결 함수 - 잘못된 인수 오류

연결 :: 잘못된 인수 내가 연결하기 위해 호출 실종 무엇

? 도움이 될 것입니다.

내 코드입니다 -

void conn(char *hname) 
{ 
    struct hostent *hp; 
    struct sockaddr_in sin; 
    int port = 10000; 
    int s, rc; 

    hp = gethostbyname(hname); 
    if (hp == NULL) { 
     fprintf(stderr, "host not found (%s)\n", hname); 
     exit(1); 
    } 

    s = socket(AF_INET, SOCK_STREAM, 0); 
    if (s < 0) { 
     perror("socket:"); 
     exit(left); 
    } 

    sin.sin_family = AF_INET; 
    sin.sin_port = htons(port); 
    memcpy(&sin.sin_addr, hp->h_addr_list[0], hp->h_length); 

    rc = connect(s, (struct sockaddr *)&sin, sizeof(sin)); 
    if (rc < 0) { 
     perror("connect:"); 
     exit(rc); 
    } 
} 
+1

오류가 모두 발생합니까? 자세한 내용을 보려면 clang으로 컴파일 해보십시오. – drum

+2

당신의 코드를 가져 와서'char hname [] = "google.com"'을 추가하고 포트를'80'으로 변경하고 성공적으로 구글에 연결할 수있었습니다 ... 이것은 우분투 리눅스 14.04에서 이루어졌습니다. – TonyB

+1

'struct sockaddr_in'에는 5 개의 필드가 있습니다. 넌 세 명만 채우고있어. 나는 보통 그것을 사용하기 전에 0으로 memset한다. – user3386109

답변

4

struct sockaddr_in 인스턴스 예는,

리눅스에
struct sockaddr_in sin; 
memset(&sin, '\0', sizeof(sin)); 

는 EINVAL이 connect(2)에 실패한 호출 후 errno에 대한 가능한 값이 아닌, 0으로 초기화한다 . 어떤 OS를 사용하고 있습니까?

socket의 첫 번째 인수는 프로토콜 패밀리입니다. 역사적으로 BSD에서 여러분이 사용하게 될 상수는 대신 PF_INET이 될 것입니다. 실제로 그것들은 같은 가치 였고 최소한 RHEL 6에서는 더 이상 하나의 상수 만 존재하게됩니다. 하지만 BSD 시스템에 있다면 PF_INET을 사용해야 할 것입니다.