⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 recvfromflags.c

📁 UNIX网络编程第一卷第三版源代码 UNIX网络编程第一卷第三版源代码
💻 C
字号:
#include	"unp.h"ssize_trecvfrom_flags(int fd, void *ptr, size_t nbytes, int *flagsp,			   SA *sa, socklen_t *salenptr, void *dstaddrp){	struct msghdr	msg;	struct iovec	iov[1];	ssize_t			n;#ifdef	HAVE_MSGHDR_MSG_CONTROL#define	CONTROL_LEN	(sizeof(struct cmsghdr) + sizeof(struct in_addr))	char		control[CONTROL_LEN];	msg.msg_control = control;	msg.msg_controllen = sizeof(control);	msg.msg_flags = 0;#else	bzero(&msg, sizeof(msg));	/* make certain msg_accrightslen = 0 */#endif	msg.msg_name = sa;	msg.msg_namelen = *salenptr;	iov[0].iov_base = ptr;	iov[0].iov_len = nbytes;	msg.msg_iov = iov;	msg.msg_iovlen = 1;	if ( (n = recvmsg(fd, &msg, *flagsp)) < 0)		return(n);	*salenptr = msg.msg_namelen;	/* pass back results */#ifdef	HAVE_MSGHDR_MSG_CONTROL	*flagsp = msg.msg_flags;		/* pass back results */	/*	 * We need someway to indicate to the caller that nothing was	 * returned through dstaddrp (since all 32-bit values are valid	 * IP destination addresses).  To avoid having to add yet another	 * pointer argument, we return MSG_CTRUNC (which unp.h always	 * defines, even if the implementation does not).	 */#ifdef	IP_RECVDSTADDR	if (dstaddrp && msg.msg_controllen > 0 &&		(msg.msg_flags & MSG_CTRUNC) == 0) {		struct cmsghdr	*cmptr = CMSG_FIRSTHDR(&msg);		if (cmptr->cmsg_len != CONTROL_LEN)			err_quit("control length = %d", cmptr->cmsg_len);		if (cmptr->cmsg_level != IPPROTO_IP)			err_quit("control level != IPPROTO_IP");		if (cmptr->cmsg_type != IP_RECVDSTADDR)			err_quit("control type != IP_RECVDSTADDR");		memcpy(dstaddrp, CMSG_DATA(cmptr), sizeof(struct in_addr));	} else#endif		*flagsp |= MSG_CTRUNC;		/* dest IP addr not returned */#else	*flagsp |= MSG_CTRUNC;			/* dest IP addr not returned */#endif	/* HAVE_MSGHDR_MSG_CONTROL */	return(n);}ssize_tRecvfrom_flags(int fd, void *ptr, size_t nbytes, int *flagsp,			   SA *sa, socklen_t *salenptr, void *dstaddrp){	ssize_t		n;	n = recvfrom_flags(fd, ptr, nbytes, flagsp, sa, salenptr, dstaddrp);	if (n < 0)		err_quit("recvfrom_flags error");	return(n);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -