getsockname函數用於獲取與某個套接字關聯的本地協議地址 (ip 和 port)
getpeername函數用於獲取與某個套接字關聯的外地協議地址 (ip 和 port)
定義如下:
#include<sys/socket.h>
int getsockname(int sockfd, struct sockaddr *localaddr, socklen_t *addrlen);
int getpeername(int sockfd, struct sockaddr *peeraddr, socklen_t *addrlen);
函數應用環境:
- 在一個沒有調用bind的客戶端上,在connect成功返回之後,getsockname用於返回內核賦予的該連接的本地IP和PORT.
- 在以端口號0 (告知內核選擇本地端口號) 調用bind之後,getsockname用於返回內核賦予的該連接的本地IP和PORT.
- 在一個any通配地址調用bind的服務器上,在與客戶端連接之後,accept成功返回,getsockname用於返回內核賦予的該連接的本地IP和PORT.
- 當服務器有調用過accept的某個進程通過調用exec執行程序時,它能夠獲取客戶身份的唯一途徑就是getpeername。
函數使用:
struct sockaddr_in listendAddr, connectedAddr, peerAddr;
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);//使用任意通配地址
servaddr.sin_port = htons(PORT);
bind(listenfd, (struct sockaddr*)&servaddr, sizeof(servaddr));//服務器端綁定地址
listen(listenfd, LISTENQ);
listendAddrLen = sizeof(listendAddr);
//使用偵聽套接字listenfd 獲取監聽的地址和端口
getsockname(listenfd, (struct sockaddr *)&listendAddr, &listendAddrLen);
printf("listen address = %s:%d\n",
inet_ntoa(listendAddr.sin_addr),
ntohs(listendAddr.sin_port));
connfd = accept(listenfd, (struct sockaddr *)NULL, NULL);
connectedAddrLen = sizeof(connectedAddr);
//使用連接套接字connfd 獲取連接上的 本地 地址和端口
getsockname(connfd, (struct sockaddr *)&connectedAddr, &connectedAddrLen);
printf("connected server address = %s:%d\n",
inet_ntoa(connectedAddr.sin_addr),
ntohs(connectedAddr.sin_port));
//使用連接套接字connfd 獲取的連接上的 對端 地址和端口
getpeername(connfd, (struct sockaddr *)&peerAddr, &peerLen);
printf("connected peer address = %s:%d\n",
inet_ntop(AF_INET, &peerAddr.sin_addr, ipAddr, sizeof(ipAddr)),
ntohs(peerAddr.sin_port));