怎样获取socket server的网络地址?

frankspy 2009-12-12 05:49:21
我用getaddrinfo通过hostname获取server的ip地址。在3台其他的UNIX服务器上都可以获取各自的网络地址,但是在现在这台linux上就无法获取其网络地址,获取只有127.0.0.1的本地地址,socket绑定本地地址,其他的机器就不能访问该socket serve。请问如何才能获取网络地址(而不是127.0.0.1)?谢谢!



...全文
135 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhenjiangge 2009-12-12
  • 打赏
  • 举报
回复
我遇到这样的问题时,一般是通过写配置文件解决的,方便修改,测试
frankspy 2009-12-12
  • 打赏
  • 举报
回复
谢谢,但是这样仍然获得的是127.0.0.1, 我想获取的不是本地地址,而是外部地址。

[Quote=引用 4 楼 lklwlklw 的回复:]
char szHostName[256];

if(gethostname(szHostName, sizeof(szHostName)))
{
strHostName = _T("");
MessageBox(GetError(GetLastError()), _T("错误"), MB_ICONHAND|MB_OK);
return -1;
}

PHOSTENT hostinfo;
if((hostinfo = gethostbyname(szHostName)) == NULL)
return GetLastError();

LPCSTR ip = inet_ntoa (*(struct in_addr *)*hostinfo->h_addr_list);

strIPAddress = ip;
strHostName = szHostName;

return 0;
[/Quote]
sxsong_04 2009-12-12
  • 打赏
  • 举报
回复
把server的地址写到配置文件里,每次读文件获取server ip
lklwlklw 2009-12-12
  • 打赏
  • 举报
回复
char szHostName[256];

if(gethostname(szHostName, sizeof(szHostName)))
{
strHostName = _T("");
MessageBox(GetError(GetLastError()), _T("错误"), MB_ICONHAND|MB_OK);
return -1;
}

PHOSTENT hostinfo;
if((hostinfo = gethostbyname(szHostName)) == NULL)
return GetLastError();

LPCSTR ip = inet_ntoa (*(struct in_addr *)*hostinfo->h_addr_list);

strIPAddress = ip;
strHostName = szHostName;

return 0;
frankspy 2009-12-12
  • 打赏
  • 举报
回复
我是想用c来实现,谢谢!

[Quote=引用 2 楼 diablox0147 的回复:]
登陆这个网站,就能看到自己的IP了
http://www.whatismyip.com/
[/Quote]

diablox0147 2009-12-12
  • 打赏
  • 举报
回复
登陆这个网站,就能看到自己的IP了
http://www.whatismyip.com/
wanghao111 2009-12-12
  • 打赏
  • 举报
回复
友情up
do_fork 2009-12-12
  • 打赏
  • 举报
回复
#include <arpa/inet.h>
#include <sys/socket.h>
#include <netdb.h>
#include <ifaddrs.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main(int argc, char *argv[])
{
struct ifaddrs *ifaddr, *ifa;
int family, s;
char host[NI_MAXHOST];

if (getifaddrs(&ifaddr) == -1) {
perror("getifaddrs");
exit(EXIT_FAILURE);
}

for (ifa = ifaddr; ifa != NULL; ifa = ifa->ifa_next) {
family = ifa->ifa_addr->sa_family;
printf("%s address family: %d%s\n",
ifa->ifa_name, family,
(family == AF_PACKET) ? " (AF_PACKET)" :
(family == AF_INET) ? " (AF_INET)" :
(family == AF_INET6) ? " (AF_INET6)" : "");

if (family == AF_INET || family == AF_INET6) {
s = getnameinfo(ifa->ifa_addr,
(family == AF_INET) ? sizeof(struct sockaddr_in) :
sizeof(struct sockaddr_in6),
host, NI_MAXHOST, NULL, 0, NI_NUMERICHOST);
if (s != 0) {
printf("getnameinfo() failed: %s\n", gai_strerror(s));
exit(EXIT_FAILURE);
}
printf("\taddress: <%s>\n", host);
}
}
freeifaddrs(ifaddr);
exit(EXIT_SUCCESS);
}


执行结果:
lo  address family: 17 (AF_PACKET)
eth0 address family: 17 (AF_PACKET)
lo address family: 2 (AF_INET)
address: <127.0.0.1>
eth0 address family: 2 (AF_INET)
address: <10.0.2.15>
lo address family: 10 (AF_INET6)
address: <::1>
eth0 address family: 10 (AF_INET6)
address: <fe80::a00:27ff:fee4:2237%eth0>


源码不是我写的,是
man getifaddrs
自带例子

69,368

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