示例#1
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);
    }
}
int
main(int argc, char **argv)
{
    int     sockfd = 0;
    int     n = 0;
    char    recvline[MAXLINE + 1];
    struct  sockaddr_in     servaddr;
    struct  in_addr         **pptr = NULL;             //
    struct  in_addr         *inetaddrp[2];      //
    struct  in_addr         inetaddr;           //
    struct  hostent         *hp = NULL;
    struct  servent         *sp = NULL;

    if ( argc != 3 )
    {
         err_quit("usage: daytimetcpcli <hostname> <service>");
    }

    if ( (hp = gethostbyname(argv[1])) == NULL )
    {
        if (inet_aton(argv[1], &inetaddr) == 0)
        {
             err_quit("hostname error for %s: %s\n",
                      argv[1], hstrerror(h_errno));
        }
        else
        {
            inetaddrp[0] = &inetaddr;
            inetaddrp[1] = NULL;
            pptr = inetaddrp;           //注意是有p的.
        }
    }
    else
    {
         pptr = (struct in_addr **) hp->h_addr_list;
    }

    //获得了相应服务的端口号什么的
    if ( (sp = getservbyname(argv[2], "tcp")) == NULL )
    {
        err_quit("getservbyname error for %s\n", argv[2]);
    }

    for ( ; *pptr != NULL; pptr++ )
    {
         sockfd = my_socket(AF_INET, SOCK_STREAM, 0);

         bzero(&servaddr, sizeof(servaddr));
         servaddr.sin_family    = AF_INET;
         servaddr.sin_port      = sp->s_port;       //帅
         memcpy(&servaddr.sin_addr, *pptr, sizeof(struct in_addr));
         printf("trying %s\n",
                 my_sock_ntop((SA *) &servaddr, sizeof(servaddr)));

         if (connect(sockfd, (SA *) &servaddr, sizeof(servaddr)) == 0)
         {
              break;        //success
         }
         err_ret("connect error");
         close(sockfd);
    }

    if (*pptr == NULL)                  //这里不是很懂
    {
         err_quit("unable to connect");
    }

    while ((n= my_read(sockfd, recvline, MAXLINE)) > 0)
    {
        recvline[n] = 0;
        my_fputs(recvline, stdout);
    }

    exit (0);
}
示例#3
0
int main(int argc, char **argv)
{
	//int sockfd;
	int flag_local =0;
	int flag_same =0;
	struct ifi_info *ifi;
	struct ifi_info *ifiClient;
	struct sockaddr_in *sin, *mask, *locAddr, *tempAddr;
	struct sockaddr_in servaddr, cliaddr;
	char serverStr[INET_ADDRSTRLEN], clientStr[INET_ADDRSTRLEN];	

	struct sockaddr *sa;


	bzero(&servaddr, sizeof(servaddr));
	bzero(&cliaddr, sizeof(cliaddr));
	memset(serverStr, 0, INET_ADDRSTRLEN);
	memset(clientStr, 0, INET_ADDRSTRLEN);
	
	
	client_args c_arguments;

	memset(&c_arguments, 0, sizeof(c_arguments));

	if(RET_FAILURE == read_client_input_file(&c_arguments))
	{
		exit(RET_FAILURE);
	}

#ifdef DEBUG
	printf("IP address: %s\n", c_arguments.ipAddress);		
	printf("Port number: %d\n", c_arguments.port_number);
	printf("File to send: %s\n", c_arguments.file_name);	
	printf("Window size: %d\n", c_arguments.window_size);
	printf("Seed: %d\n", c_arguments.seed);
	printf("Probability: %f\n", c_arguments.probability);
	printf("Mean time: %d\n", c_arguments.mean_time);
#endif


	

	unsigned long serverAddress=0;
	unsigned long temp=0, tempMask=0;
	unsigned long longestNetMask=0, longestNetMaskDiff =0; //Diff for server if on different network

	char* serverIPAddress = c_arguments.ipAddress;
	
	char* loopBack = "127.0.0.1";
	unsigned long loopBackAddress =0;
	inet_pton(AF_INET, loopBack, &loopBackAddress);
	inet_pton(AF_INET, serverIPAddress, &servaddr.sin_addr);
	
	
	/*
	**	Step 1
	**	To check whether the server is local or not
	*/
	for(ifi = get_ifi_info_plus(AF_INET, 1);  ifi != NULL; ifi=ifi->ifi_next)
	{
		mask = ((struct sockaddr_in *)ifi->ifi_ntmaddr);
		locAddr = ((struct sockaddr_in *)ifi->ifi_addr);
		
		if((servaddr.sin_addr.s_addr & mask->sin_addr.s_addr) == (locAddr->sin_addr.s_addr & mask->sin_addr.s_addr))
		{
			
			//To check Whether the server is on same network, if yes choose the highest precision netmask address
			flag_local = 1;
			temp = mask->sin_addr.s_addr;
			printf("MAsk of the interface : %ld\n", temp);
			if(temp > longestNetMask)
			{
				longestNetMask = temp;
				ifiClient = ifi;
			}
			//printf("Server is on the host itself \n");
			if(servaddr.sin_addr.s_addr == locAddr->sin_addr.s_addr)
			{
				flag_same = 1;
			}
		}
		else
		{
			tempMask = mask->sin_addr.s_addr;
			if(tempMask > longestNetMaskDiff)
			{
				longestNetMaskDiff = temp;
				ifiClient = ifi;
			}
		}
		printf("Information for an interface\n");
		printf("Name : %s\n", ifi->ifi_name);
		printf("Address : %s\n", my_sock_ntop(ifi->ifi_addr, sizeof(struct sockaddr)));
		printf("NetWork Mask : %s\n",my_sock_ntop(ifi->ifi_ntmaddr, sizeof(struct sockaddr)));
		printf("\n");

	}

	
	if(flag_same == 1)
	{
		servaddr.sin_addr.s_addr = loopBackAddress;
		locAddr->sin_addr.s_addr = loopBackAddress;
		cliaddr.sin_addr.s_addr = loopBackAddress;
	}	
	else if(flag_local == 1)
		{
			locAddr = ((struct sockaddr_in *)ifiClient->ifi_addr);
			cliaddr.sin_addr = locAddr->sin_addr;
		}
		else
		{
			locAddr = ((struct sockaddr_in *)ifiClient->ifi_addr);
			cliaddr.sin_addr = locAddr->sin_addr;
		}

	//printf("IS server on same network = %d\n Is server Local =%d \n", flag_same, flag_local);

	if(inet_ntop(AF_INET,&servaddr.sin_addr, serverStr, sizeof(serverStr)) <= 0)
	{
		perror("INET_PTON error:");
	}
	/*if(inet_ntop(AF_INET,&locAddr->sin_addr, clientStr, sizeof(clientStr)) <= 0)
	{
		perror("INET_PTON error:");
	}*/
	if(inet_ntop(AF_INET,&cliaddr.sin_addr, clientStr, sizeof(clientStr)) <= 0)
	{
		perror("INET_PTON error:");
	}
	
	//printf("Server address: %s\n",serverStr);
	//printf("Client Address: %s\n", clientStr);


	/*
	** 	Step 2
	**	Bind the UDP Socket to that client and server Address
	*/
	
	int sockfd;
	sockfd = socket(AF_INET, SOCK_DGRAM, 0);
	if(sockfd < 0)
	{
		perror("Error while creating UDP Socket:");
		exit(1);
	}	
	
	if(flag_same == 1)
	{
		int optval =1;
		setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR | SO_DONTROUTE, &optval, sizeof optval);
	}

	cliaddr.sin_family	= AF_INET;
	cliaddr.sin_port        = htons(0);
	
	if(bind(sockfd, (struct sockaddr *) &cliaddr, sizeof(cliaddr)) < 0)
	{
		perror("Bind error:");
		exit(1);
	}

	struct sockaddr_in cliSock;
	socklen_t len;
	bzero(&cliSock, sizeof(cliSock));
	len = sizeof(cliSock);
	if(getsockname(sockfd, (struct sockaddr *) &cliSock, &len) < 0)
	{
		perror("Get Socket Name error:");
		exit(1);
	}	

	printf("Client Binded to %s:%u\n",inet_ntoa(cliSock.sin_addr), ntohs(cliSock.sin_port));

	servaddr.sin_family      = AF_INET;
	servaddr.sin_port        = htons(c_arguments.port_number);
        //printf("Sever port : %d %d\n", servaddr.sin_port,MY_SERV_PORT);
	
	if(connect(sockfd,(struct sockaddr*)&servaddr,sizeof(servaddr))< 0)
	{
		perror("Server Connection Failed:");
		exit(1);
	}
	
	struct sockaddr_in servSock;
	//socklen_t len;
	bzero(&servSock, sizeof(servSock));
	len = sizeof(servSock);
	
	if(getpeername(sockfd, (struct sockaddr*)&servSock, &len) < 0)
	{
		perror("Getpeername failed :");
		exit(1);
	}
	
	printf("Server address %s:%u\n",inet_ntoa(servSock.sin_addr), ntohs(servSock.sin_port));

	/*
	**	Step 3
	**	Start acknowledgement with the server
	*/
	
	fileClient(sockfd, &servaddr, sizeof(servaddr), &c_arguments);


}
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);

}