UNIX网络编程——UDP 中的外出接口的确定

本文介绍了一个使用UDP套接字的示例程序,演示了如何确定本地和远程地址及端口。通过调用connect函数连接到指定IP地址,再使用getsockname和getpeername获取本地与远程地址信息。

     已连接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\n", inet_ntoa(cliaddr.sin_addr),ntohs(cliaddr.sin_port));
	getpeername(sockfd,(SA *) &peer_addr, &peer_len);
	printf("peer address %s and port = %d\n", 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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值