2013-05-11 212 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:連接與id地址ip - 套接字

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或者其他?)什麼是實際的錯誤? – 2013-05-11 19:53:35

+0

我綁定到這個IP:192.168.X.XX,實際的錯誤是:當我嘗試連接客戶端到服務器,我有一個錯誤消息(我打印「Connexion不可能」,當連接是.. 。不可能!)在我的客戶端。 – afk 2013-05-11 19:56:55

+0

我認爲它被稱爲連接。只是說' – typ1232 2013-05-11 20:10:46

回答

0

在我看來,在客戶端連接到了「localhost」的

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」或像「192.168.1.25」這樣的固定常量IP。 這就是爲什麼你要在客戶端拒絕連接。