请参阅以下代码:
accept(sockfd, (struct sockaddr*)&cliaddr, &slen);
cout << inet_ntop(AF_INET, cliaddr.sin_addr, ipv4addr, 100);
我的客户端从localhost连接。 我在输出中得到一个荒谬的地址。这不是我的IP地址。每次我运行代码我得到一个不同的IP地址。当我ping那个IP地址时我没有得到任何回复。
是什么原因。
我正在Windows Vista中的虚拟机上运行suse linux。
更新:
bzero(&cliaddr, sizeof(cliaddr));
int connfd = accept(sockfd, (struct sockaddr*)&cliaddr, &slen);
if (sem_wait(&mutex) < 0)
err_sys("sem_init error");
char ipv4addr[100];
cout << inet_ntop(AF_INET, &cliaddr.sin_addr, ipv4addr, 100) << endl;
//const char* p = inet_ntop(AF_INET, &cliaddr.sin_addr, ipv4addr, 100);
//cout << p << endl;
//cout << (void*)p << " " << (void*)ipv4addr << endl;
这会将地址返回为0.0.0.0
如果我取消注释这些行,我会在所有行中获得正确的地址,127.0.0.1
答案 0 :(得分:4)
您在inet_ntop()
的通话中缺少第4个参数。这是一个有效的例子:
int sockfd, fd;
struct sockaddr_in saddr;
socklen_t len = sizeof( saddr );
char addr_buf[INET_ADDRSTRLEN]; /* defined in <netinet/in.h> */
/* ... socket(), bind(), listen() */
bzero( &saddr, len );
if (( fd = accept( sockfd, ( struct sockaddr* )&saddr, &len )) == -1 )
{ perror( "accept" ); exit( 1 ); } /* watch out for EINTR */
if ( inet_ntop( AF_INET, &saddr.sin_addr, addr_buf,
INET_ADDRSTRLEN ) == NULL )
{ perror( "inet_ntop" ); exit( 1 ); }
printf( "accepted connection from [%s:%d]\n",
addr_buf, ntohs( saddr.sin_port ));
...
与网络通话时始终检查错误。
答案 1 :(得分:0)
我的未经证实的猜测是,您的IP地址已退回而不是v4,因此您的转换已关闭。
您可能想尝试使用netstat找出客户端的端口(通常在1025和65535之间获得一个随机的端口号)并查看其十六进制值是否出现在cliaddr的十六进制表示中。如果客户端端口与您认为是客户端地址之间存在关联,则转换不正确。
答案 2 :(得分:0)
我的下一个猜测:
On success, inet_ntop() returns a non-null pointer to dst. NULL is
returned if there was an error, with errno set to indicate the error.
是cout。&lt;&lt;聪明到取消引用正在返回的指针,还是打印出指针?