getsockname 和 getpeername

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));

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章