상세 컨텐츠

본문 제목

네트워크 프로그래밍 - TCP 소켓 프로그래밍의 시작

개발/Network

by 2021. 9. 12. 22:44

본문

반응형

네트워크 프로그래밍이란

소켓을 기반으로 프로그래밍을 하기 때문에 소켓 프로그래밍이라고도 한다.

네트워크로 연결된 둘 이상의 컴퓨터 사이에서의 데이터 송수신 프로그램의 작성을 의미함.

 

소켓은 네트워크(인터넷)의 연결 도구이자, 운영체제에 의해 제공되는 소프트웨어적인 장치이다.

소켓은 프로그래머에게 데이터 송수신에 대한 물리적, 소프트웨어적 세세한 내용을 신경쓰지 않게 한다.

 

소켓 프로그래밍에 사용되는 함수들을 알아보자

socket()

TCP 소켓은 전화기에 많이 비유한다고 한다. 전화를 거는 용도의 소켓과 전화를 수신하는 용도의 소켓 생성 방법이 각각 있다.

소켓을 생성하기 위해서는 socket함수를 호출하는데 C에서는 다음과 같다.

#include <sys/socket.h>
int socket(int domain, int type, int protocol);

bind()

전화기에는 전화번호가 부여되어야 전화를 할 수 있 듯, 소켓에는 주소정보를 할당해야한다. 주소정보는 IP와 포트번호로 구성된다.

이를 bind라는 함수를 통해서 다음과 같이 할당한다.

#include <sys/socket.h>
int bind(int sockfd, struct sockaddr *myaddr, socklen_t addrlen);

sockfd가 소켓 번호에 해당하고, myaddr이 주소이다.

listen()

소켓에서는 연결요청이 가능한 상태인지도 설정해주어야 한다. 발신 용도의 소켓은 연결요청 가능 상태의 소켓일 필요가 없고 수신하는 용도의 소켓에서만 필요하다.

#include <sys/socket.h>
int listen(int sockfd, int backlog);

listen함수가 상대방의 발신요청을 받는 역할을 한다.

accept()

전화기의 경우 상대방이 건 전화에 대해서 받거나 거절할 수 있다. 전화를 받아야 음성을 들을 수 있 듯 소켓에서도 연결요청이 수락되어야 데이터 송수신이 가능하다. 요청이 수락된 후 데이터의 송수신은 양방향으로 가능하다.

#include <sys/socket.h>
int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);

accept함수는 클라이언트가 서버에게 연결요청을 하였을 때 이를 받는 역할을 한다.

 

여기까지 총 4개의 함수를 통해서 간략하게 소켓의 생성 과정을 정리해보자.

  1. 소켓 생성 - socket 함수호출
  2. IP와 Port번호 할당 - bind 함수호출
  3. 연결요청 가능상태로 변경 - listen 함수호출
  4. 연결요청에 대한 수락 - accept 함수호출

일반적으로 서버(Server)는 연결요청을 허용하는 프로그램을 가리켜서 말하고, 서버는 연결을 요청하는 클라이언트보다 먼저 실행되어야 한다. 또한 클라이언트보다 복잡한 실행 과정을 거친다. 

 

위와 같은 소켓을 서버 소켓 혹은 리스닝 소켓이라고 부른다.

 

그렇다면 전화를 거는 역할을 하는 클라이언트 측의 소켓을 알아보자.

연결을 요청하는 소켓은 '소켓 생성'와 연결 요청'으로 구분된다.

연결을 요청하는 함수는 다음과 같다.

#include <sys/socket.h>
int connect(int sockfd, struct sockaddr *serv_addr, socklen_t addrlen);

 

반응형

관련글 더보기