/* DGRAM variant: sendto() + recvmsg(MSG_PEEK) on SOCK_DGRAM */
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/uio.h>
#include <stdio.h>
#include <string.h>
#include <stdint.h>
#include <unistd.h>
int main(void){
    int sv[2];
    unsigned char cbuf[CMSG_SPACE(1*sizeof(int))], rbuf[256], dbuf[8];
    if (socketpair(AF_UNIX, SOCK_DGRAM, 0, sv)<0){perror("sp");return 1;}
    struct cmsghdr *cm=(struct cmsghdr*)cbuf;
    cm->cmsg_level=SOL_SOCKET; cm->cmsg_type=SCM_RIGHTS; cm->cmsg_len=CMSG_LEN(sizeof(int));
    *(int*)CMSG_DATA(cm)=sv[0];
    struct msghdr sh; memset(&sh,0,sizeof sh);
    char d='D'; struct iovec siov={&d,1};
    sh.msg_iov=&siov; sh.msg_iovlen=1; sh.msg_control=cbuf; sh.msg_controllen=sizeof cbuf;
    if (sendmsg(sv[0],&sh,0)<0){perror("sendmsg");return 1;}
    struct msghdr rh; memset(&rh,0,sizeof rh);
    struct iovec riov={dbuf,sizeof dbuf};
    rh.msg_iov=&riov; rh.msg_iovlen=1; rh.msg_control=rbuf; rh.msg_controllen=sizeof rbuf;
    if (recvmsg(sv[1],&rh,MSG_PEEK|MSG_DONTWAIT)<0){perror("peek");return 1;}
    printf("DGRAM PEEK controllen=%u cmsg_len=%zu data0=0x%016llx\n",
        (unsigned)rh.msg_controllen,
        ((struct cmsghdr*)rbuf)->cmsg_len,
        (unsigned long long)*(uint64_t*)((char*)rbuf+16));
    return 0;
}
