2014-02-25 2 views
0

네트워크를 통해 통신하고 간단한 클라이언트 서버 통신을 구현하는 간단한 클라이언트와 서버를 구현하는 소켓 프로그래밍. 클라이언트는 사전 정의 된 포트에서 서버와의 세션을 연 다음 텍스트 메시지 행을 제공합니다.TCP 소켓 프로그래밍

서버는 표준 출력으로 텍스트 메시지를 출력하고 더 많은 문자 메시지를 수신하기 위해 계속 실행합니다.

클라이언트가 종료 옵션을 선택하여 세션을 닫으면 서버에 대한 연결이 정상적으로 종료되어야합니다.

서버가 컨트롤 C를 눌러 종료되면 서버는 열려있는 소켓도 정상적으로 해제해야합니다.

나는이 프로그램을 만들었지 만 문자열을 입력하고 클라이언트 측에서 Enter 키를 누르면 서버에 나타나지 않지만 두 번째 입력시 첫 번째 입력이 나타나고 두 번째 입력이 보류 중입니다.

두 번째는 세 번째 입력이 완료되면 ...

내가이 문제에 대한 해결책을 얻을 수 나타납니다?

//Server.c 

int main() 
{ 
    int listenfd = 0; 
    int confd=0; 
    struct sockaddr_in sa; 
    char msg[1025]; 
char c[1]; 
     int i; 

    listenfd = socket(AF_INET,SOCK_STREAM,0); 
    if(listenfd<0) 
    { 
     perror("Socket"); 
     return 1; 
    } 
    sa.sin_family = AF_INET; 
    sa.sin_port = htons(1234); 
    sa.sin_addr.s_addr = htonl(INADDR_ANY); 

    while((bind(listenfd,(struct sockaddr*)&sa,sizeof(sa))<0)){return 1;} 
    printf("\nBind Successfull"); 

    listen(listenfd,10); 
     while(1){ 
     confd=accept(listenfd,(struct sockaddr*)NULL,NULL); 
     printf("\nConnected"); 
     memset(msg,0x0,10); 
     do{ 
       read(confd,c,1); 
       if(strcmp(c,"n")!=0) 
       { 
       read(confd,msg,10); 
       printf("\n%s",msg); 
       memset(msg,0x0,10); 
       } 
       else{ 
       confd=accept(listenfd,(struct sockaddr *)NULL,NULL); 
       printf("\nWaiting.."); 
       //close(confd); 

       } 

      // write(confd,msg,10); 
     //} 
     //msg[rc]='\0' 
     }while(1); 
     close(confd); 
    } 
} 

//Client.c 

int main() 
{ 

    int sock1= 0; 
    FILE *serv; 
    struct sockaddr_in server,clin; 
    char msg[1024],c[1]; 
    server.sin_family = AF_INET; 
    server.sin_port = htons(1234); 
    if(inet_pton(AF_INET,"192.168.125.7",&server.sin_addr)<0) 
    { 
     perror("inet_pton"); 
     return 1; 
    } 
    if((sock1 = socket(AF_INET,SOCK_STREAM,0))<0) 
    { 
     perror("socket"); 
     return 1; 
    } 
    if(connect(sock1,(struct sockaddr*)&server,sizeof(server))<0) 
    { 
     perror("Connect"); 
     return 1; 

    } 
     //printf("\nEnter 'y' to exit."); 
    while(1){ 
    // memset(&msg, '0', sizeof(msg)); 
     printf("\nDo you want to continue(y/n):"); 
     scanf(" %[^\n]",c); 
     if(strcmp(c,"y")==0){ 
       printf("\nEnter String:"); 

       scanf("%c",&c); 
       scanf(" %[^\n]",msg); 
       printf("\nSending String to server.."); 
       //scanf("%c",&c); 
       write(sock1,c,1); 
       write(sock1,msg,10); 
     } 
     if(strcmp(c,"n")==0) 
     { 
     write(sock1,c,10); 
     exit(1); 
     } 
    } 
    close(sock1); 
    printf("\n"); 
} 
+0

맨 페이지에서 read()/write()를 자세히 읽고 소켓에 대해 적어도 두 함수가 읽은 바이트만큼 읽거나 쓰지는 않는다는 사실을 배웠다. 모든 데이터 나 터미네이터가 읽기/쓰기 될 때까지 카운트를 반복하는 것은 좋은 생각입니다. 꼭 필요한 것은 아닙니다. – alk

답변

0

특히 코드를 비 블로킹하려는 경우 소켓 프로그래밍은 쉬운 작업이 아닙니다. 기존 코드를 처음부터 쓰지 않고 사용하는 것이 좋습니다. 바퀴 재발 명으로 많은 시간을 낭비합니다!

여기서 threadsafe C++ Socket 클래스는 하나의 * .cpp 파일에서 양방향으로 문자열을주고받을 수있는 데모 응용 프로그램과 함께 제공되며, 데모 응용 프로그램 등으로 텔넷 서버에 연결할 수도 있습니다 년은 문제없이 작동 할 수 있기 때문에 ...

http://www.codeproject.com/Articles/34163/A-Universal-TCP-Socket-Class-for-Non-blocking-Serv

이 코드는 승인됩니다. 나는 상업용 제품에서 그것을 사용하고 그것이 당신이 탄환임을 확신 할 수 있습니다.