2016-11-22 3 views
0

У меня возникла проблема с использованием c connect() для открытия TCP-соединения с локальным сервером (я использую Ubuntu 16.04 на виртуальной машине, созданной с помощью VirtualBox). Пока я запускаю сервер, все в порядке, и он начинает прослушивать S_PORT. Когда клиент пытается открыть TCP-соединение с ним, используя connect(), программа останавливается, а errno - на 111 (соединение отклонено). Для получения дополнительной информации, я разместить код ниже: КодСоединение отказалось использовать c connect()?

клиента:

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; 
} 

Это код сервера:

#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; 
} 

Это экран Output

+0

Пожалуйста, переформатируйте свой код, он по сути не читается - однако я видел, что у вас нет «memset» вашего addr_serv в клиенте. Также напечатайте вывод отладки из обеих программ. – KevinDTimm

+0

Я изменил код. Надеюсь, теперь яснее. Кроме того, я вставляю экран вывода. –

ответ

0

Порт является неправильно. Вы привязываетесь к порту 3550 (0xdde), но затем вы печатаете версию с байтом без байтов 56845 (0xde0d). Затем вы пытаетесь подключиться к такому в клиенте.

Когда вы печатаете на сервере, вам нужно поменять его на собственный байтовый заказ (ntohs(addr_serv.sin_port)) или просто передать «3550» клиенту, так как именно на этом вы привязываетесь на сервере.

+0

Отлично! В самом деле, у меня есть процессор Intel, который использует соглашение с маленьким концом, я должен поменять его на собственный порядок байтов. Спасибо брат! –

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