Study/C++
[TCP] TCP - Server
Loafly
2020. 11. 6. 17:39
728x90
(1) TCP 란?
Transmission Control Protocol의 축약어로 컴퓨터가 다른 컴퓨터와 데이터 통신을 하기 위한 규약(프로토콜)의 일종이다.
(2) TCP 특징
-
연결형 서비스로 가상 회선 방식을 제공
-
3-way handshaking과정을 통해 연결을 설정하고 4-way handshaking을 통해 해제
-
흐름 제어 및 혼잡 제어
-
높은 신뢰성을 보장
-
UDP보다 속도가 느림
(3) Code - Server
#include <winsock2.h>
#include <iostream>
#pragma comment(lib, "ws2_32.lib")
using namespace std;
void ErrorHandling(string message);
#define PORT 1000
#define BUFFER_SIZE 1024
int main()
{
WSADATA wsaData;
SOCKET hServSock, hClntSock;
SOCKADDR_IN servAddr, clntAddr;
memset(&wsaData, 0x00, sizeof(WSADATA));
memset(&hServSock, 0x00, sizeof(SOCKET));
memset(&hClntSock, 0x00, sizeof(SOCKET));
memset(&servAddr, 0x00, sizeof(SOCKADDR_IN));
memset(&clntAddr, 0x00, sizeof(SOCKADDR_IN));
bool bAccept = false;
bool bBind = false;
int szClntAddr = 0;
bool bBind = false;
while (1)
{
if (!bAccept)
{
if (!bBind)
{
// 윈속 초기화, 소켓사용하기전 초기화 해야함
if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0)
ErrorHandling("WSAStartup() error!");
// TCP 소켓생성
hServSock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
int opt = 1;
ioctlsocket(hServSock, FIONBIO, (u_long*)&opt);
if (hServSock == INVALID_SOCKET)
ErrorHandling("socket() error!");
servAddr.sin_family = AF_INET;
servAddr.sin_addr.s_addr = htonl(INADDR_ANY); // 현재 PC IP주소 사용
servAddr.sin_port = htons(PORT); // 포트번호
// 주소 지정
if (bind(hServSock, (SOCKADDR*)&servAddr, sizeof(servAddr)) == SOCKET_ERROR)
ErrorHandling("bind() error!");
bBind = true;
}
else
{
// 접속 받을수 있게
if (listen(hServSock, 5) == SOCKET_ERROR)
ErrorHandling("listen() error!");
// 연결 수락
szClntAddr = sizeof(clntAddr);
hClntSock = accept(hServSock, (SOCKADDR*)&clntAddr, &szClntAddr);
if (hClntSock == INVALID_SOCKET)
ErrorHandling("accept() error!");
else
bAccept = true;
}
}
else if (bBind && bAccept)
{
char cBuffer[BUFFER_SIZE] = {};
int size = 0;
size = recv(hClntSock, cBuffer, BUFFER_SIZE, 0);
if (size > 0)
{
cout << cBuffer << endl;
}
}
}
return 0;
}
void ErrorHandling(string message)
{
cout << message << endl;
}
반응형