#include <sys/types.h>
#include <sys/socket.h>
int socket(int domain, int type, int protocol);
// 성공 시 파일 디스크립터, 실패 시 -1을 리턴
// domain : 생성할 소켓이 통신을 하기 위해 사용할 프로토콜 체계를 설정
// type : 소켓이 데이터를 전송하는데 있어서, 사용하게 되는 전송 타입을 설정
// protocol : 두 호스트간에 통신을 하는데 있어서 특정 프로토콜을 지정하기 위해 사용
종류 | 설명 |
---|---|
PF_INET | IPv4 인터넷 프로토콜 |
PF_INET6 | IPv6 인터넷 프로토콜 |
PF_LOCAL | Local 통신을 위한 UNIX 프로토콜 |
PF_PACKET | Low Level Socket을 위한 인터페이스 |
PF_IPX | IPX 노벨 프로토콜 |
(1) SOCK_STREAM : 신뢰성 있는 순차적인 바이트 기반의 연결 지향 전송 타입
(2) SOCK_DGRAM : 비연결 지향 전송 타입
종류 | 설명 |
---|---|
IPPROTO_TCP | TCP를 기반으로 하는 소켓 생성 |
IPPROTO_UDP | UDP를 기반으로 하는 소켓 생성 |
→ 사실 첫 번째와 두 번째 인자를 통해서도 충분히 원하는 소켓의 정보를 전달한 것이기 때문에 세 번째 인자 값에다가 0을 넣어줘도 알아서 우리가 원하는 소켓을 생성해 줌
→ 하나의 프로토콜 체계 안에서 데이터 전송 타입까지 같으면서도 최종적으로 통신하는 형태가 다른 경우가 있음. 그 때 프로토콜을 조금 더 구체화하기 위해 사용됨
(RAW_SOCKET을 생성하는 경우 세 번째 인자가 유용하게 사용됨 → 이 책에서는 다루지 않음)
(추가) RAW_SOCKET은 뭘까?
#include <stdio.h>
#include <stdlib.h>
#include <arpa/inet.h>
#include <sys/socket.h>
void error_handling(char* message);
int main(int argc, char** argv)
{
int tcp_socket;
int udp_socket;
// 연결 지향 TCP 소켓 생성
tcp_socket = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
if(tcp_socket == -1)
error_handling("socket() error");
udp_socket = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP);
if(udp_socket == -1)
error_handling("socket() error");
printf("생성된 TCP 소켓의 파일 디스크립터 : %d \n", tcp_socket);
printf("생성된 UDP 소켓의 파일 디스크립터 : %d \n", udp_socket);
close(tcp_socket);
close(udp_socket);
return 0;
}
void error_handling(char* message)
{
fputs(message, stderr);
fputc('\n', stderr);
exit(1);
}
[실행 결과]