getpeername

getpeername

int getpeername(int s, struct sockaddr *name, socklen_t *namelen);描述

獲取socket的對方地址

基本介紹

  • 外文名:getpeername
  • 性質:命令
  • 學科:計算機語言
  • 描述:獲取socket的對方地址
得到對方的地址
struct sockaddr_in sa;
int len = sizeof(sa);
if(!getpeername(sockfd, (struct sockaddr *)&sa, &len))
{
printf( "對方IP:%s ", inet_ntoa(sa.sin_addr));
printf( "對方PORT:%d ", ntohs(sa.sin_port));
}
補充:getsockname和getpeername調度時機很重要,如果調用時機不對,則無法正確獲得地址和連線埠。
TCP
對於伺服器來說,在bind以後就可以調用getsockname來獲取本地地址和連線埠,雖然這沒有什麼太多的意義。getpeername只有在連結建立以後才調用,否則不能正確獲得對方地址和連線埠,所以他的參數描述字一般是連結描述字而非監聽套接口描述字。
對於客戶端來說,在調用socket時候核心還不會分配IP和連線埠,此時調用getsockname不會獲得正確的連線埠和地址(當然連結沒建立更不可能調用getpeername),當然如果調用了bind 以後可以使用getsockname。想要正確得到對方地址(一般客戶端不需要這個功能),則必須在連結建立以後,同樣連結建立以後,此時客戶端地址和連線埠就已經被指定,此時是調用getpeername的時機。
UDP
UDP分為連結和沒有連結2種(這個到UDP與connect可以找到相關內容)
沒有連結的UDP不能調用getpeername,但是可以調用getsockname,和TCP一樣,他的地址和連線埠不是在調用socket就指定了,而是在第一次調用sendto函式以後
已經連結的UDP,在調用connect以後,這2個函式都是可以用的(同樣,getpeername也沒太大意義。如果你不知道對方的地址和連線埠,不可能會調用connect)。

相關詞條

熱門詞條

聯絡我們