【发布时间】:2009-11-07 18:00:23
【问题描述】:
见以下代码:
accept(sockfd, (struct sockaddr*)&cliaddr, &slen);
cout << inet_ntop(AF_INET, cliaddr.sin_addr, ipv4addr, 100);
我的客户端从本地主机连接。 我在输出中得到一个荒谬的地址。这不是我的 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
【问题讨论】:
-
我在您的代码中看到一个信号量 - 确保其他线程不会同时使用相同的地址结构。 IE。这可能是一个竞争条件。
-
该代码没有将“slen”参数初始化为接受调用。确保将 slen 设置为 sizeof(cliaddr)。
-
@Nikolai: 只有一个线程在运行
-
@nos 回答了我的问题。我将 slen 初始化为 sizeof(cliaddr) 并且代码有效。但是如果我们不初始化 slen,那么我们如何解释这个行为。
标签: networking network-programming ip-address