버클리 소켓

Berkeley sockets

Berkeley 소켓은 Internet 소켓 및 Unix 도메인 소켓용 Application Programming Interface(API; 응용 프로그램프로그래밍 인터페이스)로 프로세스통신(IPC)에 사용됩니다.일반적으로 링크 가능한 모듈의 라이브러리로 구현됩니다.이것은, 4.2 로부터 시작되었습니다.1983년에 출시된 BSD Unix 운영 체제.

소켓은 네트워크 통신 경로의 로컬 끝점을 추상적으로 표현한 입니다.버클리 소켓 API는 데이터 스트림에 대한 입력 및 출력을 위한 공통 인터페이스를 제공하는 Unix 철학에서 파일 기술자(파일 핸들)로 나타냅니다.

버클리 소켓은 사실상의 표준에서 POSIX 사양의 구성요소로 거의 수정 없이 진화했습니다.POSIX 소켓이라는 용어는 기본적으로 버클리 소켓과 동의어이지만 BSD 소켓이라고도 하며 버클리 소프트웨어 배포판의 첫 번째 구현을 인정합니다.

이력 및 구현

Berkeley 소켓은 4.2에서 시작되었습니다.BSD Unix 운영체제는 프로그래밍 인터페이스로 1983년에 출시되었습니다.그러나 1989년이 되어서야 캘리포니아 대학교 버클리에서는 AT&T Corporation의 독자 사양인 Unix의 라이센스 제약에서 벗어나 운영 체제와 네트워킹 라이브러리를 출시할 수 있었습니다.

현대의 모든 운영체제는 버클리 소켓인터페이스 버전을 구현하고 있습니다.이것은 인터넷에서 실행되는 애플리케이션의 표준 인터페이스가 되었습니다.심지어 MS Windows용 Winsock 구현도 독립 개발자에 의해 작성되어 표준을 따르고 있습니다.

BSD 소켓 API는 C 프로그래밍 언어로 작성됩니다.대부분의 다른 프로그래밍 언어는 유사한 인터페이스를 제공하며 일반적으로 C [1]API를 기반으로 래퍼 라이브러리로 작성됩니다.

BSD 및 POSIX 소켓

버클리 소켓 API가 발전하여 궁극적으로 POSIX 소켓 [2]API가 생성됨에 따라, 특정 기능은 폐지되거나 제거되고 다른 기능으로 대체되었습니다.POSIX API는, 재진입하도록 설계되어 IPv6 를 서포트하고 있습니다.

액션. BSD POSIX
텍스트 주소에서 팩된 주소로 변환 inet_aton inet_pton
팩 주소에서 텍스트 주소로 변환 inet_ntoa inet_ntop
호스트 이름/서비스의 정방향 조회 gethostbyname, gethostbyaddr, getservbyname, getservbyport getaddrinfo
호스트 이름/서비스의 역방향 조회 gethostbyaddr, getservbyport getnameinfo

대체 수단

STREAMS-based Transport Layer Interface(TLI; 스트림 기반 트랜스포트 레이어 인터페이스) API는 소켓 API 대신 사용할 수 있습니다.TLI API를 제공하는 많은 시스템은 Berkeley 소켓 API도 제공합니다.

Unix 이외의 시스템에서는 변환 레이어와 함께 버클리 소켓 API가 네이티브 네트워킹 API에 노출되는 경우가 많습니다.Plan[3] 9 및 Genode[4] 파일 설명자가 아닌 제어 파일과 함께 파일 시스템 API를 사용합니다.

헤더 파일

버클리 소켓인터페이스는 여러 헤더파일에 정의되어 있습니다.이러한 파일의 이름과 내용은 구현마다 약간 다릅니다.일반적으로 다음과 같은 것이 있습니다.

