клиент telnet не отвечает после recv()

Я только начинаю учиться кодировать сокет, но у меня проблема, которую я не могу решить.

поэтому я пытался создать клиент telnet, и мне удалось получить первое сообщение с сервера, но после этой строки получения моя программа как бы застряла и больше ничего не делает. даже не простая строка printf.

заранее спасибо, Рики

вот код:

#include <stdio.h>
#include <string.h>
#include <sys/socket.h>
#include <netinet/in.h>

void error_msg(char msg[256]){
    printf("error at %s\n", msg);
}

void main(){
    struct sockaddr_in serv_addr;
    char buffer[2048], server_reply[2048];
    printf("trying to connect to []...\n");

    int sockfd = socket(AF_INET, SOCK_STREAM, 0);
    if(sockfd<0) error_msg("socket");

    serv_addr.sin_family = AF_INET;
    serv_addr.sin_addr.s_addr = inet_addr("192.168.0.1");   
    serv_addr.sin_port = htons(23);

    int conn = connect(sockfd,(struct sockaddr *) &serv_addr,sizeof(serv_addr));
    if(conn<0) error_msg("connect");
    printf("connected to server\n");

    bzero(server_reply, 2048);
    bzero(buffer, 2048);

    while(1){
        int n_recv = recv(sockfd , server_reply , sizeof(server_reply) , 0);
        if(n_recv > 0){

            printf("%s", server_reply);
            sleep(1);

            scanf("%s" , buffer);
            int n_send = send(sockfd , buffer , sizeof(buffer), 0);
            if(n_send < 0) printf("send error, server is not responding...\n");     
        }
        if(n_recv < 0) printf("recv error, server is not responding...\n");
    }

    close(sockfd);
}

person user2657521    schedule 06.08.2013    source источник
comment
вы печатаете, когда это › 0, ‹ 0, но как насчет того, когда это 0? Поместите fprintf(STDERR (это важно) до и после вызова recv и после него, какой именно код возврата и errno установлены? Кроме того, как узнать, успешно ли вы получили сообщение от сервера?   -  person xaxxon    schedule 06.08.2013
comment
Если n_recv равно 0, вы будете в цикле занятости - ничего не будет напечатано. Кроме того, вы уверены, что какие-либо данные принимаются. Вы пробовали отслеживать трафик с помощью чего-то вроде Wireshark или tcpdump?   -  person sbaker    schedule 06.08.2013
comment
я проверил. возвращаемое значение равно 24, а не 0. с wirehark я потерял ответ от сервера сразу после recv() и перед send().   -  person user2657521    schedule 06.08.2013
comment
Не делайте send(sockfd, buffer, sizeof(buffer), 0), вместо этого вы должны сказать send(sockfd, buffer, strlen(buffer), 0). Также протокол telnet имеет некоторую инициализацию, которой необходимо следовать.   -  person ja_mesa    schedule 06.08.2013


Ответы (1)


Не зная точно, что такое возвращаемое значение, похоже, что удаленная сторона закрыла соединение:

http://linux.die.net/man/2/recv

The return value will be 0 when the peer has performed an orderly shutdown.

Посмотрите мой комментарий к вашему вопросу и опубликуйте эти данные, и я смогу помочь больше.

person xaxxon    schedule 06.08.2013
comment
Спасибо за ответы. я добавил немного printf, чтобы проверить возвращаемое значение, и оно не 0. это 24 (я полагаю, размер строки ответа сервера?). я также проверил с помощью wireshark, видимо, сервер перестал отвечать на мое соединение после recv() и перед send() - person user2657521; 06.08.2013
comment
Кроме того, вы не можете просто распечатать данные, полученные из recv - ничто не гарантирует, что они заканчиваются нулем. - person xaxxon; 06.08.2013