读书人

经过socket得到自己的ip地址

发布时间: 2013-02-19 11:11:40 作者: rapoo

通过socket得到自己的ip地址
现在正在编一个在一个多网卡(多个ip)的服务器上的server程序。我一开始用INADDR_ANY绑定在一个监听的socketA上,当收到客户端的connect时,我server这边用accept接收,我想知道的是,怎样从accept的信息以及socketA中知道这个信息是从那个网卡,那个ip进来的?
谢谢!
[解决办法]
getsockname() 可否?
[解决办法]

        LST=accept(LSL,&saddr,PSOCKLEN_T&addrlen);
if (INVALID_SOCKET==LST) {
Log("%03d error on (accept) %d\n",cn,LastError());
break;//
}
addrlen=sizeof(sockaddr);
if (0!=(rc=getpeername(LST,&saddr,PSOCKLEN_T&addrlen))) {
Log("%03d 0!=%d=getpeername\n",cn,rc);
} else {
strcpy(RemoteIP,inet_ntoa(((sockaddr_in *)(&saddr))->sin_addr));
}

[解决办法]
引用:
accept()的第二个参数就是地址信息呀。。。

SOCKET accept(
__in SOCKET s,
__out struct sockaddr *addr,
__inout int *addrlen
);


[解决办法]
getsockname获得socket连接在本地的地址信息。getpeername获得对方的地址信息。GetAdaptersInfo获得本机网卡信息。。。
[解决办法]
引用:
引用:

accept()的第二个参数就是地址信息呀。。。

SOCKET accept(
__in SOCKET s,
__out struct sockaddr *addr,
__inout int *addrlen
);

+++
[解决办法]
引用:
引用:
getsockname获得socket连接在本地的地址信息。getpeername获得对方的地址信息。GetAdaptersInfo获得本机网卡信息。。。


我不想得到详细信息,我只想得到来自Client的信息是从我的哪个网卡中进来的

int getsockname(
__in SOCKET s,
__out struct sockaddr* name,
__in_out int* namelen
);
这个函数调用后,name中保存了详细信息,然后:
BOOL GetInfo(const sockaddr_in* ina,std::string& szName,std::string& szIP,u_short & nPort)
{
struct hostent *remoteHost;
if(ina->sin_addr.s_addr == INADDR_NONE)
return FALSE;
else
remoteHost = gethostbyaddr((const char*) &ina->sin_addr,sizeof(in_addr),AF_INET);
if (remoteHost == NULL)
return FALSE;
else
{
szName.assign(remoteHost->h_name);
szIP.assign(inet_ntoa(ina->sin_addr));
nPort = ntohs(ina->sin_port);


}
return TRUE;
}


szIP就可以区分是哪个网卡

读书人网 >C语言

热点推荐