---------------------------클라이언트---------------------------------------------------
//데이터 통신에 사용할 변수
 char buf[BUFSIZE+1]; [각주:1]
 int len;[각주:2]

 while(1)
 {
  //데이터 입력
  ZeroMemory(buf, sizeof(buf));[각주:3]
  printf("\n[보낼 데이터]");[각주:4]
  if(fgets(buf, BUFSIZE+1, stdin) == NULL)[각주:5]
   break;[각주:6]
  //\n 문자 제거
  len = strlen(buf);[각주:7]  
  if(buf[len-1] =='\n')[각주:8]
   buf[len-1] = '\0';[각주:9]
  if(strlen(buf) == 0)[각주:10]
   break;[각주:11]

  //데이터 보내기[각주:12]
  retval = send(sock,buf,strlen(buf), 0);
  if(retval == SOCKET_ERROR)
  {
   err_display("send()");
   break;
  }

  printf("[TCP 클라이언트] %d 바이트를 보냈습니다! \n", retval);
  
  //데이터 받기[각주:13]
  retval = recvn(sock,buf,retval,0);
  if(retval == SOCKET_ERROR)
  {
  err_display("recv()");
  break;
  }
  else if(retval==0)
  break;

  //받은 데이터 출력
  buf[retval] = '\0';[각주:14]
  printf("[TCP 클라이언트] %d 바이트를 받았습니당! \n" , retval);
  printf("[받은 데이터] %s\n", buf);

 }
-----------------------------------------------------------------------------------


---------------------------서버-----------------------------------------------------
//여기서 사용한 소켓( client_sock ) 은 accept() 함수의 리턴값으로 생성된 것임을 유의하도록 하자.

char buf[BUFSIZE+1];[각주:15]
 //클라와 데이터 통신
 while(1)[각주:16]

 retval = recv(client_sock,buf,BUFSIZE,0);[각주:17]
 if(retval == SOCKET_ERROR)
 {
  err_display("recv()");
  break; 
 }

 else if(retval == 0)
 {
  break;
 }
 //받은 데이터 출력
 buf[retval] = '\0';[각주:18]
 printf("[TCP/%s:%d] %s\n",
  inet_ntoa(clientaddr.sin_addr),
  ntohs(clientaddr.sin_port ), buf);
 

 //데이터 보내기
 retval = send(client_sock,buf,retval,0);
 if(retval == SOCKET_ERROR)
 {
  err_display("send()");
  break;
 }
 }



  1. 입력 문자열 길이를 계산할 때 사용한다. [본문으로]
  2. fgets() 함수를 이용해 사용자로부터 문자열을 입력받는다. [본문으로]
  3. 사용자가 입력한 문자열 또는 서버로부터 받은 데이터를 저장할 버퍼다. [본문으로]
  4. 사용자가 입력한 문자열 또는 서버로부터 받은 데이터를 저장할 버퍼다. [본문으로]
  5. 사용자가 입력한 문자열 또는 서버로부터 받은 데이터를 저장할 버퍼다. [본문으로]
  6. 사용자가 입력한 문자열 또는 서버로부터 받은 데이터를 저장할 버퍼다. [본문으로]
  7. \n 문자를 제거한다.데이터 출력 시 줄바꿈 여부를 서버가 결정하도록 하기 위함이다. [본문으로]
  8. \n 문자를 제거한다.데이터 출력 시 줄바꿈 여부를 서버가 결정하도록 하기 위함이다. [본문으로]
  9. 글자를 입력하지 않고 엔터 키만 눌렀을 시 루프를 빠져나간다. [본문으로]
  10. \n 문자를 제거한다.데이터 출력 시 줄바꿈 여부를 서버가 결정하도록 하기 위함이다. [본문으로]
  11. \n 문자를 제거한다.데이터 출력 시 줄바꿈 여부를 서버가 결정하도록 하기 위함이다. [본문으로]
  12. send() 함수를 호출하고 오류 처리를 한다. 블로킹 소켓을 사용하므로 send() 함수의 리턴값은 strlen(buf) 값과 같게 된다. [본문으로]
  13. recvn() 함수를 호출하고 오류처리를 한다. 서버가 보낼 데이터의 크기를 미리 알고 있으므로 recvn() 함수를 사용하는 것이 편리하다. [본문으로]
  14. 받은 데이터 끝에 \0 을 추가하고 화면에 출력한다. [본문으로]
  15. 받은 데이터를 저장할 애플리케이션 버퍼다. [본문으로]
  16. recv() 함수를 호출하고 오류 처리 한다.서버는 받을 데이터 크기를 미리 알 수 없으므로 recvn() 함수를 사용할 수 없다. [본문으로]
  17. recv() 함수의 리턴값이 0 (정상종료) 또는 SOCKET_ERROR 가 될때까지 계속 루프를 돌며 데이터를 수신한다. [본문으로]
  18. 받은 데이터 끝에 \0 을 추가하고 화면에 출력한다. [본문으로]

'Windows > Network Programming' 카테고리의 다른 글

데이터 전송 함수 및 소켓 데이터 구조체  (0) 2011.07.16
TCP Client 분석  (0) 2011.07.15
TCP Server 분석  (0) 2011.07.15
TCP Server / Client  (0) 2011.07.15

+ Recent posts