【问题标题】:Cannot bind TCP socket to local IP无法将 TCP 套接字绑定到本地 IP
【发布时间】:2014-05-10 18:46:59
【问题描述】:

我的服务器程序可以很好地绑定到 0.0.0.0 (INADDR_ANY) 或 127.0.0.1 (INADDR_LOOPBACK),但是我希望程序在我的本地网络 IP (192.168.1.24) 上侦听并且我不断收到此错误:

打开监听端口 8888 时出错(原始 TCP 输出):无法分配请求的地址

以下是相关代码:

#define LOCAL_IP ((unsigned long int) 0x1801A8C8) //192.168.1.24
#define PORT 8888

struct sockaddr_in sa;

sa.sin_family = AF_INET;
sa.sin_port = htons(PORT);
sa.sin_addr.s_addr = LOCAL_IP; /* Bind servers to local net*/
//sa.sin_addr.s_addr = htonl(INADDR_ANY);

我也尝试过 htonl(LOCAL_IP) 和 inet_addr("192.168.1.24"),但没有成功。

【问题讨论】:

  • 什么操作系统?您是否有防火墙或类似的安全措施在运行?
  • INADDR_ANY 有什么问题?
  • 啊,它是 C0 而不是 C8!谢谢,我真的应该注意到这个错误。现在修好了!谢谢。

标签: c sockets bind listen


【解决方案1】:

你使用的IP是:200.168.1.24

用途:

sa.sin_addr.s_addr = inet_addr("192.168.1.24");

相反。
确保该端口尚未在使用中。 (使用 netstat 程序)在之前的测试中,您是否正确关闭了套接字?

【讨论】:

  • s_addr 接受网络长。所以向后的十六进制地址很好,错误是 C8 = 200,而我应该有 C0 = 192。感谢指出!
【解决方案2】:

您不能将任何字符串或整数分配给sa.sin_addr.s_addr

所以你需要把它转换成合适的格式。 你写的sa.sin_addr.s_addr = LOCAL_IP的语句将被替换为

sa.sin_addr.s_addr =192.168.1.24

导致问题的原因。

改用inet_addr(LOCAL_IP),它应该可以工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-05-26
    • 2023-02-12
    • 1970-01-01
    • 1970-01-01
    • 2011-10-01
    • 1970-01-01
    • 2012-06-15
    • 1970-01-01
    相关资源
    最近更新 更多