【问题标题】:Bind failing when trying to set IP address for socket c++尝试为套接字 C++ 设置 IP 地址时绑定失败
【发布时间】: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() 应该指出为什么它失败了(例如errnoWSAGetLastError())。
  • 它给出错误 10049 - 无法分配请求的地址。它说地址可能无效?怎么会这样?我更改了端口号
  • 如果您使用127.0.0.1,它是否有效(如bind() 成功)?如果是这样,那么它不喜欢您正在使用的特定地址。 165... 不是内部地址的正常范围:它真的是您机器的 IP 地址,还是您连接到 Internet 的公共 IP 地址(ping 表明它建议 BT) .
  • 啊,好吧,超级干杯。相信是错误的ip

标签: c++ sockets


【解决方案1】:

如果我理解正确,这将是服务器端。所以你希望能够从另一台机器connect 到这个套接字? 然后你不需要bind 到一个特定的地址,然后应该开始listen。例如:

status = getaddrinfo(NULL, DEFAULT_PORT, &hints, &data); // get data for the local address 
MySocket = socket(data->ai_family, data->ai_socktype, data->ai_protocol);
bind(sockfd, res->ai_addr, res->ai_addrlen);
listen(sockfd, 10)

【讨论】:

  • 它总是默认为本地主机,然后我无法从我的客户端连接到它?
  • 其实默认是通配符。监听特定 IP 地址意味着只有连接到该 IP 的客户端才能连接。提供 getaddrinfoNULL 返回具有此通配符集的主机数据,以便您的服务器可以通过所有可用的 IP 地址/接口访问。
  • 你怎么知道它设置到哪个IP地址?
  • 我告诉过你,它没有设置为特定地址。如果您必须获取本地 IP 地址,请查看:stackoverflow.com/a/1317284/793929 但不建议这样做,并且如上面的链接所述,这很棘手。此外,当您尝试通过 Internet 进行通信时,您需要一个可从本地网络外部访问的 IP 地址。这通常与您可以在本地确定的地址不同(由于NAT)。
【解决方案2】:

只需将地址设置为 INADDR_ANY:“0.0.0.0”。

【讨论】:

    猜你喜欢
    • 2016-10-09
    • 2021-10-02
    • 2012-06-15
    • 2016-03-08
    • 2023-02-12
    • 1970-01-01
    • 2019-06-25
    • 2018-09-22
    • 2012-11-03
    相关资源
    最近更新 更多