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

2015.11.30_[Winsock #1]_이량경_소켓통신

by 알 수 없는 사용자 2015. 12. 1.
728x90
반응형
<WinSock>✔ 
================================================================
- C++은 C를 재포장
- MFC는 윈32를 통하지 않으면 소켓통신이 안된다.
- 윈도우는 소켓을 사용하려면 반드시 불러야 하는 함수가 있다.

        WSADATA wsaData;
        if (WSAStartup( MAKEWORD(2, 2), &wsaData) != 0)
       {
              printf( "error\r\n");
               return 0;
       }
        WSACleanup(); 
- 유닉스는 이런개념이 없다.
- 버전숫자가 높으면 기능이많고
- 버전 숫자가 낮으면 호환성이 좋다.
- cl로 하면 라이브러리 언급해 줘야한다.

#include <winsock.h>
#pragma comment(lib, "wsock32.lib")

#include <winsock2.h>
#pragma comment(lib, "ws2_32.lib")

* gcc -o server Server.c -lsocket를 같이 적어줘야 하는데. 요즘에는 안써도 소켓사용이 된다.
- 소켓버전에 따라 뭐가 다른지 좋아지는지 - 개인공부
- 중요한것은 시작과 끝에 있어야 한다.
********************************
WSADATA wsaData;
WSACleanup(); 
* 이 반드시 들어가야 한다.
********************************

winsock의 socket원형
 

socket

socket는 endpoint socket을 생성한다. BSD:::socket(:12)의 경우 파일 descriptor를 반환한다. winsock(:12) socket 함수는 소켓 기술자 (socket descriptor) SOCKET반환 한다. SOCKET 는 unsigned int 형으로 BSD 소켓의 int형과 약간의 차이가 있다. int를 써도 (경고는 발생할 수 있지만) 큰 문제는 없다. 모든게 파일로 재현되는 유닉스와 달리 윈도는 파일 기술자 와 소켓 기술자가 반드시 일치한다고 볼 수 없으므로 SOCKET을 사용하는게 낫다

SOCKET socket
{
    int af,
    int type,
    int protocol
};

htons유닉스의 도스용함수

1. 윈속사용 (스타트업) -> 소켓 생성

2. -> 구조체 셋팅


/*server*/
#include <stdio.h>
#include <winsock.h>

#pragma comment (lib , "wsock32.lib" )

#define PORT   7777
#define IP      "192.168.0.224"      
#define MAX_PACKETLEN       512

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(2, 2), &wsaData) != 0)   //윈속사용
       {
              printf( "error\r\n" );
               return 0;
       }

       sSock = socket( AF_INET, SOCK_STREAM , 0); //소켓 생성
        if (sSock == INVALID_SOCKET )
       {
               return 1;
       }

       memset(&sAddr, 0, sizeof( 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 2;
       }
       memset(&sAddr, 0, sizeof( SOCKADDR_IN ));
       iLen = sizeof( SOCKADDR_IN );

       cSock = accept(sSock, ( SOCKADDR*)&sAddr, &iLen);        //sAddr "재활용"

        //상대방 들고오는 아이피 정보
        if (cSock == INVALID_SOCKET )
       {
              printf( "Accept Error\n" );
              closesocket(sSock);
              WSACleanup();
               return 1;
       }
       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" ))            //s/w종료시킬 조건문
              {
                     printf( "Quit\n" );
                      break;
              }

       }
       closesocket(cSock);
       closesocket(sSock);
       WSACleanup();

        return 0;
}




/*client*/
#include <stdio.h>
#include <winsock.h>

#pragma comment (lib , "wsock32.lib" )

#define PORT   7777
#define IP      "192.168.0.224"      
#define MAX_PACKETLEN       512

int main(void )
{
        WSADATA wsaData;
        SOCKET sSock;
        SOCKET cSock;
        SOCKADDR_IN cAddr;
        int status;
        int iLen;

        char cBuf[ MAX_PACKETLEN ];

        if (WSAStartup( MAKEWORD(2, 2), &wsaData) != NO_ERROR)
       {
               return 1;
       }

       cSock = socket( AF_INET, SOCK_STREAM , 0);
        if (cSock == INVALID_SOCKET )
       {
               return 1;
       }

       memset(&cAddr, 0, sizeof( 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 (status == SOCKET_ERROR )
       {
              printf( "Connect Error\n" );
               return 3;
       }
        while (1)
       {
              memset(cBuf, 0, MAX_PACKETLEN );
              printf( ">" );
              fgets(cBuf, MAX_PACKETLEN , stdin );
              iLen = strlen(cBuf);
               //cSock = strcmp(cBuf,"quit");
              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