【发布时间】:2012-06-08 22:50:10
【问题描述】:
由于 BSD 套接字中没有获取 IP 地址的功能,因此我执行了客户端/服务器程序来建立连接。每个线程一个:服务器和客户端。
使用 localhost 从“inet_ntoa”返回的 IP 地址是 127.0.0.1。
但是网络说我的电脑是这个 10.0.0.7,这个地址是可以的。
如何获取 10.0.0.7 地址? 谢谢
这是我的代码:
DWORD WINAPI CIpAddressDlg::Thread_TcpServer(LPVOID iValue)
{
CIpAddressDlg *pp = (CIpAddressDlg*)iValue;
CString c;
char buffer[128];
int sinlen;
struct sockaddr_in sin;
int s, h;
sin.sin_family = AF_INET;
sin.sin_addr.s_addr = INADDR_ANY;
sin.sin_port = htons(4000); // Port
s = socket(AF_INET, SOCK_STREAM,0);
bind(s,(struct sockaddr*)&sin,sizeof(sin));
listen(s,1);
sinlen = sizeof(sin);
h=accept(s,(struct sockaddr*)&sin,&sinlen );
//get IP address
int len = sizeof sin;
if(::getsockname(h,(struct sockaddr*)&sin,&len) == -1)
pp->MessageBox("Error local host ip");
c.Format("%d\nlocal addr %s:%u\n errno: %d", sin.sin_addr, inet_ntoa(sin.sin_addr),ntohs(sin.sin_port), errno);
pp->MessageBox(c);
//verification of send
recv(h,buffer,sizeof(buffer),0);
pp->MessageBox(buffer);
send(h,buffer,strlen(buffer),0);
::closesocket(s);
return 0;
}
DWORD WINAPI CIpAddressDlg::Thread_TcpClient(LPVOID iValue)
{
CIpAddressDlg *pp = (CIpAddressDlg*)iValue;
CString c;
char buffer[128]= "Hello world";
struct sockaddr_in sin;
struct hostent *host;
int s;
host = gethostbyname("localhost");
memcpy(&(sin.sin_addr), host->h_addr,host->h_length);
sin.sin_family = host->h_addrtype;
sin.sin_port = htons(4000);
s = socket(AF_INET, SOCK_STREAM,0);
connect(s, (struct sockaddr*)&sin,sizeof(sin));
send(s,buffer,strlen(buffer)+1,0);
recv(s,buffer,sizeof(buffer),0);
::closesocket(s);
return 0;
}
【问题讨论】:
-
您是否正在尝试获取正在运行脚本的计算机的“私有”/“LAN”IP?当然有更简单的方法可以做到这一点。
-
我是一个 linux 人,但是 GetAdaptersAddresses 呢?链接中提供的示例代码似乎非常详尽。它绝对不需要你经历的所有麻烦:-)
-
获取适配器信息? See "Method Three" here, Some sample code here
-
附带说明一下,BSD 套接字中有一个功能可以做到这一点 (
getifaddrs),它只是没有移植到 Windows。 -
还有this might help(使用Winsock API)