【发布时间】:2015-12-11 11:05:09
【问题描述】:
所以总的来说,我对套接字和 C++ 还是很陌生。我正在尝试在一台计算机上设置一个套接字,该套接字获取该计算机的 IP 地址,以便我可以从另一台计算机连接到它。我正在设置 IP 地址和端口。但是,当涉及到绑定时,它总是失败。
所以我将IP地址设置为我的计算机的IP地址并设置了一个端口。
#define DEFAULT_PORT "8080"
#define DEFAULT_IP "165.120.216.66"
然后我调用 WSAStartup 似乎一切正常。然后我解析服务器地址和端口。
ZeroMemory(&hints, sizeof(hints));
hints.ai_family = AF_INET;
hints.ai_socktype = SOCK_STREAM;
hints.ai_protocol = IPPROTO_IP;
hints.ai_flags = AI_PASSIVE;
接着是 getaddrinfo 并创建套接字。一切顺利
status = getaddrinfo(DEFAULT_IP, DEFAULT_PORT, &hints, &data);
MySocket = socket(data->ai_family, data->ai_socktype, data->ai_protocol);
但是,当涉及到绑定时,它总是失败,我只是不知道为什么。
status = bind(MySocket, data->ai_addr, (int)data->ai_addrlen);
还有什么方法可以让我获得正在运行的机器的 IP 地址而不是对 IP 进行编码?
【问题讨论】:
-
bind的文档是否指定了某种方法来确定它失败的原因? -
在端口 8080 上监听的情况并不少见:您是否尝试过任何其他端口(选择一个随机的 5 位数字,和/或查看
netstat -a的输出并避免列出端口状态为LISTEN[ING]。(并且,正如大卫上面所说,bind()应该指出为什么它失败了(例如errno或WSAGetLastError())。 -
它给出错误 10049 - 无法分配请求的地址。它说地址可能无效?怎么会这样?我更改了端口号
-
如果您使用
127.0.0.1,它是否有效(如bind()成功)?如果是这样,那么它不喜欢您正在使用的特定地址。165...不是内部地址的正常范围:它真的是您机器的 IP 地址,还是您连接到 Internet 的公共 IP 地址(ping 表明它建议 BT) . -
啊,好吧,超级干杯。相信是错误的ip