2015-01-04 3 views
0

클라이언트가 서버에 문자를 보내는 간단한 C UDP 클라이언트 및 서버를 작성했습니다. 모든게 똑같은 PC에서 잘 작동합니다. 그래서 저는 원격 PC에 인물을 보내고 싶었습니다. 불행히도 서버가 작동하지 않습니다. 서버는 wireshark를 사용하여 아무것도 수신하지 못하고 있습니다. 패킷이 올바른 대상으로 전달되고 있음을 알 수 있습니다. (servip 서버의 주소를 포함)C 원격 호스트의 UDP 클라이언트 및 서버

//client 
#include <stdio.h> 
#include <stdlib.h> 
#include <sys/types.h> 
#include <sys/socket.h> 
#include <string.h> 
#include <arpa/inet.h> 
#include <unistd.h> 

#define SERV_PORT 50000 
int main(){ 

    int id, s; 
    char buf; 
    char servip[] = "..."; 
    id = socket(AF_INET,SOCK_DGRAM,0); 
    buf = 'a'; 
    struct sockaddr_in servaddr; 
    memset((void *)&servaddr, 0, sizeof(servaddr)); 

    servaddr.sin_family = AF_INET; 
    servaddr.sin_port = htons(SERV_PORT); 
    inet_pton(AF_INET,servip, &servaddr.sin_addr); //controlla se minore di 0 

    s = sendto(id,&buf,sizeof(char),0,(struct sockaddr *) &servaddr,sizeof(servaddr)); 
    if (s == 0) 
    fprintf(stderr,"errore in sendto"); 

    return EXIT_SUCCESS; 
} 



//server 
#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <sys/types.h> 
#include <sys/socket.h> 
#include <arpa/inet.h> 
#include <unistd.h> 

#define SERV_PORT 50000 
int main(){ 
    int id, s; 
    unsigned int len; 
    char buf; 
    id = socket(AF_INET,SOCK_DGRAM, 0); 
    struct sockaddr_in addr; 
    memset((void *)&addr, 0, sizeof(addr)); 

    addr.sin_family = AF_INET; 
    addr.sin_addr.s_addr = htonl(INADDR_ANY); /* il server accetta pacchetti su 
    una qualunque delle sue interfacce di rete */ 
    addr.sin_port = htons(SERV_PORT); /* numero di porta del server */ 
    len = sizeof(addr); 

    bind(id, (struct sockaddr *) &addr, sizeof(addr)); 

    s = recvfrom(id,&buf,sizeof(char),0,(struct sockaddr *) &addr,&len); 

    printf("%c\n",buf); 

    if (s==0) 
    fprintf(stderr,"errore in recvfrom"); 



    return EXIT_SUCCESS; 
} 

아무도 도와 줄 수 : 여기

코드인가? 내가 도대체 ​​뭘 잘못하고있는 겁니까? 실제로 원격 호스트에서 작동하는 UDP 서버와 클라이언트의 예를 링크 해 주시겠습니까? 미리 감사드립니다.

+0

서버 IP로 무엇을 넣으시겠습니까? 이 원격 호스트는 어디에 있습니까? 메시지를 보내려는 호스트에서 원격 호스트로 핑 (ping) 할 수 있습니까? – Rush

+0

- 서버 IP로, whatsmyip.org에서 제공 한 IP를 사용합니다. - 기본적으로 내 PC를 서버로 사용하고 그의 친구의 PC를 클라이언트로 사용합니다. - 원격 호스트에 ping을 시도하지 않았습니다. 잠시 후 제안에 감사드립니다. – Simus

답변

0

나는 당신이 소스 주소와 포트를 설정하는 소켓에 bind하기를 원할 것입니다 의심 서버에서 수신합니까? 방화벽과 라우팅 문제를 제거하는 데 도움이됩니다.

+0

가능한 한 빨리 바인드를 삽입하고 알려 드리겠습니다 :) 감사합니다! – Simus

+0

@Simus 문제를 해결 했습니까? – macfij

+0

네, 라우터에 포트를 열었습니다. :) – Simus

1

먼저 "bind", "recvfrom"및 "sendto"의 모든 상태를 테스트해야하며 오류가 발생하면 둘 다 "-1"을 반환합니다. 양쪽, 클라이언트 및 서버. 또한 변수 전역 변수 errno의 상태를 확인하여 발생한 오류를 알아야합니다.

방화벽을 확인하십시오. 동일한 호스트에서 클라이언트와 서버를 사용하지 않는 경우에는 클라이언트와 서버에서 wireshark를 사용하십시오.

헤더에 errno를 추가하여 errno를 확인하십시오.

struct sockaddr_in myaddr; 
memset((char *)&myaddr, 0, sizeof(myaddr)); 
myaddr.sin_family = AF_INET; 
myaddr.sin_addr.s_addr = htonl(INADDR_ANY); 
myaddr.sin_port = htons(0); 

if (bind(fd, (struct sockaddr *)&myaddr, sizeof(myaddr)) < 0) { 
    perror("bind failed"); 
    exit (1); 
} 

와이어 샤크는 패킷이 전송 된 표시되는 경우, 당신이 또한 인 패킷을 보여줍니다 확인할 수 있습니다

#include <errno.h> 

. 
. 
. 
if (sendto(id,&buf,sizeof(char),0,(struct sockaddr *) &servaddr,sizeof(servaddr))== -1) { 
int errsv = errno; 
printf("sendto() failed\n"); 
if (errsv == ...) { ... } 
} 
.