2016-04-14 2 views
0

У меня есть этот код, я запускаю клиент с виртуальной машины на том же ПК, на котором он может подключаться, но он никогда не получит сообщение LOGIN, что может быть причиной?tcp socket server не отправляет

Не уверен насчет отправки flags аргумент установлен вправо.

static const char *LOGIN = "LOGIN\n"; 

int main() 
{ 
    int s = socket(AF_INET, SOCK_STREAM, 0); 

    struct sockaddr_in addr; 
    socklen_t addrlen = sizeof(addr); 

    //initialize structure 
    bzero(&addr, addrlen); 
    addr.sin_family = AF_INET; 
    addr.sin_port = htons(6666); 
    addr.sin_addr.s_addr = htonl(INADDR_ANY); 

    bind(s, (struct sockaddr *)&addr, addrlen); 
    listen(s, 1); 

    struct sockaddr_in client_addr; 
    socklen_t client_addrlen = sizeof(client_addr); 
    int c = accept(s, (struct sockaddr *)&client_addr, &client_addrlen); 

    char *msg = new char[15]; 

     //print client address 
     char * buf = new char[16]; 
     inet_ntop(AF_INET, &(client_addr.sin_addr.s_addr), buf, 16); 
     cout << "Client connected: " << buf << endl; 
     cout << "---------------------" << endl; 

     send(c, LOGIN, sizeof(LOGIN), 0); 

    close(c); 
    close(s); 
    return 0; 
} 
+0

Хорошим началом является проверка на наличие ошибок. Все эти системные вызовы могут возвращаться с ошибкой (они возвращают значение '-1'), и в этом случае вы должны проверить [' errno'] (http://man7.org/linux/man-pages/man3/errno. 3.html), чтобы увидеть, что пошло не так. Вы можете использовать, например. ['perror'] (http://man7.org/linux/man-pages/man3/perror.3.html), чтобы распечатать сообщение или использовать [' strerror'] (http://man7.org/ linux/man-pages/man3/strerror.3.html), чтобы получить строку для печати из кода ошибки. –

ответ

3

Вы должны изменить:

static const char *LOGIN = "LOGIN\n"; 

к:

static const char LOGIN[] = "LOGIN\n"; 

и посыла вызова:

send(c, LOGIN, sizeof(LOGIN)-1, 0); 

Первоначальный вызов принят 4 (если на 32 -битной системы), потому что sizeof был прикладной а не на строку. -1 в фиксированной версии вычитает из строки завершающий '0'.

+2

Или просто используйте 'strlen' вместо этого. –

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