2013-08-06 5 views
0

난 그냥 소켓을 코딩 만 가지고 문제를 내가 해결할 수없는 방법을 배우고 시작입니다. 텔넷 클라이언트는()

그래서 나는 텔넷 클라이언트를 만들려고하고 있었고, 난 서버에서 첫 번째 메시지를 수신 할 성공하지만,이 후 라인을 수신 붙어 내 프로그램 종류 및 다른 작업을 수행하지 않습니다. 단순한 printf 라인조차도 아니다. 사전에

덕분에, 리키 여기

코드입니다 :

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

#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 일 때는 어떻게됩니까? (STDERR (즉 중요)는 fprintf를 넣어 전에 RECV를 호출 한 후 정확히 n_recv 경우 성공적으로 서버에서 메시지? – xaxxon

+0

를 받았다면? 또한, 어떻게 알 수 있습니까 세트 리턴 코드와 errno는 무엇 후 하나에 0이면 바쁜 루프에 빠질 것이고 아무 것도 출력되지 않을 것입니다 또한 어떤 데이터가 수신되고 있는지 확인하십시오 Wireshark 또는 tcpdump와 같은 트래픽으로 모니터링을 시도 했습니까? – sbaker

+0

확인했습니다. 반환 값은 24입니다. '대신 보내 '라고한다 (0) sockfd와, 버퍼를 sizeof (버퍼), 0이 아닌 와이어 샤크와, 내가 서버에서 응답을 잃은 바로 RECV 후()와 보내기 전에(). – user2657521

답변

0

반환 값이 정확히 모른 채, 그것은 가능성이 원격 측이 닫힌 연결 보인다

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

질문에 대한 내 의견을보고 해당 데이터를 게시하면 더 많은 도움이 될 것입니다.

+0

확실히. 난 반환 값을 확인하는 일부의 printf를 첨가하며 (사이즈가 24의 0이 아니다 내가 생각하는 서버의 응답 라인?). 나는 또한 분명히 서버가 RECV 후 내 연결을 회신 중지, 와이어 샤크로 확인() 및 전송하기 전에() – user2657521

+0

또한 당신은 당신이 RECV에서 얻는 데이터는 printf 수 없습니다 - 그것은 null로 끝나는입니다 보장하기 아무것도 없다. – xaxxon