1. 程式人生 > >Socket程式設計:得到本地Server主機IP和對方Client主機IP

Socket程式設計:得到本地Server主機IP和對方Client主機IP

1、getsockname()

  獲取一個套介面的本地名字。

  #include <winsock.h>;

  int PASCAL FAR getsockname( SOCKET s, struct sockaddr FAR* name,int FAR*

namelen);

  s:標識一個已捆綁套介面的描述字。
  name:接收套介面的地址(名字)。
  namelen:名字緩衝區長度。

 getsockname()函式用於獲取一個套介面的名字。它用於一個已捆綁或已連線套介面s,本

地地址將被返回。本呼叫特別適用於如下情況:未呼叫bind()就呼叫了connect(),這時唯

有getsockname()呼叫可以獲知系統內定的本地地址。在返回時,namelen引數包含了名字

的實際位元組數。
若一個套介面與INADDR_ANY捆綁,也就是說該套介面可以用任意主機的地址,此時除非調

用connect()或accept()來連線,否則getsockname()將不會返回主機IP地址的任何資訊。

除非套介面被連線,WINDOWS套介面應用程式不應假設IP地址會從INADDR_ANY變成其他地址

。這是因為對於多個主機環境下,除非套介面被連線,否則該套介面所用的IP地址是不可

知的。

返回值:
 若無錯誤發生,getsockname()返回0。否則的話,返回SOCKET_ERROR錯誤,應用程式可通

過WSAGetLastError()獲取相應錯誤程式碼。


錯誤程式碼:
  WSANOTINITIALISED:在使用此API之前應首先成功地呼叫WSAStartup()。
  WSAENETDOWN:WINDOWS套介面實現檢測到網路子系統失效。
  WSAEFAULT:namelen引數不夠大。
  WSAEINPROGRESS:一個阻塞的WINDOWS套介面呼叫正在執行中。
  WSAENOTSOCK:描述字不是一個套介面。
  WSAEINVAL:套介面未用bind()捆綁。

2、------getpeername()

 獲取與套介面相連的端地址。

  #include <winsock.h>

  int PASCAL FAR getpeername( SOCKET s, struct sockaddr FAR* name,
  int FAR* namelen);

  s:標識一已連線套介面的描述字。
  name:接收端地址的名字結構。
  namelen:一個指向名字結構的指標。

 getpeername()函式用於從埠s中獲取與它捆綁的埠名,並把它存放在sockaddr型別的

name結構中。它適用於資料報或流類套介面。

返回值:
  若無錯誤發生,getpeername()返回0。否則的話,返回SOCKET_ERROR,應用程式可通過

WSAGetLastError()來獲取相應的錯誤程式碼。

錯誤程式碼:
  WSANOTINITIALISED:在使用此API之前應首先成功地呼叫WSAStartup()。
  WSAENETDOWN:WINDOWS套介面實現檢測到網路子系統失效。
  WSAEFAULT:namelen引數不夠大。
  WSAEINPROGRESS:一個阻塞的WINDOWS套介面呼叫正在執行中。
  WSAENOTCONN 套介面未連線。
  WSAENOTSOCK:描述字不是一個套介面。