티스토리 뷰

지난 포스팅에서는 서버클래스의 소스코드에 대해서 살펴보았다. 이번에는 클라이언트 클래스의 소스코드에 대하여 살펴보고 알아보는 시간을 가져보겠다.

1
2
3
4
5
6
7
8
9
CClientSocket::CClientSocket(SOCKET sock) : mSock(sock)
{
}
 
 
CClientSocket::~CClientSocket()
{
    Close();
}
cs


생성자와 소멸자는 이전에 포스팅 했던 서버.cpp의 내용과 동일하니 코드만 올려놓고 설명은 생략하겠다.

궁금한 사람은 이전 포스팅 http://andrew0409.tistory.com/99 를 참조하시면 되겠다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
bool CClientSocket::Create()
{
    if (IsValid() == true)
        return true;
 
    mSock = ::socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    return mSock != INVALID_SOCKET;
}
 
void CClientSocket::Close()
{
    if (IsValid() == true)
    {
        ::closesocket(mSock);
        mSock = INVALID_SOCKET;
    }
}
cs

Create 함수와 Close 함수또한 기존의 코드와 동일하다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
bool CClientSocket::Connect(const char *ip, unsigned short port)
{
    if (IsValid() == false)
        return false;
 
    sockaddr_in addr{ };
 
    addr.sin_addr.S_un.S_addr = inet_addr(ip);
    addr.sin_family = AF_INET;
    addr.sin_port = htons(port);
 
    int ret = ::connect(mSock, (sockaddr*)&addr, sizeof(addr));
 
    if (ret == SOCKET_ERROR)
        Close();
 
 
    return ret != SOCKET_ERROR;
}
cs

이전 포스팅에서 서버는 listen->accept 를 한다고 이야기 했었다. 클라이언트의 접속을 받을 준비가 된 서버에 connect로 접근하고 그 결과를 bool값으로 반환하는 함수가 connect이다.

마지막으로 가장 중요하다고 할 수 있는 Send 함수와 Recv 함수이다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
 
int CClientSocket::Send(const char *buf, int size)
{
    if (IsValid() == false)
        return SOCKET_ERROR;
 
    return ::send(mSock, buf, size, 0);
}
 
int CClientSocket::Recv(char *buf, int size)
{
    if (IsValid() == false)
        return SOCKET_ERROR;
 
    return ::recv(mSock, buf, size, 0);
}
cs


코드 자체는 무척이나 단순하다 왜냐하면 매개변수로 전부 전달받기 때문이다.

전달받은 매개변수를 다시 전달하고 그 결과를 반환하는 식인데, 반환값은 두 함수 모두 int형으로 ::send함수로 보낸 데이터가 몇바이트인지, ::recv함수로 전달받은 데이터가 몇 바이트인지를 반환한다.


특이하게도 이 두 함수 내부에 있는 ::send와 ::recv함수는 전달인자가 서로 같은데 어떤 소켓을 통하여 전달할지(받을지), 그리고 어떤 버퍼를 사용할 것인지, 얼마만큼 보낼(받을)것인지를 입력할 수 있다.


사실 서버와 클라이언트의 클래스 함수 자체는 어렵지 않다. 이 클래스를 토대로 메인을 어떻게 구성하느냐가 중요하다고 할 수 있다. 다음 포스팅에서는 마지막으로 메인예제를 몇개 다루어 볼 예정이다.

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
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
글 보관함