1.  Client Source
#include <winsock2.h>
#include <stdlib.h>
#include <stdio.h>
#define BUFSIZE 512
//소켓 함수 오류 출력 후 종료
void err_quit(char *msg)
{
 LPVOID lpMsgBuf;
 FormatMessage(
   FORMAT_MESSAGE_ALLOCATE_BUFFER |
   FORMAT_MESSAGE_FROM_SYSTEM ,
   NULL,
   WSAGetLastError(),
   MAKELANGID(LANG_NEUTRAL,SUBLANG_DEFAULT),
   (LPTSTR)&lpMsgBuf,0,NULL);
 MessageBox(NULL,(LPTSTR)lpMsgBuf,msg,MB_ICONERROR);
 LocalFree(lpMsgBuf);
 exit(-1);
  
}
//소켓 함수 오류 출력
void err_display(char *msg)
{
 LPVOID lpMsgBuf;
 FormatMessage(
   FORMAT_MESSAGE_ALLOCATE_BUFFER |
   FORMAT_MESSAGE_FROM_SYSTEM,
   NULL,WSAGetLastError(),
   MAKELANGID(LANG_NEUTRAL,SUBLANG_DEFAULT),
   (LPTSTR)&lpMsgBuf, 0, NULL);
 printf("[%s] %s",msg,(LPCTSTR)lpMsgBuf);
 LocalFree(lpMsgBuf);
  
}
//사용자 정의 데이터 수신 함수
int recvn(SOCKET s, char *buf, int len, int flags)
{
 int received;
 char *ptr = buf;
 int left = len;
 while( left > 0 )
 {
  received = recv(s,ptr,left,flags);
  if(received == SOCKET_ERROR)
  return SOCKET_ERROR;
  else if(received == 0)
  break;
  left -= received;
  ptr += received;
  
 }
 return (len - left);
}
 
 
int main(int argc, char* argv[])
{
 int retval;
 //윈속 초기화
 WSADATA wsa;
 if(WSAStartup(MAKEWORD(2,2) , &wsa) != 0)
  return -1; // 0이 아닐 시 -1리턴
 
 //socket()
 SOCKET sock =socket(AF_INET,SOCK_STREAM,0);
 if(sock == INVALID_SOCKET) err_quit("socket()");
 
 //connect()
 SOCKADDR_IN serveraddr;
 serveraddr.sin_family = AF_INET;
 serveraddr.sin_port = htons(9000);
 serveraddr.sin_addr.s_addr = inet_addr("127.0.0.1");
 retval = connect(sock, (SOCKADDR *) &serveraddr, sizeof(serveraddr));
 if(retval == SOCKET_ERROR ) err_quit("connect()");
 //데이터 통신에 사용할 변수
 int len;
 char buf[BUFSIZE+1];
 
 while(1)
 {
  //데이터 입력
  ZeroMemory(buf, sizeof(buf));
  printf("\n[보낼 데이터]");
  if(fgets(buf, BUFSIZE+1, stdin) == NULL)
   break;
  //\n 문자 제거
  len = strlen(buf);
  
  if(buf[len-1] =='\n')
   buf[len-1] = '\0';
  if(strlen(buf) == 0)
   break;
  //데이터 보내기
  retval = send(sock,buf,strlen(buf), 0);
  if(retval == SOCKET_ERROR)
  {
   err_display("send()");
   break;
  }
  printf("[TCP 클라이언트] %d 바이트를 보냈습니다! \n", retval);
  
  //데이터 받기
  retval = recvn(sock,buf,retval,0);
  if(retval == SOCKET_ERROR)
  {
  err_display("recv()");
  break;
  }
  else if(retval==0)
  break;
  //받은 데이터 출력
  buf[retval] = '\0';
  printf("[TCP 클라이언트] %d 바이트를 받았습니당! \n" , retval);
  printf("[받은 데이터] %s\n", buf);
 }
 //closesocket()
 closesocket(sock);
 
 //윈속 종료
 WSACleanup();
 return 0;
}
2. Server Source
#include <winsock2.h>
#include <stdlib.h>
#include <stdio.h>
#define BUFSIZE 512
//소켓 함수 오류 출력 후 종료
void err_quit(char *msg)
{
 LPVOID lpMsgBuf;
 FormatMessage(
   FORMAT_MESSAGE_ALLOCATE_BUFFER |
   FORMAT_MESSAGE_FROM_SYSTEM ,
   NULL,
   WSAGetLastError(),
   MAKELANGID(LANG_NEUTRAL,SUBLANG_DEFAULT),
   (LPTSTR)&lpMsgBuf,0,NULL);
 MessageBox(NULL,(LPTSTR)lpMsgBuf,msg,MB_ICONERROR);
 LocalFree(lpMsgBuf);
 exit(-1);
  
}
//소켓 함수 오류 출력
void err_display(char *msg)
{
 LPVOID lpMsgBuf;
 FormatMessage(
   FORMAT_MESSAGE_ALLOCATE_BUFFER |
   FORMAT_MESSAGE_FROM_SYSTEM,
   NULL,WSAGetLastError(),
   MAKELANGID(LANG_NEUTRAL,SUBLANG_DEFAULT),
   (LPTSTR)&lpMsgBuf, 0, NULL);
 printf("[%s] %s",msg,(LPCTSTR)lpMsgBuf);
 LocalFree(lpMsgBuf);
  
}
int main(int argc, char* argv[])
{
 int retval;
 //윈속 초기화
 WSADATA wsa;
 if(WSAStartup(MAKEWORD(2,2) , &wsa) != 0)
  return -1; // 0이 아닐 시 -1리턴
 
 //socket()
 SOCKET listen_sock =socket(AF_INET,SOCK_STREAM,0);
 if(listen_sock == INVALID_SOCKET) err_quit("socket()");
 
 //bind()
 SOCKADDR_IN serveraddr;
 ZeroMemory(&serveraddr, sizeof(serveraddr));
 serveraddr.sin_family = AF_INET;
 serveraddr.sin_port = htons(9000);
 serveraddr.sin_addr.s_addr = htonl(INADDR_ANY);
 retval = bind(listen_sock, (SOCKADDR *) &serveraddr, sizeof(serveraddr));
 if(retval == SOCKET_ERROR ) err_quit("bind()");
 
 //listen
 retval = listen(listen_sock, SOMAXCONN);
 if(retval == SOCKET_ERROR ) err_quit("listen()");
 //데이터 통신에 사용할 변수
 SOCKET client_sock;
 SOCKADDR_IN clientaddr;
 int addrlen;
 char buf[BUFSIZE+1];
 
 while(1)
 {
  //accept
  addrlen = sizeof(clientaddr);
  client_sock = accept(listen_sock, (SOCKADDR*) &clientaddr , &addrlen);
  if(client_sock == INVALID_SOCKET )
  {
   err_display("accpet()");
   continue;
  }
  printf("\n[TCP 서버] 클라이언트 접속 : IP 주소 : %s, 포트번호 : %d\n",
    inet_ntoa(clientaddr.sin_addr),
    ntohs(clientaddr.sin_port ));
    
 
 //클라와 데이터 통신
 while(1)
 {
 
 
 retval = recv(client_sock,buf,BUFSIZE,0);
 if(retval == SOCKET_ERROR)
 {
  err_display("recv()");
  break; 
 }
 else if(retval == 0)
 {
  break;
 }
 //받은 데이터 출력
 buf[retval] = '\0';
 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;
 }
 }
 //closesocket()
 closesocket(client_sock);
 printf("\n[TCP Server] 클라이언트 종료 : IP 주소 : %s , 포트번호 : %d\n",
   inet_ntoa(clientaddr.sin_addr),
   ntohs(clientaddr.sin_port ));
}
 //closesocket()
 closesocket(listen_sock);
 //윈속 종료
 WSACleanup();
 return 0;
}