파일 묘사
sys/sys.h 코어 소켓 기능 및 데이터 구조.
넷넷/in.h AF_INET 및 AF_INET6 주소 패밀리 및 대응하는 프로토콜 패밀리, PF_INET 및 PF_INET6.여기에는 표준 IP 주소와 TCP 및 UDP 포트 번호가 포함됩니다.
시스템/un.h PF_UNIX 및 PF_LOCAL 주소 패밀리.동일한 컴퓨터에서 실행 중인 프로그램 간의 로컬 통신에 사용됩니다.
arpa/inet.h 숫자 IP 주소를 조작하는 기능.
netdb.h 프로토콜 이름 및 호스트 이름을 숫자 주소로 변환하는 함수입니다.로컬 데이터와 이름 서비스를 검색합니다.

소켓 API 함수

Transmission Control Protocol(TCP)을 사용하는 소켓을 사용한 클라이언트-서버 트랜잭션 흐름도.

Berkeley 소켓 API는 일반적으로 다음 기능을 제공합니다.

  • socket()은 정수 번호로 식별되는 특정 유형의 새로운 소켓을 생성하여 시스템리소스를 할당합니다.
  • bind()는 일반적으로 서버 측에서 사용되며 소켓을 소켓주소 구조(지정된 로컬 IP 주소 및 포트 번호)와 관련짓습니다.
  • listen()은 서버 측에서 사용되며 바인드된TCP 소켓이 리스닝 스테이트가 됩니다.
  • connect()는 클라이언트 측에서 사용되며 소켓에 빈 로컬포트 번호를 할당합니다.TCP 소켓의 경우는, 새로운 TCP 접속을 확립하려고 합니다.
  • accept()는 서버 측에서 사용됩니다.리모트 클라이언트로부터 새로운 TCP 접속을 작성하기 위한 수신 시도를 받아들여 이 접속의 소켓주소 쌍과 관련된 새로운 소켓을 만듭니다.
  • send's recv'sendto'recvfrom()은 데이터 송수신에 사용됩니다.표준 함수 write() 및 read()도 사용할 수 있습니다.
  • close()지정하면 소켓에 할당된 리소스가 해방됩니다.TCP 의 경우는, 접속이 종료됩니다.
  • gethostbyname()gethostbyaddr()은 호스트 이름과 주소를 해결하기 위해 사용됩니다.IPv4 만.
  • getaddrinfo()freeaddrinfo()는 호스트 이름과 주소를 해결하기 위해 사용됩니다.IPv4, IPv6.
  • select()는 1개 또는 여러 소켓목록이 읽기 가능, 쓰기 가능 또는 오류가 발생할 때까지 대기하는 일시 중단에 사용됩니다.
  • poll()은 소켓 세트 내의 소켓 상태를 체크하기 위해 사용됩니다.이 세트를 테스트하여 소켓에 쓰기, 읽기 또는 오류 발생 여부를 확인할 수 있습니다.
  • getsockopt()는 지정된 소켓에 대한 특정 소켓옵션의 현재 값을 취득하기 위해 사용됩니다.
  • setsockopt()는 지정된 소켓의 특정 소켓옵션을 설정하기 위해 사용됩니다.

소켓

socket() 함수는 통신용 엔드포인트를 만들고 소켓의 파일 기술자를 반환합니다.다음 3가지 인수를 사용합니다.

  • 생성된 소켓의 프로토콜 패밀리를 지정합니다domain.예를 들어 다음과 같습니다.
    • 네트워크 프로토콜 IPv4용 AF_INET(IPv4 전용)
    • AF_INET6 for IPv6 (경우에 따라서는 IPv4와의 하위 호환성)
    • 로컬 소켓용 AF_UNIX(특수 파일 시스템 노드 사용)
  • type, 다음 중 하나:
    • SOCK_STREAM(신뢰성 있는 스트림 지향 서비스 또는 스트림 소켓)
    • SOCK_DGRAM(데이터그램 서비스 또는 데이터그램 소켓)
    • SOCK_SEQPACKET(신뢰성 있는 시퀀싱 패킷서비스)
    • SOCK_RAW(네트워크 계층 상단의 원시 프로토콜)
  • protocol 사용할 실제 전송 프로토콜을 지정합니다.가장 일반적인 것은 IPPROTO_TCP, IPPROTO_SCTP, IPPROTO_UDP, IPPROTO_DCCP입니다.이러한 프로토콜은 파일 netinet/in.h에 명시되어 있습니다. 0을 사용하여 선택한 도메인 및 유형에서 기본 프로토콜을 선택할 수 있습니다.

