首先講一下用到的兩個函數(shù)---------getsockname()和getpeername():
1、getsockname()
獲取一個套接口的本地名字。
#include <winsock.h>;
int PASCAL FAR getsockname( SOCKET s, struct sockaddr FAR* name,int FAR* namelen);
s:標(biāo)識一個已捆綁套接口的描述字。
name:接收套接口的地址(名字)。
namelen:名字緩沖區(qū)長度。
getsockname()函數(shù)用于獲取一個套接口的名字。它用于一個已捆綁或已連接套接口s,本地地址將被返回。本調(diào)用特別適用于如下情況:未調(diào)用bind()就調(diào)用了connect(),這時唯有g(shù)etsockname()調(diào)用可以獲知系統(tǒng)內(nèi)定的本地地址。在返回時,namelen參數(shù)包含了名字的實際字節(jié)數(shù)。
若一個套接口與INADDR_ANY捆綁,也就是說該套接口可以用任意主機(jī)的地址,此時除非調(diào)用connect()或accept()來連接,否則getsockname()將不會返回主機(jī)IP地址的任何信息。除非套接口被連接,WINDOWS套接口應(yīng)用程序不應(yīng)假設(shè)IP地址會從INADDR_ANY變成其他地址。這是因為對于多個主機(jī)環(huán)境下,除非套接口被連接,否則該套接口所用的IP地址是不可知的。
返回值:
若無錯誤發(fā)生,getsockname()返回0。否則的話,返回SOCKET_ERROR錯誤,應(yīng)用程序可通過WSAGetLastError()獲取相應(yīng)錯誤代碼。
錯誤代碼:
WSANOTINITIALISED:在使用此API之前應(yīng)首先成功地調(diào)用WSAStartup()。
WSAENETDOWN:WINDOWS套接口實現(xiàn)檢測到網(wǎng)絡(luò)子系統(tǒng)失效。
WSAEFAULT:namelen參數(shù)不夠大。
WSAEINPROGRESS:一個阻塞的WINDOWS套接口調(diào)用正在運(yùn)行中。
WSAENOTSOCK:描述字不是一個套接口。
WSAEINVAL:套接口未用bind()捆綁。
2、------getpeername()
獲取與套接口相連的端地址。
#include <winsock.h>
int PASCAL FAR getpeername( SOCKET s, struct sockaddr FAR* name,
int FAR* namelen);
s:標(biāo)識一已連接套接口的描述字。
name:接收端地址的名字結(jié)構(gòu)。
namelen:一個指向名字結(jié)構(gòu)的指針。
getpeername()函數(shù)用于從端口s中獲取與它捆綁的端口名,并把它存放在sockaddr類型的name結(jié)構(gòu)中。它適用于數(shù)據(jù)報或流類套接口。
返回值:
若無錯誤發(fā)生,getpeername()返回0。否則的話,返回SOCKET_ERROR,應(yīng)用程序可通過WSAGetLastError()來獲取相應(yīng)的錯誤代碼。
錯誤代碼:
WSANOTINITIALISED:在使用此API之前應(yīng)首先成功地調(diào)用WSAStartup()。
WSAENETDOWN:WINDOWS套接口實現(xiàn)檢測到網(wǎng)絡(luò)子系統(tǒng)失效。
WSAEFAULT:namelen參數(shù)不夠大。
WSAEINPROGRESS:一個阻塞的WINDOWS套接口調(diào)用正在運(yùn)行中。
WSAENOTCONN 套接口未連接。
WSAENOTSOCK:描述字不是一個套接口。