[소켓 프로그래밍 C언어] 기본적인 서버 프로그램 만들기 (리눅스, 유닉스 편) server 관련 함수 및 소스코드 (tistory.com)
책으로만 공부하다가 너무 막혀서 잘 써져있는 블로그를 통해 공부해보기로 했다.
1. socket()
#include <sys/types.h>
#include <sys/socket.h>
int socket(int domain, int type, int protocol);
Returns: nonnegative descriptor if OK, −1 on error
소켓을 생성하는 함수이다.
int domain : 어떤 영역에서 통신할 것인지에 대한 영역을 지정한다. AF_UNIX (프로세스끼리 통신할 때), AF_INET (IPv4), AF_INET6 (IPv6) 를 넣을 수 있다.
int type : 어떤 서비스 타입의 소켓을 생성할 것인지를 적는다. SOCK_STREAM (TCP), SOCK_DGRAM (UDP), SOCK_RAW (Raw방식;TCP나 UDP를 사용하지 않은 채로 바로 IP계층 사용 시)
int protocol : 소켓 방식에서 사용할 프로토콜 (IPPROTO_TCP : TCP방식, IPPROTO_UDP : UDP방식, 0:type에서 미리 정해진 경우)
리턴 값 :: 성공 시 : 0 (소켓 디스크립터) // 실패 시 : -1 (소켓 생성 실패)
(인자는 getaddrinfo 함수로 넣을 수 있다.)
2. bind()
#include <sys/socket.h>
int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
Returns: 0 if OK, −1 on error
소켓이랑 서버의 정보를 묶어주는 함수이다.
클라이언트랑 서버랑 통신하기 위해서는 비단 IP뿐 아니라, 디스크립터까지 필요하다. 그래서 디스크립터랑 IP를 묶어주는 작업을 수행한다.
int sockfd : 위의 socket()함수에서 받은 리턴값 (소켓 디스크립터) 를 넣어주면 된다.
struct sockaddr *myaddr : 서버의 IP 주소를 넣어준다.
socklen_t addrlen : 주소 길이를 넣어준다. (컴퓨터는 어디까지가 IP이고 어디부터가 다른 데이터인지 모르기때문에 항상 길이를 지정해줘서, 여기까지가 IP라는 것을 알려주어야한다.)
리턴값 :: 성공 시 : 0 // 실패 시 : -1
3. listen()
#include <sys/socket.h>
int listen(int sockfd, int backlog);
Returns: 0 if OK, −1 on error
외부의 컴퓨터에서 요청이 왔을 때, 수락할 수 있게 대기상태로 들어가는 함수이다. (서버가 돌아가고, 외부로부터 connect 요청이 오지 않으면 무한반복으로 실행될 것이다,)
int sockfd : bind()와 같이 서버의 소켓디스크립터가 들어간다.
int backlog : 연결 대기열의 크기를 지정한다. 어떤 클라이언트가 이미 서버와 작업중이라면, 다른 클라이언트는 작업이 끝날 때까지 기다리고 있어야 한다. listen()은 그런 클라이언트를 대기시키는 역할도 수행한다.
리턴값 :: 성공 시 : 0 // 실패 시 : -1
4. accept()
#include <sys/socket.h>
int accept(int listenfd, struct sockaddr *addr, int *addrlen);
Returns: nonnegative connected descriptor if OK, −1 on error
서버 소켓에다가 클라이언트를 연결하는 함수이다. 그렇기때문에 이제 클라이언트 정보도 들어가게 된다.
int sockfd : 역시 서버 소켓 디스크립터를 넣어준다.
struct sockaddr *addr : 클라이언트 주소 정보를 담고 있는 구조체
socklen_t *addrlen : 위 구조체의 길이
'프로그래밍 공부 > CSPP' 카테고리의 다른 글
[C언어, 웹서버] HostInfo (0) | 2021.01.24 |
---|---|
[C언어, 웹서버] client 관련 함수 (0) | 2021.01.24 |
11.3 글로벌 IP 인터넷 (0) | 2021.01.22 |
11.1 클라이언트-서버, 11.2 네트워크 (0) | 2021.01.22 |
9.9.12 종합 설계 : 간단한 할당기의 구현 (수정중) (0) | 2021.01.17 |
댓글