Socket Programming

Kimbab1004·2024년 1월 29일
0

Server

목록 보기
5/7
post-thumbnail

Socket이란?

소켓은 전송 계층과 응용 프로그램 사이의 인터페이스 역할로 커널에서 관리하는 개념이다.
소켓을 이용해 전송 희망하는 데이터는 커널 버퍼에 복사되어 목적지 버퍼로 전송된다.

패킷은?

패킷은 네트워크를 통해 전송되는 데이터의 기본 단위이다.
소켓을 통해 서버와 패킷 송수신이 가능하다.

Server와 Client간 통신 단계

Client
1. 소켓 준비
2. 서버 주소로 Connect
Server
1.Listener 소켓준비
2.Bind(서버 주소/Port를 소켓에 연동)
3.Listen
4.Accept

Client

  1. 소켓 준비
	SOCKET clientSocket = ::socket(AF_INET, SOCK_STREAM, 0);
	if (clientSocket == INVALID_SOCKET)
	{
		int32 errCode = ::WSAGetLastError();
		cout << "Socket ErrorCode : " << errCode << endl;
		return 0;
	}
  1. 서버 주소로 Connect
//목적지 Server 주소 설정
	SOCKADDR_IN serverAddr; // IPv4
	::memset(&serverAddr, 0, sizeof(serverAddr));
	serverAddr.sin_family = AF_INET;
	::inet_pton(AF_INET, "127.0.0.1", &serverAddr.sin_addr);
	serverAddr.sin_port = ::htons(7777); // 80 : HTTP

//Connect
	if (::connect(clientSocket, (SOCKADDR*)&serverAddr, sizeof(serverAddr)) == SOCKET_ERROR)
	{
		int32 errCode = ::WSAGetLastError();
		cout << "Connect ErrorCode : " << errCode << endl;
		return 0;
	}

Server

  1. Listener 소켓준비
	// ad : Address Family (AF_INET = IPv4, AF_INET6 = IPv6)
	// type : TCP(SOCK_STREAM) vs UDP(SOCK_DGRAM)
	// protocol : 0
	// return : descriptor
	SOCKET listenSocket = ::socket(AF_INET, SOCK_STREAM, 0);
	if (listenSocket == INVALID_SOCKET)
	{
		int32 errCode = ::WSAGetLastError();
		cout << "Socket ErrorCode : " << errCode << endl;
		return 0;
	}
  1. Bind(서버 주소/Port를 소켓에 연동)
	SOCKADDR_IN serverAddr; // IPv4
	::memset(&serverAddr, 0, sizeof(serverAddr));
	serverAddr.sin_family = AF_INET;
	serverAddr.sin_addr.s_addr = ::htonl(INADDR_ANY); //< 니가 알아서 해줘
	serverAddr.sin_port = ::htons(7777); // 80 : HTTP

	if (::bind(listenSocket, (SOCKADDR*)&serverAddr, sizeof(serverAddr)) == SOCKET_ERROR)
	{
		int32 errCode = ::WSAGetLastError();
		cout << "Bind ErrorCode : " << errCode << endl;
		return 0;
	}
  1. Listen
	if (::listen(listenSocket, 10) == SOCKET_ERROR)
	{
		int32 errCode = ::WSAGetLastError();
		cout << "Listen ErrorCode : " << errCode << endl;
		return 0;
	}
  1. Accept
		SOCKADDR_IN clientAddr; // IPv4
		::memset(&clientAddr, 0, sizeof(clientAddr));
		int32 addrLen = sizeof(clientAddr);

		SOCKET clientSocket = ::accept(listenSocket, (SOCKADDR*)&clientAddr, &addrLen);
		if (clientSocket == INVALID_SOCKET)
		{
			int32 errCode = ::WSAGetLastError();
			cout << "Accept ErrorCode : " << errCode << endl;
			return 0;
		}

		char ipAddress[16];
		::inet_ntop(AF_INET, &clientAddr.sin_addr, ipAddress, sizeof(ipAddress));
		cout << "Client Connected! IP = " << ipAddress << endl;
        }

[TCP VS UDP] 차이점

TCP

  1. 연결을 위해 할당되는 논리적인 경로가 있다.
  2. 데이터 경계가 없음
  3. 전송 순서가 보장된다.
  4. 분실이 일어나면 책임지고 다시 전송한다. (신뢰성이 좋다.)
  5. 물건을 주고 받을 상황이 아니면 일부만 보낸다.
  6. 려할 것이 많으니 속도가 상대적으로 좋지 않다. (속도가 상대적으로 별로다.)

UDP

  1. 연결이라는 개념이 없다.
  2. 데이터 경계는 있다.
  3. 전송 순서가 보장되지 않는다.
  4. 분실에 대한 책임이 없다. (신뢰성이 좋지 않다.)
  5. 일단 무작정 보내고 생각한다.
  6. 단순하기 때문에 속도가 상대적으로 좋다. (속도가 상대적으로 빠르다.)

0개의 댓글