728x90

(1) TCP 란?

Transmission Control Protocol의 축약어로 컴퓨터가 다른 컴퓨터와 데이터 통신을 하기 위한 규약(프로토콜)의 일종이다. 


(2) TCP 특징

  • 연결형 서비스로 가상 회선 방식을 제공

  • 3-way handshaking과정을 통해 연결을 설정하고 4-way handshaking을 통해 해제

  • 흐름 제어 및 혼잡 제어

  • 높은 신뢰성을 보장

  • UDP보다 속도가 느림

TCP 연결 과정


(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;
}

 

반응형

'Study > C++' 카테고리의 다른 글

[STL] Next_permutation 함수 (C++)  (0) 2020.11.27
[STL] Vector Container 기본 사용법  (0) 2020.10.21

+ Recent posts