2011-10-03 4 views
0

소켓을 사용하여 TCP 서버/클라이언트를 구현하려고합니다. 나는 출구에서 입력 할 때까지 클라이언트에서 보내는 모든 내용이 줄 단위로 서버에 표시되는 방식으로 프로그램을 작성했습니다. 프로그램은 작동하지만 마지막에 서버에 데이터가 모두 표시됩니다. 아무도 코드를 확인해 주시겠습니까? 이 NUL 종료되지 않도록데이터가 제대로 송/수신되지 않습니다.

TCP의 SERVER

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

main() 
{ 
    char buf[100]; 
    socklen_t len; 
    int k,sock_desc,temp_sock_desc; 
    struct sockaddr_in client,server; 

    memset(&client,0,sizeof(client)); 
    memset(&server,0,sizeof(server)); 
    sock_desc = socket(AF_INET,SOCK_STREAM,0); 
    server.sin_family = AF_INET; 
    server.sin_addr.s_addr = inet_addr("127.0.0.1"); 
    server.sin_port = 7777; 

    k = bind(sock_desc,(struct sockaddr*)&server,sizeof(server)); 
    k = listen(sock_desc,20); 
    len = sizeof(client); 
    temp_sock_desc = accept(sock_desc,(struct sockaddr*)&client,&len); 

    while(1) 
     { 
     k = recv(temp_sock_desc,buf,100,0); 
     if(strcmp(buf,"exit")==0) 
      break; 

     if(k>0) 
      printf("%s",buf); 
    } 

    close(sock_desc); 
    close(temp_sock_desc); 
    return 0; 
} 

TCP의 CLIENT

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

main() 
{ 
    char buf[100]; 
    struct sockaddr_in client; 
    int sock_desc,k; 

    sock_desc = socket(AF_INET,SOCK_STREAM,0); 
    memset(&client,0,sizeof(client)); 
    client.sin_family = AF_INET; 
    client.sin_addr.s_addr = inet_addr("127.0.0.1"); 
    client.sin_port = 7777; 

    k = connect(sock_desc,(struct sockaddr*)&client,sizeof(client)); 

    while(1) 
     { 
     gets(buf); 
     k = send(sock_desc,buf,100,0); 

     if(strcmp(buf,"exit")==0) 
      break; 
    } 

    close(sock_desc); 
    return 0; 
} 
+0

좀 더 들여 쓰기 좋은 것입니다. – ThiefMaster

+1

'gets()'를 사용해서는 안됩니다. 대신'fgets()'를 사용하십시오. – JeremyP

답변

2
while(1){ 
    k = recv(temp_sock_desc,buf,100,0); 
    if(memcmp(buf,"exit", 4)==0) 
     break; 
    if(k>0) 
     printf("%*.*s", k, k, buf); 
} 

RECV()의 결과는, 스트링 아니다. 위의 "수정"은 완전히 정확하지는 않지만 올바른 방향으로 사용자를 안내하기위한 것입니다.

+0

+1 편집 질문에 시간을 낭비하는 동안 다른 사람이 대답을 제공 할 의무가 있습니다 – Dialecticus

+0

중복 찾기를 위해 시간을 할애 할 수있었습니다 ;-) – wildplasser

+0

왜 그것이 null로 끝나지 않습니까? gets (buf)는 문자열의 끝에서 0을 쓰고 send (..., ..., 100)는 후행 0을 포함하는 전체 버퍼를 보냅니다. – blaze

1

gets()는 '\ 0'으로 끝나는 개행을 대체합니다. 결과 문자열은 서버로 보내지고, stdout에 기록됩니다. stdout이 버퍼링되므로 프로그램이 종료되거나 '\ n'이 인쇄 될 때까지 화면에 아무 것도 나타나지 않습니다. 당신의 printf에

추가 '\ n을'

if(k>0) 
    printf("%s\n",buf); 
관련 문제