728x90

이번엔 Winsock을 사용하여 Clinet를 간단하게 만들어 볼 생각이다.

지난번 작성한 Server 코드에 비하면 굉장히 간단하다.

Client 프로그램을 만드는 순서는 아래와 같다.

  1. Winsock을 초기화합니다.
  2. 소켓을 만듭니다.
  3. 서버에 연결합니다.
  4. 데이터를 보내고 받습니다.
  5. 연결 끊기를 선택합니다.

Server를 만드는 부분에서 bind, listen, accept과 같은 부분들이 빠져있다. 

Client 소켓을 생성하고 연결 할 IP,Port등을 통해 연결을 시도하면 된다.

 

1,2,4,5번은 이 전 포스트와 동일하므로 생략하도록 하겠다.

 

서버에 연결합니다.

우선 연결할 Socket 하나를 생성한다.

 

접속 요청할 소켓의 정보(address family, IP, Port)를 SOCKADDR_IN 구조체에 저장한다.

 

위에서 저장한 정보를 토대로 connect 함수를 호출한다.

 

정상적으로 함수가 호출되었다면 Server와 연결이 된 상황이라고 볼 수 있다.

 

따라서 이제 socket을 이용하여 데이터를 송/수신 할 수 있다.

	/*...*/
	SOCKET socket = ::socket(AF_INET, SOCK_STREAM, 0);

	SOCKADDR_IN client_addr;
	memset(&client_addr, 0, sizeof(SOCKADDR_IN));

	client_addr.sin_family = AF_INET;
	client_addr.sin_port = htons(7777);
	inet_pton(AF_INET, "127.0.0.1", &client_addr.sin_addr);

	connect(socket, reinterpret_cast<SOCKADDR*>(&client_addr), sizeof(client_addr));
    /*...*/

 

전체 코드는 아래와 같다.

서버에 비해 굉장히 간단하여 금방 알 수 있을것 같다.

 

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

int main()
{
	WSADATA wsadata;
	WSAStartup(MAKEWORD(2, 2), &wsadata);

	SOCKET socket = ::socket(AF_INET, SOCK_STREAM, 0);

	SOCKADDR_IN client_addr;
	memset(&client_addr, 0, sizeof(SOCKADDR_IN));

	client_addr.sin_family = AF_INET;
	client_addr.sin_port = htons(7777);
	inet_pton(AF_INET, "127.0.0.1", &client_addr.sin_addr);

	connect(socket, reinterpret_cast<SOCKADDR*>(&client_addr), sizeof(client_addr));
	
	char sendBuff[100] = { 0, };
	while (1)
	{
		const char * tempbuff = "Hello World";
		int len = strlen(tempbuff);
		printf("len = %d\n", len);

		send(socket, tempbuff, len, 0);

		memset(sendBuff, 0, sizeof(sendBuff));
		len = recv(socket, sendBuff, 100, 0);
		
		printf("recv from server : %s\n", sendBuff);
	}

	WSACleanup();
}

'Development > Network' 카테고리의 다른 글

멀티프로세싱, 멀티쓰레딩, 멀티플렉싱  (1) 2022.10.03
[Windows Socket] - Server  (0) 2022.09.08
[Windows Socket] - 시작하기  (0) 2022.09.08
복사했습니다!