void dg_cli(FILE *fp, int sockfd, const SA *pservaddr, socklen_t servlen)
{
    int     n = 0;
    const   int     on = 1;
    char    sendline[MAXLINE] = {0};
    char    recvline[MAXLINE + 1] = {0};
    sigset_t   sigset_alrm;
    socklen_t   len ;
    struct  sockaddr    *preply_addr;

    preply_addr = my_malloc(servlen);       //???为什么要这个?
    my_setsockopt(sockfd, SOL_SOCKET, SO_BROADCAST, &on, sizeof(on));
    my_signal(SIGALRM, recvfrom_alarm);
    
    my_sigemptyset(&sigset_alrm);
    my_sigaddset(&sigset_alrm, SIGALRM);

    while (my_fgets(sendline, MAXLINE, fp) != NULL)
    {
         my_sendto(sockfd, sendline, strlen(sendline),
                    0, pservaddr, servlen);

         alarm(5);

         while(1)
         {
              len = servlen;
//              DEBUG;
//              printf("recvfrom 前面!\n");
              my_sigprocmask(SIG_UNBLOCK, &sigset_alrm, NULL);
              n = recvfrom(sockfd, recvline, MAXLINE,
                            0, preply_addr, &len);
              my_sigprocmask(SIG_BLOCK, &sigset_alrm, NULL);

              if (n < 0)
              {
                   if (errno == EINTR)
                   {
                       break;
                   }
                   else
                   {
                        err_sys("recvfrom error");
                   }
              }
              else
              {
                   recvline[n] = 0;
                   sleep(1);
                   printf("from %s: %s",
                           my_sock_ntop_host(preply_addr, len),
                           recvline);
              }
         }//while
    }//while

    free(preply_addr);
}
Example #2
0
void tu8_19dg_cli(FILE *fp, int sockfd, 
					const SA *pservaddr, socklen_t servlen)
{
	int		i = 0;
	char	sendline[DGLEN];
	
	for (i = 0; i < NDG; i++)
	{
		my_sendto(sockfd, sendline, DGLEN, 0, pservaddr, servlen);
	} 
	printf("i = %d\n", i);
}
Example #3
0
void dg_cli(FILE *fp, int sockfd, const SA *pservaddr, socklen_t servlen)
{
    int     n = 0;
    char    sendline[MAXLINE];
    char    recvline[MAXLINE + 1];              //!!!

    while (my_fgets(sendline, MAXLINE, fp) != NULL)
    {
         my_sendto(sockfd, sendline, strlen(sendline),
                    0, pservaddr, servlen);
         n = my_recvfrom(sockfd, recvline, MAXLINE,
                         0, NULL, NULL);

         recvline[n] = 0;

         my_fputs(recvline, stdout);
    }
}
Example #4
0
void tu8_9dg_cli(FILE *fp, int sockfd,
                    const SA *pservaddr, socklen_t servlen)
{
    int     n = 0;
    char    sendline[MAXLINE];
    char    recvline[MAXLINE];
    socklen_t len ;
    struct  sockaddr     *preply_addr;       //用于返回的地址, sockaddr!!!

    preply_addr = my_malloc(servlen);

    while (my_fgets(sendline, MAXLINE, fp) != NULL)
    {
         my_sendto(sockfd, sendline, strlen(sendline),
                    0, pservaddr, servlen);
//		 printf("sendto %s : %s\n",
//				 my_sock_ntop(preply_addr, len), sendline);
				 
         len = servlen ;
         n = my_recvfrom(sockfd, recvline, MAXLINE,
                            0, preply_addr, &len);
//		 printf("recvfrom %s : %s\n",
//				 my_sock_ntop(preply_addr, len), recvline);

         if (len != servlen
                || memcmp(pservaddr, preply_addr, len) != 0)
         {
              printf("reply from %s (ignored)\n",
                        my_sock_ntop(preply_addr, len));
              continue;
         }

         recvline[n] = 0;
         my_fputs(recvline, stdout);
    }
}
Example #5
0
int
main(int argc, char *argv[])
{
	int error, sock_listen, sock_recv, sock_send;
	struct sockaddr_ipx sipx_listen, sipx_send;
	pid_t childpid, parentpid;

	/*
	 * Socket to receive with.
	 */
	sock_listen = socket(PF_IPX, SOCK_STREAM, 0);
	if (sock_listen < 0)
		err(-1, "sock_listen = socket(PF_IPX, SOCK_STREAM, 0)");

	bzero(&sipx_listen, sizeof(sipx_listen));
	sipx_listen.sipx_len = sizeof(sipx_listen);
	sipx_listen.sipx_family = AF_IPX;
	sipx_listen.sipx_addr = ipx_addr(IPX_ENDPOINT);

	if (bind(sock_listen, (struct sockaddr *)&sipx_listen,
	    sizeof(sipx_listen)) < 0)
		err(-1, "bind(sock_listen)");

	if (listen(sock_listen, -1) < 0)
		err(-1, "listen(sock_listen)");

	parentpid = getpid();

	childpid = fork();
	if (childpid < 0)
		err(-1, "fork()");

	if (childpid == 0) {
		/*
		 * The child: accept connections and process data on them.
		 */
		while (1) {
			sock_recv = accept(sock_listen, NULL, NULL);
			if (sock_recv < 0) {
				warn("accept()");
				continue;
			}

			my_recv(sock_recv, "listener", parentpid);
			my_send(sock_recv, "listener", parentpid);

			close(sock_recv);
		}
	} else {
		/*
		 * The parent: connect, send data, receive it back, and exit;
		 * build two connections, once using a full connect() API
		 * call, and the second using sendto().
		 */

		/*
		 * Socket to send with.
		 */
		sock_send = socket(PF_IPX, SOCK_STREAM, 0);
		if (sock_send < 0) {
			error = errno;
			(void)kill(childpid, SIGTERM);
			errno = error;
			err(-1, "sock_send = socket(PF_IPX, SOCK_STREAM, 0)");
		}

		bzero(&sipx_send, sizeof(sipx_send));
		sipx_send.sipx_len = sizeof(sipx_send);
		sipx_send.sipx_family = AF_IPX;
		sipx_send.sipx_addr = ipx_addr(IPX_ENDPOINT);

		if (connect(sock_send, (struct sockaddr *)&sipx_send,
		    sizeof(sipx_send)) < 0) {
			error = errno;
			(void)kill(childpid, SIGTERM);
			errno = error;
			err(-1, "sock_send = socket(PF_IPX, SOCK_STREAM, 0)");
		}

		my_send(sock_send, "connector", childpid);
		my_recv(sock_send, "connector", childpid);

		close(sock_send);

#ifdef SPX_SUPPORTS_SENDTO_WITH_CONNECT
		sock_send = socket(PF_IPX, SOCK_STREAM, 0);
		if (sock_send < 0) {
			error = errno;
			(void)kill(childpid, SIGTERM);
			errno = error;
			err(-1, "sock_send = socket(PF_IPX, SOCK_STREAM, 0)");
		}

		bzero(&sipx_send, sizeof(sipx_send));
		sipx_send.sipx_len = sizeof(sipx_send);
		sipx_send.sipx_family = AF_IPX;
		sipx_send.sipx_addr = ipx_addr(IPX_ENDPOINT);

		my_sendto(sock_send, "connector", childpid,
		    (struct sockaddr *)&sipx_send, sizeof(sipx_send));
		my_recv(sock_send, "connector", childpid);

		close(sock_send);
#endif

		(void)kill(childpid, SIGTERM);
	}

	return (0);
}
void dg_cli(FILE *fp, int sockfd, const SA *pservaddr, socklen_t servlen)
{
    int     n = 0;
    int     maxfdp1 = 0;
    const   int     on = 1;
    char    sendline[MAXLINE] = {0};
    char    recvline[MAXLINE] = {0};
    fd_set  rset;
    socklen_t   len;
    struct  sockaddr    *preply_addr = NULL;

    preply_addr = my_malloc(servlen);

    my_setsockopt(sockfd, SOL_SOCKET, SO_BROADCAST, &on, sizeof(on));

    my_pipe(pipefd);
//    printf("pipefd[0] = %d\n", pipefd[0]); //+

    maxfdp1 = max(sockfd, pipefd[0]) + 1;

    FD_ZERO(&rset);

    my_signal(SIGALRM, recvfrom_alarm);

    while (my_fgets(sendline, MAXLINE, fp) != NULL )
    {
        my_sendto(sockfd, sendline, strlen(sendline),
                  0, pservaddr, servlen);

        alarm(3);

        while (1)
        {
            FD_SET(sockfd, &rset);
            FD_SET(pipefd[0], &rset);

            if ( (n = select(maxfdp1, &rset, NULL, NULL, NULL)) < 0 )
            {
                if (errno == EINTR)
                {
                    DEBUG;
                    printf("select errno = EINTR\n");    //+
                    continue;
                }
                else
                {
                    err_sys("select error");
                }
            }
//                printf("kankan!\n");
            if ( FD_ISSET(sockfd, &rset) )
            {
                len = servlen;
                n = my_recvfrom(sockfd, recvline, MAXLINE,
                                0, preply_addr, &len);
                recvline[n] = 0;
                printf("from %s: %s",
                       my_sock_ntop(preply_addr, len),
                       recvline);
            }

            if ( FD_ISSET(pipefd[0], &rset) )
            {
//                   printf("read 上面\n");
                my_read(pipefd[0], &n, 1);   //timer expired
//                   printf("read 下面!\n");
                break;
            }
        }
    }

    free(preply_addr);

}