#include <sys/socket.h> int getsockname(int sockfd, struct sockaddr *localaddr, socklen_t *addrlrn); int getpeername(int sockfd, struct sockaddr *peeraddr, socklen_t *addrlen); 返回:成功返回0,出錯則爲-1
一、函數用途服務器
getsockname:獲取與某個套接字關聯的本地協議地址socket
getpeername:獲取與某個套接字關聯的外地協議地址函數
二、須要這兩個函數的緣由spa
(1)在一個沒有調用bind的TCP客戶上,connect成功後,getsockname用於獲取由內核賦予該鏈接的本地IP地址和本地端口號;code
(2)在以端口號0調用bind(告知內核去選擇本地端口號)後,getsockname用於獲取由內核賦予的本地端口號;blog
(3)getsockname能夠用於獲取某個套接字的地址族 進程
int sockfd_to_family(int sockfd) { struct sockaddr_storage ss; socklen_t len; len = sizeof(ss); if (getsockname(sockfd, (SA *) &ss , &len) < 0) { return (-1); } return (ss.ss_family); }
(4)在一個以通配IP地址調用bind的TCP服務器上,與某個客戶的鏈接一旦創建(accept成功返回),getsockname就能夠用於獲取get
由內核賦予該鏈接的本地IP地址;在這樣的調用中,套接字描述符參數必須是已鏈接套接字的描述符,而不是監聽套接字描述符;class
(5)當一個服務器 由調用過accept的某個進程經過調用exec來執行程序時,它可以獲取客戶身份的惟一途徑是調用getpeername程序