recvmsg 예제

msghdr 구조는 recvmsg에 인수의 수를 가지고 가상 가능한 숫자로 아래로 보내고 존재한다. recvmsg에 입력할 때 원본 주소, 데이터그램 페이로드 및 보조 데이터를 저장해야 하는 위치를 지정합니다. 이 예제에서는 보조 데이터가 요청되지 않으므로 수신에 대한 조항이 없습니다. recvfrom에 의해 반환 되는 값은 수신 된 바이트의 수 또는 -1 오류가 있는 경우. 이 예제에서는 약간 큰 크기의 데이터그램 버퍼를 제공하는 위에서 설명한 기술을 사용하여 잘림이 감지됩니다. msghdr 구조의 msg_flags 필드는 recvmsg에서 호출자에게 플래그를 반환하는 데 사용됩니다. 여기에는 데이터그램이 잘린 경우 또는 그렇지 않은 경우 종료시 설정되는 MSG_TRUNC 플래그가 포함됩니다. 모든 플래그를 recvmsg에 전달하려는 경우 이 작업은 항목에서 무시되는 msg_flags를 사용하여 수행할 수 없습니다. 대신 세 번째 인수를 사용하여 recvmsg (이 예제에서는 0)를 전달해야합니다. iovec 배열의 목적은 데이터그램 페이로드가 연속메모리 영역에 저장될 필요가 없도록 분산/수집 기능을 제공하는 것입니다. 이 예제에서는 전체 페이로드가 단일 버퍼에 저장되므로 하나의 배열 요소만 필요합니다. 힌트 인수에는 변환을 안내하는 데 도움이 되는 추가 정보가 포함되어 있습니다. 이 예에서 UDP 기반 응용 프로그램 계층 프로토콜은 첫 번째 문제에 대한 해결책을 제공하기 위해 보낼 수 있는 데이터그램의 크기를 제한하는 경우가 많습니다.

예를 들어 TFTP와 DNS는 각각 고정된 최대 페이로드 크기가 512바이트입니다. DHCP의 경우 한도는 548바이트로 기본값이지만 양당사자가 이를 지원할 의사가 있는 경우 더 큰 값을 협상할 수 있습니다. 데이터그램은 파일 설명자에서 읽을 수 있는 모든 기능을 사용하여 수신할 수 있지만 원치 않는 데이터그램을 수신하는 경우(이 예제에서와 같이) 일반적으로 각 데이터그램이 어디에서 유래했는지 알고 싶을 것입니다. 받는 사람. 이 정보는 함수 recvfrom 및 recvmsg에 의해 제공됩니다. 이러한 recvmsg의 더 유연한 옵션이지만, 훨씬 더 복잡한 인터페이스의 비용입니다. 각 기능에 대한 자세한 내용은 다음과 같습니다. 예를 들어 Linux는 이 보조 데이터 메커니즘을 사용하여 UNIX 도메인 소켓을 통해 확장 오류, IP 옵션 또는 파일 설명자를 전달합니다. 하나 이상의 메시지를 받은 후 오류가 발생하면 호출이 성공하고 수신된 메시지 수를 반환합니다. 오류 코드는 recvmmsq()에 대한 후속 호출에서 반환될 것으로 예상됩니다. 그러나 현재 구현에서는 소켓에서 관련없는 네트워크 이벤트(예: 들어오는 ICMP 패킷)를 통해 그 동안 오류 코드를 덮어쓸 수 있습니다. 이러한 데이터그램은 다음과 같은 출력을 제공할 수 있는 예제 애플리케이션에 의해 판독됩니다: recvfrom()의 사용예는 getaddrinfo(3)에 도시되어 있다.

네 번째 인수는 recvfrom의 동작을 수정하는 플래그를 지정하는 것입니다.이 예제에서는 필요하지 않습니다.