getsockname和getpeername函數

#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程序

       

相關文章
相關標籤/搜索