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:描述字不是一個套介面。