안녕하세요 C++ 으로 소켓통신을 하는건데요.

조회수 4062회

안녕하세요 코딩 초보입니다.

server와 client를 만들어 서로 한번씩 메세지를 전송하는 코드를 만들어야하는데

감이 잡히지 않아요 ...

서버코드는 일단 이렇구요

#pragma comment(lib, "ws2_32") 
#include <winsock2.h> 
#include <stdlib.h> 
#include <stdio.h> 

#define SERVERPORT 9000 

int main(int argc, char *argv[]) 
{ 
   int retval; 
   // 윈속 초기화 
   WSADATA wsa; 
   if(WSAStartup(MAKEWORD(2,2), &wsa) != 0) return 1; 

   // socket() 
   SOCKET listen_sock = socket(AF_INET, SOCK_STREAM, 0); 

   // bind() 
   SOCKADDR_IN serveraddr; 
   ZeroMemory(&serveraddr, sizeof(serveraddr)); 
   serveraddr.sin_family = AF_INET; 
   serveraddr.sin_addr.s_addr = htonl(INADDR_ANY); 
   serveraddr.sin_port = htons(SERVERPORT); 
   retval = bind(listen_sock, (SOCKADDR *)&serveraddr, sizeof(serveraddr)); 

   // listen() 
   retval = listen(listen_sock, SOMAXCONN); 

   // 데이터 통신에 사용할 변수 
   SOCKET client_sock; 
   SOCKADDR_IN clientaddr; 
   int addrlen; 
   char x;

   while(1){ 
      // accept() 
      addrlen = sizeof(clientaddr); 
      client_sock = accept(listen_sock, (SOCKADDR *)&clientaddr, &addrlen); 

      // 접속한 클라이언트 정보 출력 
      printf("\n[TCP 서버] 클라이언트 접속: IP 주소=%s, 포트 번호=%d\n", 
            inet_ntoa(clientaddr.sin_addr), ntohs(clientaddr.sin_port)); 
      // 클라이언트와 데이터 통신 
      while(1){ 
         // 데이터 받기
         retval = recv(client_sock, &x, sizeof(char), 0);                   
         if(retval == SOCKET_ERROR || retval == 0) break; 

         // 받은 데이터 출력 
         printf("%c", x); 
      } 
      // closesocket() 
      closesocket(client_sock);       
   } 
   // 리슨 소켓 종료 
   closesocket(listen_sock); 

   // 윈속 종료 
   WSACleanup(); 
   return 0; 
}

클라이언트는 이렇습니다.

#pragma comment(lib, "ws2_32") 
#include <winsock2.h> 
#include <stdlib.h> 
#include <stdio.h> 
#include <conio.h>

#define SERVERIP   "127.0.0.1" 
#define SERVERPORT 9000 

int main(int argc, char *argv[]) 
{ 
   int retval; 
   // 윈속 초기화 
   WSADATA wsa; 
   if(WSAStartup(MAKEWORD(2,2), &wsa) != 0) return 1; 

   // 소켓 생성 
   SOCKET sock = socket(AF_INET, SOCK_STREAM, 0); 
   if(sock == INVALID_SOCKET) exit(1); 

   // 소켓 설정
   SOCKADDR_IN serveraddr; 
   ZeroMemory(&serveraddr, sizeof(serveraddr)); 
   serveraddr.sin_family = AF_INET; 
   serveraddr.sin_addr.s_addr = inet_addr(SERVERIP); 
   serveraddr.sin_port = htons(SERVERPORT);    

   // 연결 요청
   retval = connect(sock, (SOCKADDR *)&serveraddr, sizeof(serveraddr)); 
   if(retval == SOCKET_ERROR) exit(1); 

   // 서버와 데이터 통신 
   char x;
   while(1) {
       x = getche();
       retval = send(sock, &x, sizeof(char), 0); 
   }

   // 소켓 종료 
   closesocket(sock); 

   // 윈속 종료 
   WSACleanup(); 
   return 0; 
} 

이걸 베이스로 만들어야하는데 while 부분을 수정하고 buffer도 만들어서 저장했다가 메세지를 주고받아야 할 거같은데 감이 잡히지 않아요.
아래는 클라이언트 부분의 while 을 수정해 본거에요. while부분 위쪽은 그냥 추가해 준 것이구요. 거의 뇌피셜 급으로 작성해서인지 잘안되는 것 같습니다.

#include BUFSIZE 1024

하고 내려와서 


char message[BUFSIZE];
로 선언해줬어요



   while(1) { 

         if(true){
           retval=recv(sock,message,sizeof(message),0);
        if(retval == SOCKET_ERROR || retval == 0)
             printf("받은메세지:%s\n",message); break;       
   }
            if(true){
           retval = send(sock, message, sizeof(message), 0);//                   
             if(retval == SOCKET_ERROR || retval == 0) break; 
    }
        printf("대기중입니다"); 
   }

무슨 생각으로 코드를 작성했냐면 recv 로 메세지를 받았을때 이를 출력하고 이제 서버쪽에서는 메세지를 그만 받고 출력하고 break로 빠져나옵니다. 그리고 클라이언트가 메세지를 작성하는 상태로 와요 여기서도 계속 입력을 받아서 작성하다가 retval=SOCKET_ERROR 이거나 retval이 0 이면 빠져나오고 대기중입니다.를 출력하고 while(1)이니 다시 수신단으로 올라가게 하고싶은데.. 문제는 저렇게 걸어논 if문이 맞는지 사실 잘 모르겠어요 enter 입력을 받아서 if문에 그게 들어오면 그냥 메세지 출력하면서 break로 나가게 구성하는 것과 같은 건지요 .. ㅠㅠ

코딩이 귀찮으시다면 어디어디를 어떻게 구성하고 수정하면 될 것 같다 조언 부탁드려요 감사합니다!

  • (•́ ✖ •̀)
    알 수 없는 사용자

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)