티스토리 뷰

소켓을 연결해서 통신을 하려면 기본적으로 서버와 클라이언트가 필요하다.
또한 서버는 하나 뿐만이 아니라 여러 클라이언트에서의 연결을 계속적으로 받고, 처리하기 위해서 쓰레드를 사용해야한다. 아래에는 클래스로 만들어둔 서버와 클라이언트의 기본이되는 소스코드를 첨부하겠다. 편의를 위해서 모든 멤버변수는 public으로 처리하였다.

들어가기에 앞서 App 클래스의 InitInstance 함수 내에서

1
2
    WSADATA data;
    ::WSAStartup(MAKEWORD(22), &data);
cs

위 코드를 사용하여 WSADATA를 반드시 스타트 업 시켜야 한다. 이 작업을 빼먹으면 소켓을 아무리 잘 짜놓더라도 프로그램이 동작하지 않는다. 더불어 할당을 했으면 반드시 해제를 해야하는데 ExitInstance 함수에서 해제를 하면 되겠다. 해제 코드는 다음과 같다. 참고로 대화상자(Dialog)기반의 프로젝트를 생성했다면 ExitInstance 함수가 없을 수 도 있는데 그럼 클래스 마법사에서 가상함수로 만들어주면 된다.

1
    ::WSACleanup();
cs

다음으로 소스코드를 살펴보자. 우선 이번 게시글에서는 헤더파일에 대한 부분만 다루어 보겠다.

<CServerSocket.h>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#pragma once
class CServerSocket
{
public:
    CServerSocket(SOCKET sock = INVALID_SOCKET);
    ~CServerSocket();
 
    bool Create(unsigned short port, const char*ip = nullptr);
    SOCKET Accept(sockaddr_in *addr = nullptr, int *addrSize = nullptr);
    void Close();
    bool IsValid() { return mSock != INVALID_SOCKET; }
 
public:
    SOCKET mSock;
};
cs


우선 기본적으로 서버가 될 SOCKET 타입의 mSock을 선언하고, 생성자와 default parameter를 통하여 초기화를 시킨다.


멤버함수로는 우선 서버에대한 환경을 잡아서 Accept 이전 단계까지 진행하고 그 결과를 bool값으로 반환하는 Create 함수가 가장 먼저 있다. 설정할 ip주소와 포트번호를 매개변수로 사용한다.


Create를 통하여 소켓이 생성되었다면 이를 통하여 Accept할수 있는 별도의 멤버함수가 필요하며 매개변수에 default parameter를 설정해준다.


마지막으로 서버를 종료하는 Close함수가 필요하다.


추가적으로 IsValid라는 함수를 인라인으로 선언해서 사용했는데 이 함수는 현재 소켓이 생성되었는지 여부를 bool 값으로 반환한다.


서버클래스의 헤더에 대하여 살펴보았다. 다음으로 클라이언트 클래스의 헤더부분을 살펴보겠다.


<CClientSocket.h>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#pragma once
class CClientSocket
{
public:
    CClientSocket(SOCKET sock = INVALID_SOCKET);
    ~CClientSocket();
    
    void Attach(SOCKET sock);
    bool Create();
    bool Connect(const char *ip, unsigned short port);
    bool IsValid() { return mSock != INVALID_SOCKET; }
    void Close();
    int Send(const char *buf, int size);
    int Recv(char *buf, int size);
 
public:
    SOCKET mSock;
};
cs

서버와 마찬가지로 클라이언트가 될 소켓인 mSock를 선언하고 생성자와 default parameter를 통하여 초기화를 진행한다.

Attach 함수는 기존의 소켓을 매개변수로 전달받은 소켓으로 바꿔준다.
Win32 프로그래밍에서 dc.Attach를 생각하면 이해가 쉬울지도 모르겠다.

Create 함수는 서버에서의 Create와 마찬가지로 소켓을 생성하고 Connect하기 이전 단계까지 진행해준다. 소켓이 정상적으로 생성되었는지 여부를 bool 값으로 반환한다.

Connect 함수를 통하여 만들어진 서버 소켓과 연결 할 수 있고 그 결과를 bool 값으로 반환한다.

IsValid 함수와 Close 함수는 서버클래스의 함수와 기능이 같다.

Send 함수는 서버로 buf 변수를 size크기만큼 보내는 함수이고
Recv 함수는 서버로부터 buf함수에 size크기만큼의 데이터를 받아오는 함수이다. 두 함수 모두 보낸(받은) 데이터의 크기를 반환값으로 반환한다.

간단하게 서버클래스와 클라이언트 클래스의 헤더에 대해서 살펴보았는데, 다음 포스팅에서는 cpp파일 소스코드를 가지고 자세하게 설명하도록 하겠다.


댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함