示例#1
0
ssize_t dg_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_flags = 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;

	Signal(SIGALRM, sig_alrm);
	rtt_newpack(&rttinfo);	/* initialize for this packet */

sendagain:
	sendhdr.ts = rtt_ts(&rttinfo);
	Sendmsg(fd, &msgsend, 0);

	alarm(rtt_start(&rttinfo)); /* calc timeout value & start timer */
	if (sigsetjmp(jmpbuf, 1) != 0) {
		if (rtt_timeout(&rttinfo) < 0) {
			err_msg("dg_send_recv: no response from server, giving up");
			rtt_init = 0;	/* reinit in case we're called again */
			errno = ETIMEDOUT;
			return -1;
		}
		goto sendagain;
	}

	do {
		n = Recvmsg(fd, &msgrecv, 0);
	} while (n < sizeof(struct hdr) || recvhdr.seq != sendhdr.seq);
	alarm(0);	/* stop SIGALRM timer. */

	/* calculate & store new RTT estimator value. */
	rtt_stop(&rttinfo, rtt_ts(&rttinfo) - recvhdr.ts);

	return (n - sizeof(struct hdr)); /* return size of received datagram. */
}
示例#2
0
void dg_echo(int sockfd, SA* pcliaddr, socklen_t clilen)
{
    int n;
    char mesg[MAXLINE];
    int on;
    char control[MAXLINE];
    struct msghdr msg;
    struct cmsghdr* cmsg;
    struct iovec iov[1];

    on = 1;
    Setsockopt(sockfd, IPPROTO_IPV6, IPV6_RECVRTHDR, &on, sizeof(on));

    bzero(&msg, sizeof(msg));
    iov[0].iov_base = mesg;
    msg.msg_name = pcliaddr;
    msg.msg_iov = iov;
    msg.msg_iovlen = 1;
    msg.msg_control = control;
    for (;;) {
        msg.msg_namelen = clilen;
        msg.msg_controllen = sizeof(control);
        iov[0].iov_len = MAXLINE;
        n = Recvmsg(sockfd, &msg, 0);

        for (cmsg = CMSG_FIRSTHDR(&msg); cmsg != NULL;
             cmsg = CMSG_NXTHDR(&msg, cmsg)) {
            if (cmsg->cmsg_level == IPPROTO_IPV6 &&
                cmsg->cmsg_type == IPV6_RTHDR) {
                inet6_srcrt_print(CMSG_DATA(cmsg));
                Inet6_rth_reverse(CMSG_DATA(cmsg), CMSG_DATA(cmsg));
            }
        }

        iov[0].iov_len = n;
        Sendmsg(sockfd, &msg, 0);
    }
}
示例#3
0
void
my_str_cli(FILE *fp, int sockfd)
{
	char	sendline[MAXLINE] = {0};//recvline[MAXLINE];
	struct iovec iov[2];
    char	buf1[MAXLINE] = {0};
    char	buf2[MAXLINE] = {0};
    ssize_t size;

	while (Fgets(sendline, MAXLINE, fp) != NULL) {

		Writen(sockfd, sendline, strlen(sendline));
        //Send(sockfd, sendline, strlen(sendline), 0);
        memcpy(buf1, sendline, strlen(sendline));
        memcpy(buf2, sendline, strlen(sendline));
        iov[0].iov_base=buf1;
        iov[0].iov_len=strlen(buf1);
        iov[1].iov_base=buf2;
        iov[1].iov_len=strlen(buf2);
        //Writev(sockfd,iov,2);

        struct msghdr msg = {0, };
        msg.msg_name = NULL;
        msg.msg_namelen = 0;
        msg.msg_iov = iov;
        msg.msg_iovlen = 2;
        //msg.msg_control = control_un.control;
        //msg.msg_controllen = sizeof(control_un.control);
        Sendmsg(sockfd, &msg, 0);
  
       

		//if (Readline(sockfd, recvline, MAXLINE) == 0)
		//	err_quit("str_cli: server terminated prematurely");

		//Fputs(recvline, stdout);
	}
}
ssize_t 
dg_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];
	fd_set rset;
	int nsel, maxfdp1;
	struct timeval tv;
 
	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; 

	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 

	tv.tv_sec = rtt_start(&rttinfo);
	tv.tv_usec = 0;
	maxfdp1 = fd + 1;	

again:
	FD_ZERO(&rset);
	FD_SET(fd, &rset);
	nsel = select(maxfdp1, &rset, NULL, NULL, &tv);
	if ((nsel == -1) || (errno == EINTR))
		goto again;
	else if (nsel == -1)
		err_msg("select error");
	else if (nsel == 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; 
	}
	if (FD_ISSET(fd, &rset)) {
		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); 
	}

	/* 4calculate & store new RTT estimator values */ 
	rtt_stop(&rttinfo, rtt_ts(&rttinfo) - recvhdr.ts); 
 
	return(n - sizeof(struct hdr)); /* return size of received datagram */ 
}