오류가 발생하면 함수는 -1을 반환합니다.그렇지 않으면 새로 할당된 기술자를 나타내는 정수를 반환합니다.

묶다

bind()는 소켓을 주소에 관련짓습니다.소켓()사용하여 소켓을 생성하면 프로토콜 패밀리만 지정되고 주소는 할당되지 않습니다.소켓이 다른 호스트로부터의 연결을 받아들이려면 먼저 이 연결을 수행해야 합니다.함수에는 다음 세 가지 인수가 있습니다.

  • sockfd소켓을 나타내는 디스크립터
  • my_addr바인드처의 주소를 나타내는 Sockaddr 구조체에 대한 포인터.
  • addrlensockaddr 구조의 크기를 지정하는 socklen_t 유형의 필드입니다.

bind()는 성공 시 0을 반환하고 오류가 발생하면 -1을 반환합니다.

들어봐

소켓이 주소에 관련지어지면listen()는, 착신 접속에 대비합니다.단, 이것은 스트림 지향 (접속 지향) 데이터 모드, 즉 소켓유형에만 필요합니다.SOCK_STREAM,SOCK_SEQPACKET).listen()에는 다음 두 가지 인수가 필요합니다.

  • sockfd유효한 소켓 기술자.
  • backlog한 번에 큐잉할 수 있는 보류 중인 연결 수를 나타내는 정수입니다.통상, operating system은 이 값에 상한치를 설정합니다.

접속이 받아들여지면 큐에서 제외됩니다.성공하면 0이 반환됩니다.오류가 발생하면 -1이 반환됩니다.

받아들이다

응용 프로그램이 다른 호스트로부터의 스트림 지향 연결을 수신할 때 이러한 이벤트(cf. select() 함수)가 통지되며 함수 accept()를 사용하여 연결을 초기화해야 합니다.접속마다 새로운 소켓이 생성되어 리스닝 큐에서 접속이 삭제됩니다.함수에는 다음 인수가 있습니다.

  • sockfd접속이 큐잉되어 있는 리스닝 소켓 기술자.
  • cliaddr클라이언트의 주소 정보를 수신하기 위한 Sockaddr 구조에 대한 포인터입니다.
  • addrlensocklen_t 로케이션에 대한 포인터이며, 이 포인터는 수용에 전달되는 클라이언트주소 구조의 크기를 지정합니다.accept()반환되면 이 위치에는 구조체의 크기(바이트)가 포함됩니다.

accept()는 허용된 연결에 대한 새 소켓 기술자를 반환합니다. 오류가 발생하면 값 -1을 반환합니다.이제 리모트 호스트와의 모든 통신이 이 새로운 소켓을 통해 이루어집니다.

수신자가 리스닝 소켓을 사용하여 요구에 즉시 응답할 수 있기 때문에 데이터그램소켓은 accept()에 의한 처리를 필요로 하지 않습니다.

연결하다

connect()는 소켓(파일 기술자)을 통해 주소로 식별되는 특정 리모트호스트에 대한 직접 통신 링크는 파일 기술자에 의해 식별됩니다.

연결 지향 프로토콜을 사용하는 경우 연결이 설정됩니다.특정 유형의 프로토콜은 연결이 없으며, 특히 사용자 데이터그램 프로토콜이 가장 두드러집니다.connectionless protocol과 함께 사용하는 경우, connect는 데이터를 보내고 받기 위한 원격 주소를 정의하며, send 및 recv같은 기능을 사용할 수 있습니다.이러한 경우 연결 함수는 다른 소스로부터의 데이터그램 수신을 방지합니다.

