zoukankan      html  css  js  c++  java
  • UNIX网络编程——UDP 中的外出接口的确定

         已连接UDP套接字还可用来确定用于特定目的地的外出接口。这是由connect函数应用到UDP套接字时的一个副作用造成的:内核选择本地IP地址。这个本地IP地址通过为目的IP地址搜索路由表得到外出接口,然后选用该接口的主IP地址而选定。

        注意:getsockname函数调用的位置

    #include <unistd.h>
    #include <sys/types.h>
    #include <sys/socket.h>
    #include <netinet/in.h>
    #include <arpa/inet.h>
    #include <stdlib.h>
    #include <stdio.h>
    #include <errno.h>
    #include <string.h>
    
    #define SERV_PORT 3333
    #define MAXLINE 1024
    #define ERR_EXIT(m) 
            do 
            { 
                    perror(m); 
                    exit(EXIT_FAILURE); 
            } while(0)
    
    typedef struct sockaddr SA;
    int main(int argc, char **argv)
    {
    	int					sockfd;
    	socklen_t			len,peer_len;
    	struct sockaddr_in	cliaddr, servaddr,peer_addr;
    
    	if (argc != 2)
    		ERR_EXIT("usage: udpcli <IPaddress>");
    
    	sockfd = socket(AF_INET, SOCK_DGRAM, 0);
    
    	bzero(&servaddr, sizeof(servaddr));
    	servaddr.sin_family = AF_INET;
    	servaddr.sin_port = htons(SERV_PORT);
    	inet_pton(AF_INET, argv[1], &servaddr.sin_addr);
    
    	connect(sockfd, (SA *) &servaddr, sizeof(servaddr));
    
    	len = sizeof(cliaddr);
    	getsockname(sockfd, (SA *) &cliaddr, &len);
    	printf("local address %s and port = %d
    ", inet_ntoa(cliaddr.sin_addr),ntohs(cliaddr.sin_port));
    	getpeername(sockfd,(SA *) &peer_addr, &peer_len);
    	printf("peer address %s and port = %d
    ", inet_ntoa(peer_addr.sin_addr),ntohs(peer_addr.sin_port));
    	exit(0);
    }

    运行结果:

    huangcheng@ubuntu:~$ ./cli 192.168.2.103
    local address 192.168.2.103 and port = 53271
    peer address 192.168.2.103 and port = 3333

  • 相关阅读:
    apache安装 mod_evasive
    sshd调优
    MySQL服务器状态变量
    MySQL查询缓存
    MySQL并发调优和IO调优
    MySQL线程独享[转]
    mysql线程缓存和表缓存
    MySQL点滴
    MySQL优化常用
    apache的prefork的详解
  • 原文地址:https://www.cnblogs.com/hehehaha/p/6332580.html
Copyright © 2011-2022 走看看