【问题标题】:Cannot assign requested address for bind the socket无法为绑定套接字分配请求的地址
【发布时间】:2020-08-05 06:28:14
【问题描述】:

我检查了我的代码,但我不知道为什么程序无法绑定套接字。 我尝试了许多 ip 和端口(甚至是 127.0.0.1),但它仍然无法正常工作...... 这是我正在使用的代码:

//error message
void error (const char *msg)
{
    perror(msg);
    exit(1);
}

int main ()
{
    int sock, cli_sock, portno;
    char buffer[1024];
    char response[18432];

    struct sockaddr_in serv_addr, cli_addr;
    socklen_t cli_len;

    //creating socket
    sock = socket(AF_INET, SOCK_STREAM, 0);
    if(sock < 0)
        error("Error opening socket");

    bzero ((char *) &serv_addr, sizeof(serv_addr));

    //giving port number
    portno = 50005;

    //giving ip address
    serv_addr.sin_family = AF_INET;
    serv_addr.sin_addr.s_addr = inet_addr("127.0.0.1");
    serv_addr.sin_port = htons(portno);

    //bind socket
    if(bind(sock, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) != 0)
        error("Binding failed.");

    //listen
    listen(sock, 5);

    cli_len = sizeof(cli_addr);

    //accept
    cli_sock = accept(sock, (struct sockaddr *) &cli_addr, &cli_len);
    if(cli_sock != 0)
        error("Error on accepting");
}

(这只是服务器代码的套接字部分,仅供参考,我的客户端版本适用于 Windows,我的服务器版本适用于 Linux)

这是我运行程序时的输出:

Binding failed.: Cannot assign requested address

【问题讨论】:

  • 这个错误是关于地址,而不是端口。 127.0.0.1 不可能产生此错误,但您应该使用 INADDR_ANY,除非您有充分的理由不这样做。
  • cli_sock != 0 仅在cli_sock == -1 时表示错误。否则就是成功
  • 真实代码是否也漏掉了#includes?
  • @user207421 是的,我希望这个程序与另一个系统(在我的网络之外)进行通信,所以最后我需要使用一个非本地 IP。但问题是正如你所说,即使使用本地 ip 也会产生此错误!!!
  • @alk 我几乎可以肯定我没有错过任何头文件,因为它编译时没有错误。但运行时不起作用。

标签: c windows sockets tcp


【解决方案1】:

对于 TCP,客户端和服务器的设置是:

服务器:

  • socket(创建监听socket)
  • 绑定(监听 socker 到本地地址:端口)
  • 监听(让监听套接字真正监听)

(接受循环头)

  • accept(让监听套接字等待传入连接;连接成功时返回接受的套接字)
  • 读/写(从/到接受的套接字!)
  • 关闭(接受的套接字;可选)
  • 关闭(接受的套接字)

(循环页脚)

  • 关闭(监听套接字;可选)
  • 关闭(监听套接字)

客户:

  • 插座
  • 绑定(到本地地址:端口,可选且不常见)
  • 连接(到远程地址:端口,服务器绑定的那些)
  • 读/写
  • 关机(可选)
  • 关闭

【讨论】:

  • 首先非常感谢您抽出宝贵的时间,先生。客户也需要bind 吗?顺便说一句,我尝试了两个(bind 然后connect 和只是connect),我输入了一个 if 来检查问题,我收到bindconnect 的错误消息(在第一种情况下,我使用了@ 987654327@ 然后connect 我收到了来自bind 的错误,在其他情况下我没有使用bind,我收到了来自connect 的错误
  • 这是我的客户代码:int main() { int sock, portno; struct sockaddr_in serv_addr; //creating socket sock = socket(AF_INET, SOCK_STREAM, 0); memset((char *) &amp;serv_addr, 0, sizeof(serv_addr)); portno = 50005; serv_addr.sin_family = AF_INET; serv_addr.sin_addr.s_addr = inet_addr("127.0.0.1"); serv_addr.sin_port = htons(portno); bind(sock, (struct sockaddr *) &amp;serv_addr, sizeof(serv_addr)); connect(sock, (struct sockaddr *) &amp;serv_addr, sizeof(serv_addr)); }
  • 的诅咒代码有延续。我只是写套接字部分(在读写函数之前)。
猜你喜欢
  • 2021-07-05
  • 1970-01-01
  • 1970-01-01
  • 2021-12-20
  • 2012-12-25
  • 2019-12-26
  • 1970-01-01
  • 2020-08-24
相关资源
最近更新 更多