connect()는 오류 코드를 나타내는 정수를 반환합니다.0은 성공을 나타내고 -1은 오류를 나타냅니다.지금까지 BSD에서 파생된 시스템에서는 (단일 Unix 사양에 지정되어 있는) 접속 콜이 실패했을 경우 소켓 기술자의 상태는 정의되어 있지 않습니다.따라서 connect() 콜이 [5]실패했을 경우 휴대용 응용 프로그램은 소켓 기술자를 즉시 닫고 socket()을 사용하여 새로운 기술자를 취득해야 합니다.

gethostbyname 및 gethostbyaddr

gethostbyname()gethostbyaddr() 함수는 도메인네임 시스템 또는 로컬호스트의 다른 리졸바 메커니즘(/etc/hosts lookup 등)에서 호스트 이름과 주소를 해결하기 위해 사용됩니다.유형 객체에 포인터를 반환합니다.struct hostentInternet Protocol 호스트에 대해 설명합니다.함수에서는 다음 인수를 사용합니다.

  • name는 호스트의 DNS 이름을 지정합니다.
  • addr에 대한 포인터를 지정합니다.struct in_addr호스트의 주소가 포함되어 있습니다.
  • len의 길이(바이트)를 지정합니다.addr.
  • type에, 호스트 주소의 주소 패밀리유형(AF_INET 등)을 지정합니다.

오류 발생 시 함수는 NULL 포인터를 반환합니다.이 경우 외부 정수를 체크하여 일시적인 장애인지 비활성인지 알 수 없는 호스트인지를 확인할 수 있습니다.그렇지 않으면 유효합니다.struct hostent *이 반환됩니다.

이러한 함수는 엄밀하게 BSD 소켓 API의 구성요소는 아니지만 API 함수와 함께 사용되는 경우가 많습니다.게다가 이러한 기능은, 도메인네임 시스템을 쿼리하기 위한 레거시 인터페이스로 간주됩니다.프로토콜에 완전히 의존하지 않는(IPv6를 지원하는) 새로운 기능이 정의되었습니다.이러한 새로운 함수는 getaddrinfo() getnameinfo()이며 새로운 addrfo 데이터 구조를 기반으로 합니다.

프로토콜 및 주소 패밀리

버클리 소켓 API는 네트워킹 및 프로세스 간 통신을 위한 일반 인터페이스이며 다양한 네트워크 프로토콜과 주소 아키텍처의 사용을 지원합니다.

다음은 최신 Linux 또는 BSD 구현에서 정의된 프로토콜 패밀리(표준 심볼 식별자 앞에 있음)의 샘플 목록입니다.

식별자 기능 또는 용도
PF_LOCAL, PF_UNIX, PF_FILE 로컬에서 호스트(파이프 및 파일 도메인)
PF_INET 인터넷 프로토콜 버전 4
PF_AX25 아마추어 무선 AX.25
PF_IPX Novell의 인터넷 워크 패킷 교환
PF_APPLETALK AppleTalk
PF_NETROM 아마추어 무선 NetROM(AX.25 관련)
PF_BRIDGE 멀티프로토콜 브리지
PF_ATMPVC 비동기 전송 모드 고정 가상 회선
PF_ATMSVC 비동기 전송 모드 스위치드 가상 회선
PF_INET6 인터넷 프로토콜 버전 6
PF_DECnet DECnet 프로젝트 예약 완료
PF_NETBEUI 802.2용으로 예약됨LLC 프로젝트
PF_SECURITY 보안 콜백 의사 AF
PF_KEY PF_KEY 키 관리 API
PF_NETLINK, PF_ROUTE 라우팅 API
PF_PACKET 패킷 캡처 소켓
PF_ECONET 에이콘 에코넷
PF_SNA Linux Systems 네트워크 아키텍처(SNA) 프로젝트
PF_IRDA IrDA 소켓
PF_PPPOX PPP over X 소켓
PF_WANPIPE Sangoma Wanpipe API 소켓
PF_BLUTUES 블루투스 소켓

