반응형
소켓을 개설하여 통신에 이용하기 위해서는 다음의 다섯 가지 정보가 정해져야 합니다.
- 통신에 사용할 프로토콜 (TCP인지 UDP인지)
- 자신의 IP 주소
- 자신의 Port 번호
- 상대방의 IP 주소
- 상대방의 Port번호
함수 : socket()
// socket() 사용 문법
#include <sys/socket.h>
int socket(
int domain, // 프로토콜 체계
int type, // 서비스 타입
int protocol); // 소켓에서 사용할 프로토콜
각 매게 변수들
domain | PF_INET (인터넷 프로토콜) PF_INET (IPv6 프로토콜 체계 사용) PF_UNIX (유닉스 방식의 프로토콜 체계 사용) PF_NS (XEROX 네트워크 세스템의 프로토콜 체계 사용) PF_PACKET (리눅스에서 패킷 캡쳐를 위해서 사용) |
type | SOCK_STREAM (TCP 소켓 생성) SOCK_DGRAM (UDP 소켓 생성) SOCK_RAW (Raw 소켓 생성) |
protocol | 어떤 프로토콜을 사용할 지 지정 SOCK_STREAM, DGRAM은 이미 정해졌으니 0을 입력 SOCK_RAW 선택한 경우에 구체적인 상위 프로토콜 지정 |
사용 예제
//----------------------------------
// 파일명 : open_socket.c
// 기 능 : socket() 시스템 콜을 호쿨하고, 생성된 소켓번호를 출력
// 컴파일 : gcc open_socket.c -o open_socket
// 사용법 : ./open_socket
//----------------------------------
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h> // 소켓 시스템 콜에 필요한 상수 선언
#include <sys/socket.h> // 소켓 시스템 콜 선언
#include <sys/stat.h> // 파일의 상태에 대한 데이터 선언
#include <fcntl.h> // open에 필요한 flag 선언
#include <unistd.h>
int main(){
// 파일 및 소켓 번호
int fd1, fd2, sd1, sd2;
// 1.파일 열기
fd1 = open("/etc/passwd", O_RDONLY, 0); // <fcntl.h>
printf("/etc/paswwd's file descriptor = %d\n", fd1);
// 2.스트림형 소켓 열기
sd1 = socket(PF_INET, SOCK_STREAM, 0);
printf("stream socket descriptor = %d\n", sd1);
// 3.데이터그램형 소켓 열기
sd2 = socket(PF_INET, SOCK_DGRAM, 0);
printf("datagram socket descriptor = %d\n", sd2);
// 4.또 다른 파일 열기
fd2 = open("/etc/hosts", O_RDONLY, 0);
printf("/etc/hosts's file descriptor = %d\n", fd2);
//파일 및 소켓 닫기
close(fd2);
close(fd1);
close(sd2);
close(sd1);
return 0;
}
실행 결과
/etc/passwd's file descriptor = 3
stream socket descriptor = 4
datagram socket descriptor = 5
/etc/hosts's file descriptor = 6
파일 디스크립터 0,1,2는 시스템이 이미 사용 중
0 - 표준 입력
1 - 표준 출력
2 - 표준 에러 출력
최대 소켓 수 확인 - getdtablesize()
한 프로세스에서 개설 가능한 최대 소켓 수를 알고 싶으면 getdtablesize()를 사용하면 됩니다.
#include <stdio.h>
#include <stdlib.h>
printf("getdtablesize() = %d\n", getdtablesize());
반응형