2013-05-11 1 views
0

У меня проблема связи с двумя программами на C (как всегда клиент и сервер). Моя проблема в том, когда я хочу использовать определенный IP-адрес (мой IP-адрес), связь между ними не сработала. При этом моя программа работает: addr.sin_addr.s_addr = htonl(INADDR_ANY); Но в данный момент я меняю эту строку на: addr.sin_addr.s_addr = inet_addr(ip); У меня проблема связи, поэтому я думаю, что проблема в ip-адресе, который я использую. Я получаю свой Ip-адрес с помощью этой команды: /sbin/ifconfig | grep inet Так что я не вижу, где моя ошибка. Мой client.c:Connexion с адресом id ip-socket

int client_conversation(int port) { 
    struct sockaddr_in addr; 
    int s,c,r; 
    char tampon[SIZE]; 
    char *ip = "XXX.XXX.X.XX"; 
    struct hostent *nameHost; 

    nameHost = gethostbyname("localhost"); 
    if(nameHost == NULL) { 
    fprintf(stderr,"%s: host inconnue\n","localhost"); 
    exit(1); 
    } 
    s = socket(PF_INET,SOCK_STREAM,0); 
    if(s == -1) { 
    perror("socket: "); 
    exit(1); 
    } 
    addr.sin_family = AF_INET; 
    addr.sin_port = htons(port); 
    /**addr.sin_addr.s_addr = htonl(INADDR_ANY);*/ 
    addr.sin_addr.s_addr = inet_addr(ip); 
    memcpy(&(addr.sin_addr.s_addr),nameHost->h_addr_list[0],nameHost->h_length); 
    c = connect(s,(struct sockaddr *)&addr,sizeof(struct sockaddr)); 
    if(c == -1) { 
    fprintf(stderr,"Connexion impossible\n"); 
    exit(1); 
    } 
    if((r = read(s,tampon,SIZE)) > 0) { 
    write(1,tampon,r); 
    } 
    close(s); 
    return 0; 
} 

Мой server.c:

int serveur_conversation(int port) { 
    struct sockaddr_in addr; 
    int s,l,a; 
    socklen_t m; 
    char *message = "salut"; 
    char *ip = "XXX.XXX.X.XX"; 
    s = socket(PF_INET,SOCK_STREAM,0); 
    if(s == -1) { 
    perror("socket : "); 
    exit(1); 
    } 
    addr.sin_family = AF_INET; 
    addr.sin_port = htons(port); 
    /**addr.sin_addr.s_addr = htonl(INADDR_ANY);*/ 
    addr.sin_addr.s_addr = inet_addr(ip); 
    if(bind(s,(struct sockaddr *)(&addr),sizeof(addr)) == -1) { 
    perror("bind : "); 
    close(s); 
    exit(1); 
    } 
    l = listen(s,100); 
    if(l == -1) { 
    perror("listen :"); 
    exit(1); 
    } 
    do { 
    a = accept(s,(struct sockaddr *)(&addr),&m); 
    if(a == -1) { 
     perror("accept :"); 
     exit(1); 
    } 
    int pid = fork(); 
    if(pid == 0) { 
     if((write(a,message,strlen(message))) == -1) { 
    printf("Impossible d'envoyer le message\n"); 
    exit(1); 
     } 
     exit(1); 
    } 
    }while(1); 
    return 0; 
} 

Если кто-то видит ошибку, что я не вижу, скажите мне, пожалуйста!

+0

Итак, вопрос становится следующим: с каким IP вы связываетесь? (это 10.x.x.x или 192.168.x.x или еще?) И какова фактическая ошибка? –

+0

Я привязываюсь к этому IP: 192.168.X.XX, и фактическая ошибка: когда я пытаюсь подключить клиента к серверу, у меня есть сообщение об ошибке (я печатаю «Connexion невозможно», когда соединение ... невозможно!) у моего клиента. – afk

+0

Я думаю, что это называется связью. Just sayin ' – typ1232

ответ

0

Как я понимаю, на стороне клиента подключения к «локальный»

nameHost = gethostbyname("localhost"); 
... 
memcpy(&(addr.sin_addr.s_addr),nameHost->h_addr_list[0],nameHost->h_length); 

А на сайте сервера вы привязку к IP «XXX.XXX.X.XX»:

char *ip = "XXX.XXX.X.XX" 
... 
addr.sin_addr.s_addr = inet_addr(ip); 

на клиенте вы используете правильную форму, чтобы получить IP-адрес из локального сервера:

nameHost = gethostbyname("localhost"); 

Я думаю, что вы должны сделать то же самое на сервере так бот h используют один и тот же IP-адрес: «localhost» или фиксированный IP-адрес типа «192.168.1.25». Вот почему вы получаете отказ в подключении к клиенту.

Смежные вопросы