728x90
이번엔 Winsock을 사용하여 Clinet를 간단하게 만들어 볼 생각이다.
지난번 작성한 Server 코드에 비하면 굉장히 간단하다.
Client 프로그램을 만드는 순서는 아래와 같다.
- Winsock을 초기화합니다.
- 소켓을 만듭니다.
- 서버에 연결합니다.
- 데이터를 보내고 받습니다.
- 연결 끊기를 선택합니다.
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 |