2013-08-06 47 views
0

我剛剛開始學習如何編碼套接字,但有問題,我無法解決。telv客戶端沒有迴應後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?在調用recv之前和之後放置一個fprintf(這很重要),返回碼和errno究竟設置爲什麼?另外,如何知道是否成功從服務器接收到消息? – xaxxon

+0

如果n_recv是0,你會在一個繁忙的循環 - 什麼都不會打印。此外,你確定有任何數據正在收到。你有沒有嘗試使用類似Wireshark或tcpdump監視流量? – sbaker

+0

我已檢查。返回值是24 ,而不是0.在wireshark中,我在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服務器的響應線我想?)。 我也用wireshark檢查過,顯然服務器在recv()和send()之前已經停止了對我的連接的回覆() – user2657521

+0

你也不能只是printf你從recv得到的數據 - 沒有什麼可以保證它是空終止的。 – xaxxon