본문 바로가기

Programming/Windows Socket Programming

Basic model(Chat Client) - Code

ConsoleChatClient.cpp

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


DWORD WINAPI ReceiveThread(LPVOID pParam)
{
    //무한 수신을 해야한다. 종료되지 말고.
    SOCKET hSocket = (SOCKET)pParam;
    char szBuffer[32] = {0,};
    while(1) //종료되지 말아야 하니까 while루프..
    {
        memset(szBuffer,0,sizeof(szBuffer));
        ::recv(hSocket,szBuffer,sizeof(szBuffer),0); //여기도 recv함수가 블라킹이니까 한번 받고 한바퀴 돌고 다시 대기
        printf("From Server: %s\n", szBuffer);
    }
    return 0;
}

int _tmain(int argc, _TCHAR* argv[])
{
    //1. 윈속초기화
    WSADATA wsa = {0};
    if(::WSAStartup(MAKEWORD(2,2),&wsa) != 0)
    {
        puts("ERROR: 윈속초기화오류");
        return 0;
    }

    //2. 소켓생성
    SOCKET hSocket = ::socket(AF_INET,SOCK_STREAM,0);
    if(hSocket == INVALID_SOCKET)
    {
        puts("ERROR: 소켓생성오류");
        return 0;
    }

    //3. 서버 접속
    SOCKADDR_IN svaddr = {0};
    svaddr.sin_family            = AF_INET;
    svaddr.sin_port                = htons(21000);
    svaddr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
    if(::connect(hSocket,(SOCKADDR*)&svaddr,sizeof(svaddr)) == SOCKET_ERROR)
    {
        puts("ERROR: 서버 연결 오류");
        return 0;
    }

    //4. 메시지 송수신
    CreateThread(NULL,0,ReceiveThread,(LPVOID)hSocket,0,NULL);
    char szBuffer[32] = {0,};    
    while(1)
    {
        gets_s(szBuffer);
        if(strcmp(szBuffer,"EXIT") == 0)
        break;

        ::send(hSocket,szBuffer,strlen(szBuffer)+1,0);        //여기 Send함수도 블라킹함수이기 때문에 쏘면 한바퀴 돈다.
    }
    ::closesocket(hSocket);
    ::WSACleanup();

    return 0;
}

'Programming > Windows Socket Programming' 카테고리의 다른 글

IOCP model(Chat Server) - Code  (0) 2020.03.14
IOCP model(Server) - Idea  (0) 2020.03.14
Basic model(Client) - Idea  (0) 2020.03.01
Basic model(Chat Server) - Code  (0) 2020.03.01
Basic model(Server) - Idea  (0) 2020.03.01