티스토리 뷰
반응형
이전 글 TCP 소켓 프로그램에서 조금만 손 보면 UDP 통신 프로그램을 만들 수 있습니다.
빈 프로젝트를 만든 후 아래와 같이 코드를 입력 합니다.
LocalServer.h
#define MAX_BUFFER 1024
class LocalServer
{
public:
// 기본 생성자와 소멸자
LocalServer();
~LocalServer();
int startServer(int _port);
int EchoData();
WSADATA wsaData;
SOCKET hSocket;
SOCKET hClientSocket;
SOCKADDR_IN servAddr;
SOCKADDR_IN cilentAddr;
int nclientAddr;
};
LocalServer.cpp
#include <iostream>
#include "LocalServer.h"
LocalServer::LocalServer()
{
hSocket = 0;
hClientSocket = 0;
memset(&servAddr, 0x00, sizeof(SOCKADDR_IN));
memset(&cilentAddr, 0x00, sizeof(SOCKADDR_IN));
nclientAddr = 0;
}
LocalServer::~LocalServer()
{
}
int LocalServer::startServer(int _port)
{
// 윈도우 소켓 초기화 버전 2,2
if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0)
{
printf("윈도우 소켓 초기화 실패\r\n");
return -1;
}
// UDP 연결을 받을 소켓을 생성.
hSocket = socket(PF_INET, SOCK_DGRAM, 0);
if (hSocket == INVALID_SOCKET)
{
printf("소켓 생성 실패\r\n");
return -1;
}
// 서버 주소 체계 초기화
memset(&servAddr, 0x00, sizeof(servAddr));
servAddr.sin_family = AF_INET;
inet_pton(AF_INET, "127.0.0.1", &servAddr.sin_addr); // 127.0.0.1 로컬 주소 입니다.
servAddr.sin_port = htons(_port); // SOCKET PORT를 지정해 준다.
// The bind function associates a local address with a socket.
// 생성한 소켓과 주소를 지정해 줍니다.
if (bind(hSocket, (SOCKADDR*)&servAddr, sizeof(servAddr)) == SOCKET_ERROR)
{
printf("bind 실패\r\n");
return -1;
}
printf("echo 서버 준비 완료\r\n");
return 0;
}
int LocalServer::EchoData()
{
// 프로그램을 종료 하기 위한 변수
bool isExit = false;
// 수신 받을 데이터 버퍼
char recvData[MAX_BUFFER] = { 0, };
int recvLen = 0;
while (!isExit)
{
// 수신 버퍼를 비워둡니다.
memset(recvData, 0x00, sizeof(recvData));
// 데이터를 수신을 기다립니다.
nclientAddr = sizeof(cilentAddr);
recvLen = recvfrom(hSocket, recvData, MAX_BUFFER, 0, (SOCKADDR*)&cilentAddr, &nclientAddr);
// 수신 받은 데이터가 bye인지 확인 합니다.
if (recvData[0] == 'b' && recvData[1] == 'y' && recvData[2] == 'e' && strlen(recvData) == 3)
{
// 수신 받은 데이터가 bye 일 경우 See You로 응답을 대신 후 프로그램을 종료 합니다.
sendto(hSocket, "See You", strlen("See You"), 0, (SOCKADDR*)&cilentAddr, sizeof(cilentAddr));
isExit = true;
continue;
}
// 수신 받은 데이터를 돌려 줍니다. ( ECHO 기능 )
sendto(hSocket, recvData, recvLen, 0, (SOCKADDR*)&cilentAddr, sizeof(cilentAddr));
}
// 소켓을 닫습니다.
closesocket(hSocket);
return 0;
}
반응형
main.cpp
#include <iostream>
#include "LocalServer.h"
int main()
{
// Echo Server 클래스를 선언 합니다.
LocalServer echoServer;
// 포트 번호 9123으로 UDP 서버를 초기화 합니다.
if (echoServer.startServer(9123) == -1)
{
return -1;
}
// ECHO 기능을 시작합니다.
echoServer.EchoData();
// 프로그램이 종료 됩니다.
printf("프로그램을 종료 합니다.\r\n");
return 0;
}
TCP와 다른 점은 소켓 생성 시 SOCK_STREAM 대신 SOCK_DGRAM 사용 그리고 listen를 사용하지 않습니다.
// UDP 연결을 받을 소켓을 생성.
hSocket = socket(PF_INET, SOCK_DGRAM, 0);
그리고 패킷 송.수신을 위하여 send, recv에서 sendto, recvfrom 함수를 사용하였습니다.
함수 사용에 대해서는 따로 정리하도록 하겠습니다.
이어서 클라이언트 소스를 확인해 보겠습니다.
반응형
'윈도우 프로그램 > 소켓 프로그램' 카테고리의 다른 글
UDP 소켓 프로그램 - Echo 클라이언트 (0) | 2020.09.16 |
---|---|
TCP 소켓 프로그램 - Echo 클라이언트 (0) | 2020.09.15 |
TCP 소켓 프로그램 - Echo 서버 (0) | 2020.09.15 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- uwp textbox
- C
- 토큰
- 에코 클라이언트
- uwp button
- 솔라나
- 비주얼 스튜디오
- program
- C#
- 프로그램
- tcp echo server
- 윈도으 템플릿
- _beginthreadex 예제
- uwp
- UDP 클라이언트
- UDP 소켓 프로그램
- UDP Socket
- echo server
- SOL
- 에코서버
- echo tcp client
- uwp textblock
- SPL-TOKEN
- C++ 쓰레드
- c++
- UDP Echo Server
- TCP 서버
- 큐 리스트
- Visual Studio
- 채팅
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
글 보관함