#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, (LPCTSTR)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;
 BYTE a,b;
 
 // 윈속 초기화
 WSADATA wsa2,wsa1;
 if(WSAStartup(MAKEWORD(2,2), &wsa2) != 0)
  return -1;
 if(WSAStartup(MAKEWORD(1,1), &wsa1) != 0)
  return -1;
 MessageBox(NULL, "윈속 초기화 성공","성공",MB_OK);

 a=LOBYTE(wsa2.wVersion);
 b=HIBYTE(wsa2.wVersion);
 printf("소켓 2.2 wVersion = %d,%d \n",a,b);
 
 a=LOBYTE(wsa2.wHighVersion);
 b=HIBYTE(wsa2.wHighVersion);
 printf("소켓 2.2 wHighVersion = %d,%d \n",a,b);
 printf("소켓 2.2 szDescription = %s \n", wsa2.szDescription);
 printf("소켓 2.2 szSystemStatus = %s \n", wsa2.szSystemStatus);

 printf("\n======================================================\n\n");

 a=LOBYTE(wsa1.wVersion);
 b=HIBYTE(wsa1.wVersion);
 printf("소켓 1.1 wVersion = %d,%d \n",a,b);
 a=LOBYTE(wsa1.wHighVersion);
 b=HIBYTE(wsa1.wHighVersion);
 printf("소켓 1.1 wHighVersion = %d,%d \n",a,b);

 printf("소켓 1.1 szDescription = %s \n", wsa1.szDescription);
 printf("소켓 1.1 szSystemStatus = %s \n", wsa1.szSystemStatus);

 // socket()
 SOCKET listen_sock = socket(AF_INET, SOCK_STREAM, 0);
 if(listen_sock == INVALID_SOCKET) err_quit("socket()");
  MessageBox(NULL, "TCP IP 소켓 생성","성공",MB_OK);
/*
 // 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("accept()");
   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;
   }
   else{
    // 받은 데이터 출력
    buf[retval] = '\0';
    printf("%s\n", buf);     // 데이터 보내기
    retval = send(client_sock, buf, retval, 0);  
    if(retval == SOCKET_ERROR)  
    {   
     err_display("send()");
     break;  
    }
   }
  }

  // closesocket()
  closesocket(client_sock);
  printf("\n[TCP 서버] 클라이언트 종료: IP 주소=%s, 포트 번호=%d\n",
   inet_ntoa(clientaddr.sin_addr), ntohs(clientaddr.sin_port));
 }
*/
 // closesocket()
 closesocket(listen_sock);

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

+ Recent posts