본문 바로가기

TCP-IP 소켓 프로그래밍

전화기로 소켓(Socket) 프로그래밍을 이해해보자

들어가며


네트워킹 프로그래밍을 하기위해선 물리적인 연결과 소프트웨어 송/수신 방법이 필요하다. 물리적인 연결은 오늘날 인터넷이라는 네트워크로 연결되어있어 신경 쓸 필요없다. 그럼 소프트웨어 송/수신은 어떻게 진행해야할까? 소프트웨어 송/수신 또한 각 운영체제에선 소켓(Socket)이라는 것을 제공해 이것 또한 신경 쓸 필요없다.

그럼 소켓이란 무엇일까?

보통 이러한 콘센트(소켓)에 전력망에서 전기를 받기위해 플러그를 꽃는다. 이것과 같이 정보를 받기위해선 네트워크망에 "연결"해야한다. 우리는 네트워크에 연결하기위해 소켓을 사용한다.

 

전화를 이용해 소켓 이해하기


소켓 API

소켓의 동작엔socket, bind, listen, connect, accept, send, recv, close 총 8개가 존재한다. 이것들을 전화에 빗대어 이해해보고 간단히 함수의 형태만 알아보자.

 

※ 예시 코드는 윈도우 함수를 사용해 설명합니다.

socket

Q. 전화를 받으려면 뭐가 필요해??
A. 전화기가 필요하지.

맞다. 전화를 위해선 전화기가 필요하다. 우리는 네트워크 통신을 하기위해선 소켓이 필요하다! 

socket 생성은 전화기를 장만하는 것과 같다고 할 수 있다.

 

소켓 생성 함수

#include <winsock2.h>

SOCKET socket(int af, int type, int protocol);

 → 성공 시 소켓 핸들을 반환하지만 실패 시 INVALID_SOCKET을 반환한다.

 

bind

Q. 전화번호가 뭐야??
A. 내 전화번호는 010-1234-1234야.

전화기엔 모두 각각의 전화번호가 존재한다. 소켓은 IP와 포트번호라는 전화번호를 가지고 있다.

bind는 소켓에게 전화번호를 할당하는 함수이다.

 

bind 함수

#include <winsoock2.h>

int bind(SOCKET s, const struct sockaddr* name, int namelen);

성공 시 0을 반환하고, 실패 시 SOCKET_ERROR를 반환한다.

 

 

listen

Q. 전화기가 동작하지않아...
A. 케이블을 연결해줘야지!!

케이블이 설치되지 않은 전화기는 아무것도할 수 없다. 케이블은 연결하는 순간 전화기는 전화를 받을 수 있는 상태에 놓인다. 소켓 또한 listen을 통해 연결 요청이 가능한 상태로 만들어주어야한다.

 

listen함수

#include <winsock2.h>

int listen(SOCKEt s, int backlog);

성공 시 0, 실패시 SOCKET_ERROR를 반환한다.

 accept

Q. 전화가 왔나봐... 전화기가 울리고있어! 어떡하지?
A. 전화를 받아...!!

전화기가 울리고있다. 전화를 받으면 된다. 소켓에서 전화를 받기위해, 연결을 받기 위해선 accept함수를 사용한다.

 

accept함수

#include <winsock2.h>

SOCKET accept(SOCKET s, struct sockaddr* addr, int* addlen);

→ 성공 시 소켓 핸드, 실패 시 INVALID_SOCKET를 반환한다.

 

send,recv, close

Send,Recv 그리고 Close는 굳이 빗대어 설명하지 않아도 될 것이라고 생각한다. Send는 말하는 것, Recv는 듣는 것이기때문이다.

Send 함수

#include <winsock2.h>

int send(SOCKET s, const char* buf, int len, int flags);

→ 성공 시 전송된 바이트 수, 실패 시 SOCKET_ERROR를 반환한다.

 

Recv함수

#include <winsock2.h>

int recv(SOCKET s, const char* buf, int len, int flags);

→ 성공 시 수신한 바이트 수, 실패 시 SOCKET_ERROR를 반환한다.

 

close함수

#include<winsock2.h>

int closesocket(SOCKET s);

→ 성공 시 0, 실패 시 SOCKET_ERROR를 반환한다.

 

connect

말 그대로 전화를 거는 것이다. 전화를 받을 준비(listen)이 되어있는 전화기에 전화를 거는 행위이다.

 

Connect 함수

#include <winsock2.h>

int connect(SOCKET s, const struct sockaddr* name, int namelen);

→ 성공 시 0, 실패 시 SOCKET_ERROR를 반환한다. (EOF는 0을 반환)

 

 

마무리


이렇게 전화기에 빗대어 소켓 프로그래밍을 공부해봤다. 처음 소켓 프로그래밍을 접했을 땐, 이게 무슨말이지..? 하며 힘들어해 여러 설명을 찾아보았다. 식당을 예시로 드는 강의도 있었고, 무전기로 예시를 드는 설명도 있었지만, 전화기를 이용한 설명도 나쁘지 않은 것 같다.

 

참고