2016-11-22 6 views
0

Ich stieß auf ein Problem mit dem c connect() zum Öffnen einer TCP-Verbindung mit dem lokalen Server (Ich benutze Ubuntu 16.04 auf einer virtuellen Maschine mit VirtualBox). Während ich den Server starte, ist alles in Ordnung und es hört auf S_PORT. Wenn der Client versucht, eine TCP-Verbindung mit connect() zu öffnen, wird das Programm beendet und errno wird auf 111 gesetzt (Connection refused). Für weitere Informationen schreiben ich den Code unten:Verbindung abgelehnt mit dem c connect()?

Kunden Code:

int main(int argc,char* argv[]){ 

    int sock_cli; 
    int err; 
    unsigned short port = 0; 

    struct in_addr addr; 
    struct sockaddr_in addr_serv; 
    struct hostent* ptr = NULL; 
    messaggio* m = (messaggio*)malloc(sizeof(messaggio)); 

    /* Opening socket */ 
    sock_cli = socket(PF_INET,SOCK_STREAM,0); 

    if(sock_cli == -1){ 
     printf(" (client) problem with socket() function \n"); 
     return -1; 
    } 
    else printf(" (client) socket open successfully, fd: %d \n",sock_cli); 

    #ifdef _ARG 
    printf(" (client) argc : %d \n",argc); 
    for(int i=0;i<argc;i++) printf(" (client) argv[%d] = %s \n",i,argv[i]); 
    #endif 

    /* Set address/port */ 
    if(argc == 3){ 
     if(!strcmp(argv[1],"localhost")){ 
      ptr = gethostbyname("localhost"); 
     } 
     else inet_aton(argv[1],&addr); 
     port = atoi(argv[2]); 

     #ifdef _DEBUG 
     printf(" (client) port %d \n",port); 
     #endif 
    } 
    else{ 
     printf(" (client) few arguments, args = [host] [port] \n"); 
     return -1; 
    } 

    /* Set addr_serv */ 
    addr_serv.sin_family = AF_INET; 
    addr_serv.sin_port = htons(port); 
    memcpy(&addr_serv.sin_addr.s_addr,ptr->h_addr,ptr->h_length); 
    memset(addr_serv.sin_zero,'\0',sizeof(addr_serv.sin_zero)); 

    err = connect(sock_cli,(struct sockaddr*)&addr_serv,sizeof(addr_serv)); 

    if(err == -1){ 
     printf(" (client) connect() failed %d \n",errno); 
     return -1; 
    } 
    else printf(" (client) connect() open successfully \n"); 

    m->type = 1; 
    m->a = rand() % 10 + 1; 
    m->b = rand() % 10 + 1; 

    if(send(sock_cli,(void*)m,sizeof(messaggio)-sizeof(long),0) > 0){ 
     printf(" (client) couple send (%d,%d) \n",m->a,m->b); 
    } 

    recv(sock_cli,(void*)m,sizeof(messaggio)-sizeof(long),0); 

    #ifdef _DEBUG 
    printf(" (client) msg received, product: %d \n",m->prod); 
    #endif 

    close(sock_cli); 
    free(m); 
    return 0; 
} 

Dieser Code der ist Server:

#define S_PORT 3550 
#define N_CLI 5 

int main(){ 

    int sock_serv; // server socket 
    int sock_cli; // client socket 
    unsigned int sin_size; 
    int err; 

    struct sockaddr_in addr_serv; 
    struct sockaddr_in addr_cli; 
    messaggio* m = (messaggio*)malloc(sizeof(messaggio)); 

    /* Opening socket */ 
    sock_serv = socket(PF_INET,SOCK_STREAM,0); 

    if(sock_serv == -1) { 
      printf(" (server) problem with socket() function \n"); 
      return -1; 
    } 
    else printf(" (server) socket open successfully, fd: %d \n",sock_serv); 

    /* Set addr_serv */ 
    addr_serv.sin_family = AF_INET; 
    addr_serv.sin_port = htons(S_PORT); 
    addr_serv.sin_addr.s_addr = htonl(INADDR_ANY); 
    memset(addr_serv.sin_zero,'\0',sizeof(addr_serv.sin_zero)); 

    /* Bind */ 
    err = bind(sock_serv,(struct sockaddr*)&addr_serv,sizeof(addr_serv)); 

    if(err == -1){ 
      printf(" (server) bind() failed \n"); 
      return -1; 
    } 
    else printf(" (server) bind() ok, address 'localhost', port %d \n",addr_serv.sin_port);  

    /* Listen */ 
    err = listen(sock_serv,N_CLI); 

    if(err == -1) { 
      printf(" (server) listen() failed \n"); 
      return -1; 
    } 
    else printf(" (server) listening \n"); 

    /* Accept */ 
    sin_size = sizeof(addr_cli); 
    sock_cli = accept(sock_serv,(struct sockaddr*)&addr_cli,&sin_size); 

    if(sock_cli == -1){ 
      printf(" (server) no connection open \n"); 
      return -1; 
    } 
    else printf(" (server) connection open with client, sock_cli: %d \n",sock_cli);  

    recv(sock_cli,(void*)m,sizeof(messaggio)-sizeof(long),0); // bloccante 

    m->prod = (m->a)*(m->b); 

    send(sock_cli,(void*)m,sizeof(messaggio)-sizeof(long),0); 

    close(sock_cli); 

    printf(" (server) connection close \n"); 

    close(sock_serv); 
    free(m); 
    return 0; 
} 

Dies ist ein Bildschirm des Output

+0

bitte formatieren Sie Ihren Code, es ist im Wesentlichen unlesbar - aber ich habe gesehen, dass Sie Ihre addr_serv nicht im Client "memset". Drucken Sie außerdem die Debugausgabe von beiden Programmen. – KevinDTimm

+0

Ich habe den Code geändert. Ich hoffe jetzt ist es klarer. Außerdem füge ich einen Bildschirm der Ausgabe ein. –

Antwort

0

Der Hafen ist falsch. Sie binden an Port 3550 (0xdde), aber dann Drucken Sie die nicht Byte-vertauschte Version 56845 (0xde0d). Dann versuchen Sie, eine Verbindung mit dem Client herzustellen.

Wenn Sie auf dem Server drucken, müssen Sie zurück in die native Byte-Reihenfolge (ntohs(addr_serv.sin_port)) oder einfach "3550" an den Client übergeben, da das ist, was Sie auf dem Server binden.

+0

Großartig! In der Tat habe ich eine Intel-CPU, die die Little-Endian-Konvention verwendet, ich muss zurück in die native Byte-Reihenfolge wechseln. Dank bro! –

Verwandte Themen