통신용 소켓은 다음과 같이 작성됩니다.socket()원하는 프로토콜 패밀리(PF_identifier)를 인수로 지정함으로써 함수를 지정합니다.

프로토콜 유형(패밀리)과 각각 사용할 수 있는 특정 주소 유형을 구별하는 소켓인터페이스의 원래 설계 개념.프로토콜 패밀리는 여러 가지 주소 유형을 가질 수 있습니다.주소 유형은 PF 대신 프리픽스 AF를 사용하여 추가 심볼 상수에 의해 정의되었습니다.AF 식별자는 프로토콜 패밀리가 아닌 주소 유형을 다루는 모든 데이터 구조를 대상으로 합니다.그러나 이러한 프로토콜과 주소 유형의 분리 개념은 구현 지원을 찾지 못했고 AF 상수는 해당 프로토콜 식별자에 의해 정의되었기 때문에 AF 상수와 PF 상수의 구별은 실질적인 결과가 없는 기술적 논쟁으로 남았다.실제로, [6]두 가지 형태의 적절한 사용에는 많은 혼란이 존재한다.

POSIX.1—2008 사양은 PF 정수를 규정하지 않고 AF 정수로만[7] 규정하고 있습니다.

원시 소켓

원시 소켓은 호스트의 TCP/IP 스택에 의한 처리를 바이패스하는 단순한 인터페이스를 제공합니다.사용자 공간에서 네트워킹 프로토콜 구현을 허용하고 프로토콜 [8]스택 디버깅을 지원합니다.원시 소켓은 TCP/IP 모델의 인터넷 계층에서 작동하는 ICMP 등의 일부 서비스에서 사용됩니다.

블로킹 및 비블로킹모드

버클리 소켓은 블로킹 또는 비블로킹의 두 가지 모드 중 하나로 동작할 수 있습니다.

블로킹 소켓은 동작에 대해 지정된 데이터의 일부 또는 전부를 송신(또는 수신)할 때까지 제어를 반환하지 않습니다.블로킹 소켓이 모든 데이터를 전송하지 않는 것은 정상입니다.응용 프로그램은 반환 값을 확인하여 송수신된 바이트 수를 확인하고 처리되지 [9]않은 데이터를 다시 전송해야 합니다.블로킹 소켓을 사용하는 경우 접속 단계에서 클라이언트가 절단된 경우 가독성을 표시한 후 계속 차단될 수 있으므로 accept()에 각별한 주의를 기울여야 합니다.

비블로킹 소켓은 수신 버퍼에 있는 모든 것을 반환하고 즉시 계속합니다.올바르게 기술되지 않은 경우, 논블로킹 소켓을 사용하는 프로그램은 네트워크 링크 [citation needed]속도의 차이로 인해 레이스 조건에 특히 취약합니다.

일반적으로 소켓은 fcntlioctl 함수를 사용하여 블로킹모드 또는 비블로킹모드로 설정됩니다.

종단 소켓

운영체제는 소켓이 닫힐 때까지 소켓에 할당된 리소스를 해제하지 않습니다.이것은 접속 콜이 실패하여 재시도되는 경우에 특히 중요합니다.

애플리케이션이 소켓을 닫으면 소켓에 대한 인터페이스만 파괴됩니다.내부적으로 소켓을 파괴하는 것은 커널의 책임입니다.경우에 따라서는 서버 측에서 소켓이 최대 4분간 TIME_WAIT 상태가 될 수 있습니다.[10]

SVR4 시스템에서는close()는 데이터를 폐기할 수 있습니다.의 사용shutdown()또는 SO_LINGER가 모든 [11]데이터 전송을 보증하기 위해 필요할 수 있습니다.

TCP를 사용한 클라이언트 서버 예시

Transmission Control Protocol(TCP)은 바이트 스트림 전송을 위한 다양한 오류 수정 및 성능 기능을 제공하는 연결 지향 프로토콜입니다.프로세스에서는 다음 명령어를 호출하여 TCP 소켓을 만듭니다.socket()프로토콜 패밀리(PF INET, PF_INET6)의 파라미터, 스트림 소켓의 소켓모드(SOCK_STREAM) 및 TCP의 IP 프로토콜 식별자(IPPROTO_TCP)와 함께 기능합니다.

