此问题与another question I just posted相关。我正在准备一个简单的工作项目,并试图熟悉Unix开发环境中套接字编程的基础知识。现在,我已经完成了一些基本的服务器端代码和客户端代码设置,以便进行通信。目前,我的客户端代码成功地连接到服务器代码,服务器代码向它发送一条测试消息,然后两者都退出。太棒了!这正是我想要实现的。现在,我将尝试使用用于获取两个环境(服务器和客户端)信息的函数。我想获取我的服务器程序的IP地址。这是我目前需要做的代码,但它不能工作...
int sockfd;
unsigned int len;
socklen_t sin_size;
char msg[]="test message";
char buf[MAXLEN];
int st, rv;
struct addrinfo hints, *serverinfo, *p;
struct sockaddr_storage client;
char s[INET6_ADDRSTRLEN];
char ip[INET6_ADDRSTRLEN];
//zero struct
memset(&hints,0,sizeof(hints));
hints.ai_family = AF_UNSPEC;
hints.ai_socktype = SOCK_STREAM;
hints.ai_flags = AI_PASSIVE;
//get the server info
if((rv = getaddrinfo(NULL, SERVERPORT, &hints, &serverinfo ) != 0)){
perror("getaddrinfo");
exit(-1);
}
// loop through all the results and bind to the first we can
for( p = serverinfo; p != NULL; p = p->ai_next)
{
//Setup the socket
if( (sockfd = socket( p->ai_family, p->ai_socktype, p->ai_protocol )) == -1 )
{
perror("socket");
continue;
}
//Associate a socket id with an address to which other processes can connect
if(bind(sockfd, p->ai_addr, p->ai_addrlen) == -1){
close(sockfd);
perror("bind");
continue;
}
break;
}
if( p == NULL ){
perror("Fail to bind");
}
inet_ntop(p->ai_family, get_in_addr((struct sockaddr *)p->ai_addr), s, sizeof(s));
printf("Server has TCP Port %s and IP Address %s\n", SERVERPORT, s);而IP的输出始终为空...
server has TCP Port 22513 and IP Address ::你知道我错过了什么吗?
提前感谢您的帮助!这个东西一开始真的很复杂。
发布于 2010-03-23 07:39:04
您的套接字可能正在侦听所有可用的接口/地址。"::“是IPv6地址”0:0:0:0:0:0:0:0:0“的缩写,表示地址未指定。
这可能是因为您从getaddrinfo()请求一个addrinfo来监听任何地址,而任何支持流和具有未指定地址的IPv6的协议恰好是最先出现的。不过我对此有点不确定...
https://stackoverflow.com/questions/2496454
复制相似问题