DF-2702 / dgram_peek.c
/* 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; } |