본문 바로가기
Programming/etc

TCP/IP Socket programming

by 제타 2018. 4. 17.
반응형

소켓 프로그래밍은 요즘 대학교 네트워크 과목에서 배우지만 웹 개발을 많이 하는 요즘 듣기가 어렵다. 그래도 인프라를 하려면 어느 정도를 알고 있어야 한다.

소켓 프로그래밍은 흔히 전화기랑 많이 빗대는데 가령 서버측에서 전화기를 만들고 전화번호를 할당하고 수화기를 놓고 기다리면 클라이언트 측에서 전화번호를 누르고 전화를 거는 방식과 같다고 보면된다.
리눅스와 윈도우에서 함수명 등 표준에 있어서 차이가 조금 있지만 흐름은 거의 비슷하다.

서버 측
#include <sys/socket.h>
1. int socket(int domain, int type, int protocol); //소켓생성
2. int bind(int sockfd, struct sockaddr *myaddr, socklen_t addrlen); //주소할당
- 소켓의 주소 정보에는 ip와 port가 들어있다.
3. int listen(int sockfd, int backlog); //연결 받을 준비
- 소켓에 할당된 ip와 port로 연결받을 준비를 한다.
4. int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen); //연결 요청 수락
- accept 함수 호출 후에 데이터의 전송이 가능해짐.

즉 소켓을 만들고 -> ip와 port를 할당하고 -> 연결 받을 준비를 하고 -> 연결 수락을 하는 과정이 된다. 이는 socket -> bind -> listen -> accept 함수의 순서이다.
즉 서버에서 이런 과정을 한다고 보면 된다.


클라이언트 측
#include <sys/socket.h>
1. int connect(int sockfd, struct sockaddr *serv_addr, socklen_t addrlen); // 연결 요청
- 클라이언트는 서버에 연결을 시도하기만 하면 된다.


윈도우 기반에서는 winsock이라는 것이 따로 있다
#include <winsock2.h>
int WSAStartup(WORD wVersionRequested, LPWSADATA lpWSAData); //윈속의 초기화
- wVersionRequested는 윈속 버전, lpWSAData는 구조체 변수의 주소 값이다
윈속의 초기화란 윈속 함수호출을 위한 라이브러리의 메모리 로드를 의미한다.
int WSACleanup(void); //윈속 라이브러리 해제
- 마지막에 메모리 반환해주는 역할

1. int socket(int af, int type, int protocol); //소켓 생성
2. int bind(SOCKET s, const struct sockaddr * name, int namelen); //주소 할당
3. int listen(SOCKET s, int backlog); // 연결받을 준비
4. SOCKET accept(SOCKET s, struct sockaddr * addr, int * addrlen); //연결 요청 수락

1. int connect(SOCKET s, const struct sockaddr * name, int namelen); //연결 요청
2. int closesocket(SOCKET s); //리눅스에서는 소켓을 파일로 보기때문에 close를 해줘야함. 윈도우에서 이에 대응하는 것이 closesocket이다.

윈도우에서는 리눅스와 다르게 데이터 전송을 위한 별도의 입출력 함수를 사용한다. 파일과 소켓을 분리한다고 보면 된다.
int send(SOCKET s, const char * buf, int len, int flags); // 전송
int recv(SOCKET s, const char * buf, int len, int flags); //수신

반응형