已連接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
作者:csdn博客 ctthuangcheng
查看本欄目更多精彩內容:http://www.bianceng.cn/OS/unix/