c - Linux网络编程中bind()得到 "Invalid argument"错误

标签 c linux sockets

这是我的代码

#include "basic.h"
#include "bp_socket.h"

int setup_tcp(char *port)
{
    struct sockaddr_in server_addr;
    in_port_t server_port;
    int sock;
    int retval;                     //return value

    if ((server_port = atoi(port)) < 0)
    {
        server_port = (in_port_t)DEFAULT_PORT;
        fprintf(stderr, "Error port: %d in line %d\n", (int)server_port, __LINE__);
        //fprintf(stderr, "Use default port: %d\n", DEFAULT_PORT);
    }

    sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    if (sock < 0)
    {
        return sock;
    }

    retval = listen(sock, 40);
    if (retval < 0)
    {
        return retval;
    }

    memset(&server_addr, 0, sizeof(struct sockaddr_in));
    server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
    server_addr.sin_port        = htons(server_port);
    server_addr.sin_family      = AF_INET;
    retval = bind(sock, (struct sockaddr*)&server_addr, sizeof(server_addr));
    if (retval < 0)
    {
        perror("bind");
        return retval;
    }

    return sock;
}

int main()
{
    printf("%d\n", setup_tcp("4558"));
    perror("");
    return 0;
}

我调试我的代码,然后我发现bind()返回-1

我用谷歌搜索并阅读了手册页,但我找不到答案。

函数setup_tcp是创建socket,并绑定(bind)地址。

然后返回套接字errno值

如何解决。我已经多次阅读我的代码。

谢谢!

最佳答案

您应该将listen移到bind之后。

如果套接字已绑定(bind),bind 将返回错误,而未绑定(bind)套接字上的 listen 会自动将其绑定(bind)到随机端口号。

关于c - Linux网络编程中bind()得到 "Invalid argument"错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13585010/

相关文章:

c++ - 使用自动生成的 C 代码的大型 C++ dll 的性能损失

C: glib.h `pkg-config --cflags --libs glib-2.0` valgrind 仍然可达

linux - 如何以编程方式在启动后添加别名

linux - 检查程序是否存在

c++ - 蓝牙:使用 Bluez 检测事件

c - 将字符串解析为 argv/argc

编译 sse 内部指令

java - 服务器(ANSI C)和客户端(JAVA)之间使用套接字进行通信

c++ - 套接字可用数据读取

multithreading - 我们是否需要一个以上的老板组线程?