[소켓 프로그래밍 C언어] 기본적인 클라이언트 프로그램 만들기 (리눅스, 유닉스 편 client) 관련 함수 및 소스코드 (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
'프로그래밍 공부 > CSPP' 카테고리의 다른 글
[C언어, 웹서버] open_clientfd / listen_clientfd (0) | 2021.01.24 |
---|---|
[C언어, 웹서버] HostInfo (0) | 2021.01.24 |
[C언어, 웹서버] server 관련 함수 및 소스코드 (0) | 2021.01.24 |
11.3 글로벌 IP 인터넷 (0) | 2021.01.22 |
11.1 클라이언트-서버, 11.2 네트워크 (0) | 2021.01.22 |
댓글