티스토리 뷰
반응형
이어서 UDP Echo 클라이언트 소스 입니다.
빈 프로젝트를 새롭게 여신 후 아래 코드를 입력 합니다.
LocalClient.h
#pragma once
// Window Socket API를 사용하기 위해 헤더 선언.
#include <WS2tcpip.h>
// 본 프로젝트에 Window Socket 라이브러리를 적용시킨다.
#pragma comment(lib, "ws2_32.lib")
#define MAX_BUFFER 1024
class LocalClient
{
public:
LocalClient();
~LocalClient();
int InitSocket(const char* ip, int port);
int Running();
WSADATA wsaData;
SOCKET hClient;
SOCKADDR_IN servAddr;
int nservAddr;
};
LocalClient.cpp
#include "LocalClient.h"
#include <iostream>
LocalClient::LocalClient()
{
hClient = 0;
nservAddr = 0;
memset(&servAddr, 0x00, sizeof(SOCKADDR_IN));
}
LocalClient::~LocalClient()
{
}
int LocalClient::InitSocket(const char* ip, int port)
{
// 윈도우 소켓 초기화 버전 2,2
if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0)
{
printf("윈도우 소켓 초기화 실패\r\n");
return -1;
}
// UDP 소켓을 생성
hClient = socket(PF_INET, SOCK_DGRAM, 0);
if (hClient == INVALID_SOCKET)
{
printf("소켓 생성 실패\r\n");
return -1;
}
memset(&servAddr, 0, sizeof(servAddr));
servAddr.sin_family = AF_INET;
inet_pton(AF_INET, ip, &servAddr.sin_addr);
servAddr.sin_port = htons(port); // PORT 번호를 설정해 줍니다.
return 0;
}
int LocalClient::Running()
{
bool isExit = false;
char sendData[MAX_BUFFER] = { 0, };
char recvData[MAX_BUFFER] = { 0, };
nservAddr = sizeof(servAddr);
while (!isExit)
{
// 항상 보낼 데이터를 비워줍니다.
memset(sendData, 0x00, sizeof(sendData));
memset(recvData, 0x00, sizeof(recvData));
nservAddr = sizeof(servAddr);
// 키보드 입력 전에 버퍼를 비워줍니다.
//fflush(stdin);
fseek(stdin, 0, SEEK_END);
// 키보드로부터 보낼 데이터를 입력 받습니다.
if (scanf_s("%[^\n]", sendData, MAX_BUFFER) == 0)
{
continue;
}
// 데이터를 전송합니다.
sendto(hClient, sendData, strlen(sendData), 0, (SOCKADDR*)&servAddr, sizeof(servAddr));
// 데이터를 수신 합니다.
recvfrom(hClient, recvData, MAX_BUFFER, 0, (SOCKADDR*)&servAddr, &nservAddr);
printf(recvData);
printf("\r\n"); // 엔터를 넣어줍니다.
if (sendData[0] == 'b' && sendData[1] == 'y' && sendData[2] == 'e' && strlen(sendData) == 3)
{
// bye 데이터를 보냈다면 프로그램을 종료 합니다.
isExit = true;
continue;
}
}
closesocket(hClient);
return 0;
}
main.cpp
#include <iostream>
#include "LocalClient.h"
int main()
{
LocalClient echoClient;
if (echoClient.InitSocket("127.0.0.1", 9123) == -1)
{
return -1;
}
echoClient.Running();
return 0;
}
UDP 서버 와 같이 패킷 송.수신은 send, recv 함수에서 sendto, recvfrom 함수로 변경해서 사용했습니다.
TCP 클라이언트와 달리 connect함수를 사용하지 않습니다.
소켓 생성 시 SOCK_STREAM 대신 SOCK_DGRAM를 사용합니다.
이제 두 개 프로젝트를 실행 합니다.
반응형
'윈도우 프로그램 > 소켓 프로그램' 카테고리의 다른 글
UDP 소켓 프로그램 - Echo 서버 (0) | 2020.09.16 |
---|---|
TCP 소켓 프로그램 - Echo 클라이언트 (0) | 2020.09.15 |
TCP 소켓 프로그램 - Echo 서버 (0) | 2020.09.15 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- uwp textblock
- _beginthreadex 예제
- 에코서버
- 비주얼 스튜디오
- 큐 리스트
- echo tcp client
- C++ 쓰레드
- program
- c++
- 솔라나
- Visual Studio
- 윈도으 템플릿
- uwp button
- uwp textbox
- UDP 클라이언트
- 프로그램
- SOL
- UDP Socket
- tcp echo server
- uwp
- UDP Echo Server
- 에코 클라이언트
- echo server
- 토큰
- TCP 서버
- 채팅
- C#
- SPL-TOKEN
- C
- UDP 소켓 프로그램
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
글 보관함