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

📄 dg_send_recv.c

📁 unix网络编程卷1:套接口API的全书源码
💻 C
字号:
/* include dgsendrecv1 */#include	"unprtt.h"#include	<setjmp.h>#define	RTT_DEBUGstatic struct rtt_info   rttinfo;static int	rttinit = 0;static struct msghdr	msgsend, msgrecv;	/* assumed init to 0 */static struct hdr {  uint32_t	seq;	/* sequence # */  uint32_t	ts;		/* timestamp when sent */} sendhdr, recvhdr;static void	sig_alrm(int signo);static sigjmp_buf	jmpbuf;ssize_tdg_send_recv(int fd, const void *outbuff, size_t outbytes,			 void *inbuff, size_t inbytes,			 const SA *destaddr, socklen_t destlen){	ssize_t			n;	struct iovec	iovsend[2], iovrecv[2];	if (rttinit == 0) {		rtt_init(&rttinfo);		/* first time we're called */		rttinit = 1;		rtt_d_flag = 1;	}	sendhdr.seq++;	msgsend.msg_name = destaddr;	msgsend.msg_namelen = destlen;	msgsend.msg_iov = iovsend;	msgsend.msg_iovlen = 2;	iovsend[0].iov_base = &sendhdr;	iovsend[0].iov_len = sizeof(struct hdr);	iovsend[1].iov_base = outbuff;	iovsend[1].iov_len = outbytes;	msgrecv.msg_name = NULL;	msgrecv.msg_namelen = 0;	msgrecv.msg_iov = iovrecv;	msgrecv.msg_iovlen = 2;	iovrecv[0].iov_base = &recvhdr;	iovrecv[0].iov_len = sizeof(struct hdr);	iovrecv[1].iov_base = inbuff;	iovrecv[1].iov_len = inbytes;/* end dgsendrecv1 *//* include dgsendrecv2 */	Signal(SIGALRM, sig_alrm);	rtt_newpack(&rttinfo);		/* initialize for this packet */sendagain:#ifdef	RTT_DEBUG	fprintf(stderr, "send %4d: ", sendhdr.seq);#endif	sendhdr.ts = rtt_ts(&rttinfo);	Sendmsg(fd, &msgsend, 0);	alarm(rtt_start(&rttinfo));	/* calc timeout value & start timer */#ifdef	RTT_DEBUG	rtt_debug(&rttinfo);#endif	if (sigsetjmp(jmpbuf, 1) != 0) {		if (rtt_timeout(&rttinfo) < 0) {			err_msg("dg_send_recv: no response from server, giving up");			rttinit = 0;	/* reinit in case we're called again */			errno = ETIMEDOUT;			return(-1);		}#ifdef	RTT_DEBUG		err_msg("dg_send_recv: timeout, retransmitting");#endif		goto sendagain;	}	do {		n = Recvmsg(fd, &msgrecv, 0);#ifdef	RTT_DEBUG		fprintf(stderr, "recv %4d\n", recvhdr.seq);#endif	} while (n < sizeof(struct hdr) || recvhdr.seq != sendhdr.seq);	alarm(0);			/* stop SIGALRM timer */		/* 4calculate & store new RTT estimator values */	rtt_stop(&rttinfo, rtt_ts(&rttinfo) - recvhdr.ts);	return(n - sizeof(struct hdr));	/* return size of received datagram */}static voidsig_alrm(int signo){	siglongjmp(jmpbuf, 1);}/* end dgsendrecv2 */ssize_tDg_send_recv(int fd, const void *outbuff, size_t outbytes,			 void *inbuff, size_t inbytes,			 const SA *destaddr, socklen_t destlen){	ssize_t	n;	n = dg_send_recv(fd, outbuff, outbytes, inbuff, inbytes,					 destaddr, destlen);	if (n < 0)		err_quit("dg_send_recv error");	return(n);}

⌨️ 快捷键说明

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