서버

TCP 서버의 확립에는, 다음의 기본적인 순서가 포함됩니다.

  • socket()에 대한 호출을 사용하여 TCP 소켓을 만듭니다.
  • 포트 번호 설정 후 소켓을 리스닝 포트(bind())에 바인드한다.
  • 접속을 리슨하기 위한 소켓 준비(리슨 소켓으로 한다)와 리슨하기 위한().
  • 착신 접속(accept())을 받아들입니다.이것에 의해, 착신 접속이 수신될 때까지 프로세스가 차단되어 받아들여진 접속의 소켓 기술자가 반환됩니다.첫 번째 디스크립터는 리스닝 디스크립터 그대로이며 accept()는 닫을 때까지 이 소켓을 사용하여 언제든지 다시 호출할 수 있습니다.
  • API 함수 send()recv() 및 범용 함수 write()read()를 사용하여 원격 호스트와 통신합니다.
  • close() 함수와 함께 사용한 후 열린 각 소켓을 닫습니다.

다음의 프로그램은, 포토 번호 1100 로 수신하는 TCP 서버를 작성합니다.

  #실패하다 < sys / types >h>   #실패하다 <sys/module >h>   #실패하다 <netnet/in.h>   #실패하다 <arpa/inet.h>   #실패하다 <stdio.h>   #실패하다 <stdlib.h>   #실패하다 <문자열>h>   #실패하다 <리스트 없음.h>      인트 주된(무효)   {     구조 키보드 sa;     인트 소켓 FD = 소켓(PF_INET, 양말_스트림, IPPROTO_TCP);     한다면 (소켓 FD == -1) {       에러("작성 소켓 추가");       퇴장(EXIT_FAILURE);     }        메모리 세트(&sa, 0, 크기 sa);        sa.sin_family = AF_INET;     sa.sin_port = 하드 디스크(1100);     sa.sin_addr.s_주소 = 하드 디스크(INADDR_ANY);        한다면 (묶다(소켓 FD,(구조 키보드 *)&sa, 크기 sa) == -1) {       에러("실패");       가까운.(소켓 FD);       퇴장(EXIT_FAILURE);     }        한다면 (들어봐(소켓 FD, 10) == -1) {       에러("리슨 실패");       가까운.(소켓 FD);       퇴장(EXIT_FAILURE);     }        위해서 (;;) {       인트 접속 FD = 받아들이다(소켓 FD, 특수한 순서, 특수한 순서);          한다면 (접속 FD == -1) {         에러("승인 실패");         가까운.(소켓 FD);         퇴장(EXIT_FAILURE);       }          /* 읽기 쓰기 작업을 수행합니다.  읽기(ConnectFD, 버프, 크기) */          한다면 (셧다운(접속 FD, SHUT_RDWR) == -1) {         에러("실패");         가까운.(접속 FD);         가까운.(소켓 FD);         퇴장(EXIT_FAILURE);       }       가까운.(접속 FD);     }      가까운.(소켓 FD);     돌아가다 종료_SUCCESS;   } 

고객

