linux socket編程client獲取使用的ip和port


今天為了測試機器綁定多ip時socket client使用的ip和port,

因此查詢資料看了下如何獲取client的ip和port(系統自選而不是bind綁定)

主要是對連接的描述符通過getsockname 函數獲取client的地址信息,函數說明如下

#include <sys/socket.h>
int getsockname(int sockfd, struct sockaddr *localaddr, socklen_t *addrlen);
int getpeername(int sockfd, struct sockaddr *peeraddr, socklen_t *addrlen);
返回:0—OK,-1—出錯。

getsockname函數返回與套接口關聯的本地協議地址。

getpeername函數返回與套接口關聯的遠程協議地址。

addrlen是值-結果參數。

使用場合:

  • 在不調用bind的TCP客戶,當connect成功返回后,getsockname返回分配給此連接的本地IP地址和本地端口號;
  • 在以端口號為0調用bind后,使用getsockname返回內核分配的本地端口號;
  • getsockname可用來獲取某套接口的地址族;
  • 在捆綁了通配IP地址的TCP服務器上,當連接建立后,可以使用getsockname獲得分配給此連接的本地IP地址;
  • 當一個服務器調用exec啟動后,他獲得客戶身份的唯一途徑是調用getpeername函數。

可以參見:http://www.kernel.org/doc/man-pages/online/pages/man2/getsockname.2.html

獲取地址之后就可以通過inet_ntop 將ip轉為字符串表示:

http://beej.us/guide/bgnet/output/html/multipage/inet_ntopman.html 可以看inet_ntop的使用

 

   1: bool GetLocalIP(int fd, std::string* local_ip, int* port) {
   2:   struct sockaddr local_addr;
   3:   socklen_t len = sizeof(sockaddr);
   4:   if (getsockname(fd, &;local_addr, &len) == 0) {
   5:     struct sockaddr_in* sin = (struct sockaddr_in*)(&;local_addr);
   6:     *port = sin->;sin_port;
   7:     char addr_buffer[INET_ADDRSTRLEN];
   8:     void * tmp = &(sin->sin_addr);
   9:     if (inet_ntop(AF_INET, tmp, addr_buffer, INET_ADDRSTRLEN) == NULL){
  10:       cerr <;< "inet_ntop err";
  11:       return false;
  12:     }   
  13:     cout <;< "addr:" << addr_buffer;
  14:     if (local_ip != NULL) {
  15:       local_ip->;assign(addr_buffer);
  16:     }   
  17:     return true;
  18:   } else {
  19:     cerr <;< "getsockname err";
  20:     return false;
  21:   }


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM