본문 바로가기
코스웨어/15년 스마트컨트롤러

20151130 임현수 업무일지 Winsock #1 소켓통신

by 알 수 없는 사용자 2015. 12. 1.
728x90
반응형
■ Winsock


■ 소켓통신


윈속도 리눅스와 마찬가지로 유닉스의 소켓통신의 영항을 많이 받았다.

MFC도 win32의 윈속를 통하지 않고서는 소켓통신이 안된다.

MAKEWORD(1, 2);     주 버전1, 부 버전 2, 0x0201반환
MAKEWORD(2, 2);     주 버전2, 부 버전 2, 0x0202반환

#include <winsock2.h>
#pragma comment(lib, "WS2_32.lib")
도 사용가능(최신버전)

gcc컴파일에서도 예전에는 
gcc -o server server.c -lsocket
라고 표기를 해줫었다. 요즘에는 안해도 됨.




#include <stdio.h>
#include <winsock.h>

#pragma comment(lib, "wsock32.lib")    // 수동으로 추가해야된다.

#define MAX_PACKETLEN  512

#define PORT  7777
#define IP  "192.168.0.227"

int main(void)
{
  WSADATA wsaData;
  SOCKET sSock;
  SOCKET cSock;
  SOCKADDR_IN sAddr;
  int status;
  int iLen;
  int iWriten;
  char cBuf[MAX_PACKETLEN];

  if (WSAStartup(MAKEWORD(22), &wsaData) != 0)  // 윈속을 사용하겠다.
  {
    printf("error\r\n");
    return 1;
  }

  sSock = socket(AF_INET, SOCK_STREAM, 0);    // 소켓 생성
  if(INVALID_SOCKET == sSock)
  {
    printf("유효하지않은 소켓입니다.\r\n");
    return 2;
  }

  printf("Success socket create\r\n"); 
  memset(&sAddr, 0sizeof(SOCKADDR_IN));    // 구조체 초기화

  sAddr.sin_family = AF_INET;         // 구조체 셋팅
  sAddr.sin_port = htons( PORT ); 
  sAddr.sin_addr.S_un.S_addr = inet_addr(IP);

  status = bind( sSock, (SOCKADDR *)&sAddr, sizeof(SOCKADDR_IN)); 
  if( status == SOCKET_ERROR)  
  { 
    printf("Bind Error\n"); 
    return 3
  }

  if( SOCKET_ERROR == listen(sSock, 5))
      { 
    printf("listen Error\n"); 
    return 4;
  } 

  memset(&sAddr, 0sizeof(SOCKADDR_IN));
  iLen = sizeof(SOCKADDR_IN);

  cSock = accept(sSock, (SOCKADDR *)&sAddr, &iLen);
  if(cSock == INVALID_SOCKET) 
  { 
    printf("Accept Error\n");
    closesocket(sSock); 
    WSACleanup(); 
    return 5;
  }

  printf("Incomming Client : [%s] : [%d]\n", inet_ntoa(sAddr.sin_addr), ntohs(sAddr.sin_port));

  while(1)
  {
    iLen = recv( cSock, cBuf, MAX_PACKETLEN,0 ); 
    if( iLen > 0 ) 
    { 
      iWriten = send( cSock, cBuf, iLen, 0 );
      printf("[Client]:[%s]\n", cBuf);
    } 
    else 
    { 
      printf("read Error\n"); 
    } 
    
    if(0 == strcmp(cBuf, "quit") )
    {
      printf("[Client]:[Disconnected..]\n");
      break;
    }
  }
  closesocket(cSock);
  closesocket(sSock);
  WSACleanup();

  return 0;
}


#include <stdio.h>
#include <winsock.h>

#pragma comment(lib, "wsock32.lib")    // 수동으로 추가해야된다.

#define MAX_PACKETLEN  512

#define PORT  7777
#define IP  "192.168.0.227"

int main(void)
{
  WSADATA wsaData;
  SOCKET sSock;
  SOCKET cSock;
  SOCKADDR_IN cAddr;
  int status;
  int iLen;
  char cBuf[MAX_PACKETLEN];

  if (WSAStartup(MAKEWORD(22), &wsaData) != 0)  // 윈속을 사용하겠다.
  {
    printf("error\r\n");
    return 1;
  }

  cSock = socket(AF_INET, SOCK_STREAM, 0);    // 소켓 생성
  if(INVALID_SOCKET == cSock)
  {
    printf("유효하지않은 소켓입니다.\r\n");
    return 2;
  }

  memset(&cAddr, 0sizeof(SOCKADDR_IN));    // 구조체 초기화

  cAddr.sin_family = AF_INET;         // 구조체 셋팅
  cAddr.sin_port = htons( PORT ); 
  cAddr.sin_addr.S_un.S_addr = inet_addr(IP);

  status = connect(cSock, (SOCKADDR *)&cAddr, sizeof(SOCKADDR_IN));
  if( SOCKET_ERROR == status)
      { 
    printf("connect Error\n"); 
    return 4;
  } 

  while(1)
  {
    memset(cBuf, 0, MAX_PACKETLEN);
    printf("> ");
    fgets(cBuf, MAX_PACKETLEN, stdin);
    iLen = strlen(cBuf);
    cBuf[iLen-1= 0;

    if(0 == strcmp(cBuf, "quit"))
    {
      send(cSock, cBuf, strlen(cBuf), 0);
      printf("[Client]:[Disconnected..]\n");
      break;
    }

    send(cSock, cBuf, strlen(cBuf), 0);

    memset(cBuf, 0, MAX_PACKETLEN);
    recv(cSock, cBuf, MAX_PACKETLEN, 0);
    printf("[Server]:[%s]\n", cBuf);
  }
  closesocket(cSock);
  WSACleanup();

  return 0;
}

▲ 서버측 미완성


728x90