TCP 클라이언트애플리케이션의 프로그래밍에는, 다음의 순서가 포함됩니다.

  • TCP 소켓을 만듭니다.
  • 서버(connect())로의 접속,sockaddr_in와 함께 구조화sin_familyAF_로 설정아이넷,sin_port엔드포인트가 리슨하는 포트로 설정(네트워크 바이트순서)sin_addr수신 서버의 IP 주소로 설정됩니다(네트워크 바이트 순서도 마찬가지).
  • API 함수 send()recv() 및 범용 함수 write()read()를 사용하여 원격 호스트와 통신합니다.
  • close() 함수와 함께 사용 후 열린 각 소켓을 닫습니다.
  #실패하다 < sys / types >h>   #실패하다 <sys/module >h>   #실패하다 <netnet/in.h>   #실패하다 <arpa/inet.h>   #실패하다 <stdio.h>   #실패하다 <stdlib.h>   #실패하다 <문자열>h>   #실패하다 <리스트 없음.h>      인트 주된(무효)   {     구조 키보드 sa;     인트 인식하다;     인트 소켓 FD;      소켓 FD = 소켓(PF_INET, 양말_스트림, IPPROTO_TCP);     한다면 (소켓 FD == -1) {       에러("작성 소켓 추가");       퇴장(EXIT_FAILURE);     }        메모리 세트(&sa, 0, 크기 sa);        sa.sin_family = AF_INET;     sa.sin_port = 하드 디스크(1100);     인식하다 = inet_pton(AF_INET, "192.168.1.3", &sa.sin_addr);      한다면 (연결하다(소켓 FD, (구조 키보드 *)&sa, 크기 sa) == -1) {       에러("접속 실패");       가까운.(소켓 FD);       퇴장(EXIT_FAILURE);     }        /* 읽기 쓰기 작업을 수행합니다.*/        가까운.(소켓 FD);     돌아가다 종료_SUCCESS;   } 

UDP를 사용한 클라이언트 서버 예시

UDP(User Datagram Protocol)는 전달을 보증하지 않는 커넥션리스 프로토콜입니다.UDP 패킷이 잘못 도착하거나 여러 번 도착하거나 전혀 도착하지 않을 수 있습니다.이 최소한의 설계로 인해 UDP는 TCP보다 오버헤드가 상당히 적습니다.connectionless는 2개의 호스트 간에 스트림 또는 영속적인 접속 개념이 없음을 의미합니다.이러한 데이터를 데이터그램(Datagram Sockets)이라고 합니다.

UDP 주소 공간, 즉 UDP 포트 번호 공간(ISO 용어로는 TSAP)은 TCP 포트와 완전히 분리되어 있습니다.

서버

애플리케이션은, 포토 번호 7654 에 다음과 같이 UDP 서버를 셋업 할 수 있습니다.프로그램에는 함수 recvfrom()을 가진 UDP 데이터그램을 수신하는 무한 루프가 포함되어 있습니다.

#실패하다 <stdio.h> #실패하다 <errno.h> #실패하다 <문자열>h> #실패하다 <sys/module >h> #실패하다 < sys / types >h> #실패하다 <netnet/in.h> #실패하다 <리스트 없음.h>소켓 */의 close()의 /* #실패하다 <stdlib.h>  인트 주된(무효) {   인트 양말;   구조 키보드 sa;     완충 장치[1024];   ssize_t 사이즈를 변경하다;   양말렌_t 시작점;    메모리 세트(&sa, 0, 크기 sa);   sa.sin_family = AF_INET;   sa.sin_addr.s_주소 = 하드 디스크(INADDR_ANY);   sa.sin_port = 하드 디스크(7654);   시작점 = 크기 sa;    양말 = 소켓(PF_INET, SOCK_D그램, IPPROTO_UDP);   한다면 (묶다(양말, (구조 키보드 *)&sa, 크기 sa) == -1) {     에러("오류 바인딩 실패");     가까운.(양말);     퇴장(EXIT_FAILURE);   }    위해서 (;;) {     사이즈를 변경하다 = 수신원(양말, (무효*)완충 장치, 크기 완충 장치, 0, (구조 키보드*)&sa, &시작점);     한다면 (사이즈를 변경하다 < > 0) {       인쇄(하드, %s\n", 스트로러(에러));       퇴장(EXIT_FAILURE);     }     인쇄물("재설정: %d\n", (인트)사이즈를 변경하다);     수면.(1);     인쇄물("데이터그램: %.*s\n", (인트)사이즈를 변경하다, 완충 장치);   } } 

고객

다음으로, 「Hello World!」라고 하는 문자열을 포함한 UDP 패킷을 포토 번호 7654 의 주소 127.0.0.1 에 송신하기 위한 클라이언트 프로그램을 나타냅니다.

