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. с wireshark загубих отговор от сървъра веднага след 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