. [C언어, 웹서버] client 관련 함수
본문 바로가기
프로그래밍 공부/CSPP

[C언어, 웹서버] client 관련 함수

by 불냥이_ 2021. 1. 24.

[소켓 프로그래밍 C언어] 기본적인 클라이언트 프로그램 만들기 (리눅스, 유닉스 편 client) 관련 함수 및 소스코드 (tistory.com)

 

[소켓 프로그래밍 C언어] 기본적인 클라이언트 프로그램 만들기 (리눅스, 유닉스 편 client) 관련

안녕하세요! 저번 시간에는 기초적인 서버를 만들어서 제대로 동작하는지 테스트 하는 시간을 가졌었어요.ㅎㅎ 이제 서버가 있으니 오늘은 클라이언트를 만들어서 상호간 통신을 시켜보도록

jhnyang.tistory.com

이번에도 윗 포스팅을 보고 공부하도록 한다.

 클라이언트가 서버를 찾기 위해서는 IP주소 뿐 아니라 포트 번호도 필요하다. (포트 번호에 따라 서버가 제공하는 서비스가 달라질 수 있기 때문이다. 컨테이너선이 어항魚港을 찾아가면 어떻게 되겠는가?)

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()

 클라이언트는 bind()가 필요하지 않다. 정확히 말하면 connect 시에 커널이 바인드처리를 자동으로 해주기 때문에 따로 해주지 않아도 된다. 

 

3. connect()

#include <sys/socket.h>

int connect(int clientfd, const struct sockaddr *addr,socklen_t addrlen);
	Returns: 0 if OK, −1 on error

 서버에 연결을 요청한다. 서버가 listen() 중일 때, 연결요청이 들어가면 accept()로 넘어갈 것이다. (만약, 서버에 연결이 많아 대기 상태면 대기열로 들어가게 된다.)

int clinetfd : 위의 socket()에서 생성함 클라이언트 디스크립터를 넣어준다. 

const struct sockaddr *addr : 서버의 주소정보를 넣어준다. 서버 주소와 socket()에서 생성된 clientfd (클라이언트 (파일) 디스크립터) 를 묶어서 서버로 보내주면, 서버와 클라이언트는 해당 디스크립터에서 소통하기로 약속한다.

socklen_t addrlen : 주소 길이를 넣어준다.  (컴퓨터는 어디까지가 IP이고 어디부터가 다른 데이터인지 모르기때문에 항상 길이를 지정해줘서, 여기까지가 IP라는 것을 알려주어야한다.)

리턴값 :: 성공 시 : 0 // 실패 시 : -1

댓글