#실패하다 <stdlib.h> #실패하다 <stdio.h> #실패하다 <errno.h> #실패하다 <문자열>h> #실패하다 <sys/module >h> #실패하다 < sys / types >h> #실패하다 <netnet/in.h> #실패하다 <리스트 없음.h> #실패하다 <arpa/inet.h>  인트 주된(무효) {   인트 양말;   구조 키보드 sa;   인트 bytes_sended;    완충 장치[200];     스트럭시(완충 장치, "헬로우 월드!");     /* UDP를 사용하여 인터넷, 데이터그램, 소켓을 만듭니다*/   양말 = 소켓(PF_INET, SOCK_D그램, IPPROTO_UDP);   한다면 (양말 == -1) {       /* 소켓 초기화에 실패하면 */를 종료합니다.       인쇄물("소켓 생성 오류");       퇴장(EXIT_FAILURE);   }     /* 제로 아웃 소켓주소 */   메모리 세트(&sa, 0, 크기 sa);      /* 주소는 IPv4 */ 입니다.   sa.sin_family = AF_INET;      /* IPv4 주소는 uint32_t 입니다.옥텟 문자열 표현을 적절한 값으로 변환합니다*/   sa.sin_addr.s_주소 = inet_addr("127.0.0.1");      /* 소켓은 부호 없는 쇼트입니다.htons(x)는 x가 네트워크 바이트 순서임을 보증합니다.포트를 7654*/로 설정합니다.   sa.sin_port = 하드 디스크(7654);     bytes_sended = 송신지(양말, 완충 장치, 스트렌(완충 장치), 0,(구조 키보드*)&sa, 크기 sa);   한다면 (bytes_sended < > 0) {     인쇄물("패킷 전송 오류: %s\n", 스트로러(에러));     퇴장(EXIT_FAILURE);   }     가까운.(양말); /* 소켓을 닫습니다*/   돌아가다 0; } 

코드에서는 buffer는 송신할 데이터에 대한 포인터이며 buffer_length는 데이터의 크기를 지정합니다.

레퍼런스

  1. ^ 예: Ruby 프로그래밍 언어 ruby-doc:소켓
  2. ^ "— POSIX.1-2008 specification". Opengroup.org. Retrieved 2012-07-26.
  3. ^ "The Organization of Networks in Plan 9".
  4. ^ "Linux TCP/IP stack as VFS plugin".
  5. ^ Stevens & Rago 2013, 페이지 607
  6. ^ UNIX 네트워크 프로그래밍 Volume 1, 제3판:소켓 네트워킹 API, W. Richard Stevens, Bill Fenner, Andrew M. Rudoff, Adison Wesley, 2003.
  7. ^ "The Open Group Base Specifications Issue 7". Pubs.opengroup.org. Retrieved 2012-07-26.
  8. ^ "TCP/IP raw sockets - Win32 apps".
  9. ^ "Beej's Guide to Network Programming". Beej.us. 2007-05-05. Retrieved 2012-07-26.
  10. ^ "terminating sockets". Softlab.ntua.gr. Retrieved 2012-07-26.
  11. ^ "ntua.gr - Programming UNIX Sockets in C - Frequently Asked Questions: Questions regarding both Clients and Servers (TCP/SOCK_STREAM)". Softlab.ntua.gr. Retrieved 2012-07-26.

소켓 인터페이스의 표준 정의는 다음과 같이 알려진 POSIX 표준에 포함되어 있습니다.

  • IEEE 규격 1003.1-2001 정보기술 표준—POSIX(Portable Operating System Interface)
  • 오픈 그룹 테크니컬 스탠다드: 기본 사양, 제6호, 2001년 12월
  • ISO/IEC 9945:2002

이 표준 및 이에 대한 진행 중인 작업에 대한 정보는 Austin 웹사이트에서 확인할 수 있습니다.

베이스 소켓 API 에 대한 IPv6 확장에 대해서는, RFC 3493 및 RFC 3542 에 기재되어 있습니다.

외부 링크