#include <sys/socket.h>
int socket(int domain, int type, int protocol);
소켓을 만드는 함수, 성공 시 파일 디스크립터, 실패 시 -1 반환
domain
어떤 프로토콜의 네트워크를 사용할지 지정
| 값 | 의미 |
|---|---|
AF_INET |
IPv4 인터넷 프로토콜 (가장 일반적) |
AF_INET6 |
IPv6 인터넷 프로토콜 |
AF_UNIX 또는 AF_LOCAL |
로컬 프로세스 간 통신 (Unix Domain Socket) |
AF_PACKET, AF_NETLINK, ... |
하위 네트워크 계층용 (비일반적) |
대부분 AF_INET 또는 AF_INET6 사용
type
데이터 통신의 방식/성격 지정
| 값 | 의미 |
|---|---|
SOCK_STREAM |
연결 지향형, 신뢰성 보장 (TCP) |
SOCK_DGRAM |
연결 없는 비신뢰성 전송 (UDP) |
SOCK_RAW |
직접 IP 패킷을 다루는 로우 소켓 |
SOCK_SEQPACKET |
순서 보장 + 메시지 기반 (일부 특수한 프로토콜에서 사용) |
SOCK_STREAM 또는 SOCK_DGRAM 사용
protocol
사용하고자 하는 프로토콜 지정
| 값 | 의미 |
|---|---|
0 |
기본 프로토콜 사용 (type에 따라 자동 선택됨) |
IPPROTO_TCP |
TCP 프로토콜 |
IPPROTO_UDP |
UDP 프로토콜 |
IPPROTO_ICMP |
ICMP (핑 등에서 사용) |
IPPROTO_RAW |
Raw 소켓용 |
int sockfd_tcp = socket(AF_INET, SOCK_STREAM, 0); // TCP 소켓
int sockfd_udp = socket(AF_INET, SOCK_DGRAM, 0); // UDP 소켓
#include <sys/socket.h>
int bind(int sockfd, struct sockaddr *myaddr, socklen_t addrlen);
IP 주소와 port를 소켓에 할당, 클라이언트 사이드의 경우 다른 클라이언트가 접속하지 않기 때문에 접속하기 위한 명시적인 고정 주소가 필요하지 않다. 따라서 커널이 connect()시 내부적으로 bind()를 생략한다. 이 때 클라이언트 소켓에 바인딩되는 포트를 단기 (ephemeral) 포트라고 한다.
sockfd
socket() 함수로 생성한 소켓의 fd, 이 소켓에 IP/포트를 연결하겠다는 의미임
myaddr
바인딩할 IP 주소와 포트 번호가 들어 있는 구조체 포인터
struct sockaddr_in addr;
addr.sin_family = AF_INET;
addr.sin_port = htons(8080);
addr.sin_addr.s_addr = htonl(INADDR_ANY);
bind(sockfd, (struct sockaddr*)&addr, sizeof(addr));
일반적으로 형변환을 통해 전달함 !!
| 구조체 타입 | 설명 |
|---|---|
sockaddr_in |
IPv4 주소를 위한 구조체 |
sockaddr_in6 |
IPv6 주소를 위한 구조체 |
sockaddr_un |
유닉스 도메인 소켓용 구조체 |
sockaddr |
위 구조체들의 공통 상위 타입 (인터페이스용으로 사용됨) |
sockaddr_in
#include <netinet/in.h>
#include <arpa/inet.h>
struct sockaddr_in {
sa_family_t sin_family; // 주소 체계 (AF_INET)
in_port_t sin_port; // 포트 번호 (16비트, 네트워크 바이트 순서)
struct in_addr sin_addr; // IP 주소 (4바이트)
char sin_zero[8]; // 구조체 크기 맞춤용 padding (항상 0으로 초기화)
};