2013-08-06 3 views
0

Я только начинаю изучать, как кодовое сокет, но с проблемой я не могу решить.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); 
} 
+1

Вы печатаете, когда оно> 0, <0, но как насчет 0? Поместите fprintf (STDERR (это важно) до и после вызова recv и в один после того, что именно есть код возврата и errno? Также, как вы узнаете, успешно ли вы получили сообщение с сервера? – xaxxon

+0

Если n_recv 0, вы были бы в цикле занятости - ничего не было бы напечатано. Кроме того, вы уверены, что данные получены. Пробовали ли вы отслеживать трафик с помощью чего-то вроде Wireshark или tcpdump? – sbaker

+0

Я проверил. , а не 0. с wirehark, я потерял ответ от сервера сразу после recv() и перед send(). – user2657521

ответ

0

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

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

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

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

+0

спасибо за ответ. Я добавил несколько printf, чтобы проверить возвращаемое значение, а это не 0. Это 24 (размер я полагаю?). Я также проверил с помощью wirehark, по-видимому, сервер прекратил отвечать на мое сообщение после recv() и перед отправкой() – user2657521

+0

Также вы не можете просто распечатать данные, полученные из recv - нет ничего, чтобы гарантировать его завершение нулями. – xaxxon

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