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 |