기본카테고리

[C++] Socket통신

DevReff 2013. 9. 18. 16:19




728x90

 

test.zip
다운로드

 

------------ 클라이언트 -----------
 
// client.cpp : 콘솔 응용 프로그램에 대한 진입점을 정의합니다.
//
#include "stdafx.h"
#include "client.h"
#include "stdio.h"
#include "winsock2.h"
#pragma comment(lib, "ws2_32.lib")
#define DESIRED_WINSOCK_VERSION        0x0202
#define MINIMUM_WINSOCK_VERSION        0x0001
#define MAXBUF 256
#ifdef _DEBUG
#define new DEBUG_NEW
#endif

// 유일한 응용 프로그램 개체입니다.
CWinApp theApp;
using namespace std;
int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
 int nRetCode = 0;
 // MFC를 초기화합니다. 초기화하지 못한 경우 오류를 인쇄합니다.
 if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0))
 {
  // TODO: 오류 코드를 필요에 따라 수정합니다.
  _tprintf(_T("심각한 오류: MFC를 초기화하지 못했습니다.\n"));
  nRetCode = 1;
 }
 else
 {
  // TODO: 응용 프로그램의 동작은 여기에서 코딩합니다.
  SOCKET m_client_socket;
  WSADATA wsadata;
  struct sockaddr_in server_addr;
  char buffer[MAXBUF] = {0, };
  // 소켓을 초기화
  if(!WSAStartup(DESIRED_WINSOCK_VERSION, &wsadata)){
   if(wsadata.wVersion < MINIMUM_WINSOCK_VERSION){
    WSACleanup();
    exit(1);
   }
  }
  // 소켓을 생성
  m_client_socket = socket(PF_INET, SOCK_STREAM, 0);
  if(m_client_socket == INVALID_SOCKET){
   printf("socket error : ");
   WSACleanup();
   exit(1);
  }
  // 소켓이 접속할 주소 지정
  memset(&server_addr, 0, sizeof(server_addr));
  server_addr.sin_family = AF_INET;
  server_addr.sin_addr.s_addr = inet_addr("127.0.0.1");
  server_addr.sin_port = htons(2100);
  // 지정한 주소로 접속
  if(connect(m_client_socket, (LPSOCKADDR)&server_addr, sizeof(server_addr)) != 0)
  {
   printf("connect error : ");
   exit(1);
  }
  bool running = true;
  while (running)
  {
   // 데이터 처리
   if(recv(m_client_socket, buffer, MAXBUF, 0) <= 0)
    printf("Recv error\n");
   else
    printf("Recv : %s\n", buffer);
   getchar();
   if(send(m_client_socket, buffer, MAXBUF, 0) <= 0)
    printf("send error : %s\n", buffer);
   else
    printf("send : %s\n", buffer);
  }
  // 소켓을 닫음
  closesocket(m_client_socket);
  // 받아온 문자열을 화면에 출력
  printf("\nrecv : %s\n\n", buffer);
  return 0;
 }
 return nRetCode;
}
 
------------ 서 버 -----------
 
// server.cpp : 콘솔 응용 프로그램에 대한 진입점을 정의합니다.
//
#include "stdafx.h"
#include "server.h"
#include "stdio.h"
#include "winsock2.h"
#pragma comment(lib, "ws2_32.lib")
#define DESIRED_WINSOCK_VERSION        0x0202
#define MINIMUM_WINSOCK_VERSION        0x0001
#define MAXBUF 256

#ifdef _DEBUG
#define new DEBUG_NEW
#endif

// 유일한 응용 프로그램 개체입니다.
CWinApp theApp;
using namespace std;
int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
 int nRetCode = 0;
 // MFC를 초기화합니다. 초기화하지 못한 경우 오류를 인쇄합니다.
 if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0))
 {
  // TODO: 오류 코드를 필요에 따라 수정합니다.
  _tprintf(_T("심각한 오류: MFC를 초기화하지 못했습니다.\n"));
  nRetCode = 1;
 }
 else
 {
  // TODO: 응용 프로그램의 동작은 여기에서 코딩합니다.
  SOCKET m_client_sock, m_listen_sock; // 소켓 디스크립트 정의
  WSADATA wsadata;
  struct sockaddr_in client_addr, server_addr;
  // 클라이언트에 보내줄 문자열
  char buffer[MAXBUF] = "I like you!";  int clen;
  int i = 0;
  // 소켓을 초기화
  if(!WSAStartup(DESIRED_WINSOCK_VERSION, &wsadata)){
   if(wsadata.wVersion < MINIMUM_WINSOCK_VERSION){
    WSACleanup();
    exit(1);
   }
  }
  // 서버 소켓 생성
  m_listen_sock = socket(AF_INET, SOCK_STREAM, 0);
  if(m_listen_sock == INVALID_SOCKET){
   printf("socket error : ");
   WSACleanup();
   exit(1);
  }
  clen = sizeof(server_addr);
  // 주소 구조체에 주소 지정
  memset(&server_addr, 0, sizeof(server_addr));
  server_addr.sin_family = AF_INET;
  server_addr.sin_addr.s_addr = inet_addr("127.0.0.1");
  server_addr.sin_port = htons(2100); // 사용할 포트번호
  // bind 함수를 사용하여 서버 소켓의 주소 설정
  if(bind(m_listen_sock, (LPSOCKADDR)&server_addr, sizeof(server_addr)) == SOCKET_ERROR){
   printf("bind error : ");
   WSACleanup();
   exit(1);
  }
  // 위에서 지정한 주소로 클라이언트 접속을 기다림
  if(listen(m_listen_sock, 1) != 0) {
   printf("listen error : ");
   exit(1);
  }
  bool running = true;
  while(running)
  {
   // 클라이언트가 접속하면 접속을 허용하고 클라이언트 소켓을 생성함
   m_client_sock = accept(m_listen_sock, (LPSOCKADDR)&client_addr, &clen);
   if(m_client_sock != INVALID_SOCKET)
   {
    printf("=== 접속 완료 ===\n");
    while(1)
    {
     // 클라이언트로 buf에 있는 “I like you!" 문자열 전송
     if(send(m_client_sock, buffer, MAXBUF, 0) <= 0)
      printf("send error : %s\n", buffer);
     else
      printf("send : %s\n", buffer);
     
     if(recv(m_client_sock, buffer, MAXBUF, 0) <= 0)
      printf("recv error : %s\n", buffer);
     else
      printf("recv : %s\n", buffer);
    }
   }
  }
  // 클라이언트 소켓을 닫음
  closesocket(m_client_sock);
  return 0;
 }
 return nRetCode;
}
 

'기본카테고리' 카테고리의 다른 글

[MFC]보색 구하는 방법  (0) 2014.01.23
[VC++]CListCtrl 을 읽기전용으로 설정하는 방법  (0) 2013.10.01
[Linux] 프로그램 개발 방법  (0) 2013.07.12
[Linux] Thread  (0) 2013.07.11
[VC++]Queue  (0) 2013.06.05