2014-09-07 4 views
1

저는 UDP 소켓을 처음 사용하기 때문에 이전에 TCP로 작업했습니다. 내 클라이언트가 내 서버에 연결할 수없는 것 같지만 문제가 어디에 있는지 알 수 없습니다.UDP 소켓 (DGRAM) 바인드/sendto 오류

내 서버를 실행하면 정상적으로 작동하는 것 같습니다. 컴파일없이 문제없이 실행하고 클라이언트의 메시지를 기다립니다.

반면 클라이언트가 문제없이 컴파일되지만 런타임에 bind()에서 오류가 발생합니다. 나는 다른 곳에서 바인드가 항상 필요하지 않기 때문에 내가 그것을 제거하려고 시도했음을 보았습니다. 그러나 이것을 할 때 sendto()에 에러가 나타납니다. 문제를 찾으려고 perror()를 사용합니다. 바인드에서 메시지는 "Address already in use"이고 sendto에서는 "프로토콜에 의해 지원되지 않는 주소 패밀리"입니다.

내 접근 방식이 잘못되었는지 알 수 없습니다. 나는 그것을하기 위해 몇 가지 방법을 시도했지만 아무것도 작동하지 않는 것 같습니다. 어떤 도움이라도 대단히 감사하겠습니다.

서버 코드 :

int main(){ 
    int sockfd, newsockfd; 
    int portno; 
    socklen_t tamcli; 
    struct sockaddr_in dest, sa; 
    char* mensaje; 

    bzero((char *) &dest, sizeof(dest)); 
    portno = 5001; 
    mensaje = (char*)malloc(sizeof(char)*100); 

    sockfd = socket(PF_INET, SOCK_DGRAM, 0); 
    if (sockfd < 0){ 
     printf("ERROR al abrir socket\n"); 
     perror("sockto"); 
     exit(1); 
    } 

    dest.sin_family = AF_INET; 
    dest.sin_port = htons(portno); 
    dest.sin_addr.s_addr = INADDR_ANY; 
    tamcli = sizeof(sa); 

    if (bind(sockfd, (struct sockaddr *) &dest, sizeof(dest)) < 0){ 
     printf("ERROR en enlazar\n"); 
     perror("bind"); 
     exit(1); 
    } 


    newsockfd = recvfrom(sockfd, mensaje, sizeof(mensaje), 0,(struct sockaddr *)&sa, &tamcli); 
    if (newsockfd < 0){ 
     printf("ERROR en aceptar el mensaje\n"); 
     perror("recvfrom"); 
     exit(1); 
    } 

    printf("El mensaje del cliente fue: %s\n", mensaje); 

    close(sockfd); 
} 

클라이언트 코드 :

int main(){ 
    int sockfd, newsockfd; 
    int portno; 
    socklen_t tamcli; 
    struct sockaddr_in dest, sa; 
    char* mensaje; 

    bzero((char *) &dest, sizeof(dest)); 
    portno = 5001; 
    mensaje = (char*)malloc(sizeof(char)*100); 
    tamcli = sizeof(sa); 

    mensaje = "Hola"; 

    sockfd = socket(PF_INET, SOCK_DGRAM, 0); 
    if (sockfd < 0){ 
     printf("ERROR al abrir socket\n"); 
     perror("socket"); 
     exit(1); 
    } 

    dest.sin_family = AF_INET; 
    dest.sin_port = htons(portno); 
    if (inet_aton("127.0.0.1", &dest.sin_addr) == 0){ 
     printf("Error conectandose a la direccion"); 
     perror("inet_aton"); 
     exit(1); 
    } 

    if (bind(sockfd, (struct sockaddr *) &dest, sizeof(dest)) < 0){ 
     printf("ERROR en enlazar\n"); 
     perror("bind"); 
     exit(1); 
    } 


    newsockfd = sendto(sockfd, mensaje, sizeof(mensaje), 0, (struct sockaddr *) &sa, tamcli); 
    if (newsockfd < 0){ 
     printf("ERROR en enviar el mensaje\n"); 
     perror("sendto"); 
     exit(1); 
    } 

    close(sockfd); 
} 
+0

"이미 사용중인 주소"일반적으로 사용하려는 포트가 이미 사용된다는 것을 의미한다 :

또한 sendto를()로 인수가 잘못 보면,으로 정의된다. –

+0

이러한 우드 서버 및 클라이언트의 예를 살펴보십시오. http://www.cs.ucsb.edu/~almeroth/classes/W01.176B/hw2/examples/udp-server.c 및 http : // www. cs.ucsb.edu/~almeroth/classes/W01.176B/hw2/examples/udp-client.c –

+0

@ Gaetano 덕분에, 예제가 실제로 나를 도왔습니다 – aponcedeleonch

답변

1

당신은 모두 당신의 클라이언트와 서버 프로그램 (동일한 컴퓨터에서) 같은 포트에 바인딩 할 수 없습니다 - 단 하나의 그 끝점을 소유 할 수 있습니다.

ssize_t sendto(int s, const void *msg, size_t len, int flags, 
       const struct sockaddr *to, socklen_t tolen); 
+0

죄송합니다. 내 늦은 대답은 .. 예, 그것은 항구였습니다. 서버와의 연결을 위해 올바른 구조체를 채우지 못했습니다 .. dest를 채우고 있었고 sa가되어야했습니다 ... 나는 그것을 바꿨고 완벽하게 작동했습니다. – aponcedeleonch