socket 的 bind 具体作用是什么?

今天我在B站学习中科大的计算机网络这门课程, 对tcp的socket的bind感到困惑

比如这一段代码

    // socket 函数返回的描述符
    int serverSocket;

    struct sockaddr_in server_addr;

    if ((serverSocket = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
        perror("socket");
        // 连接失败
        return 1;
    }

    if (bind(serverSocket, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0) {
        perror("connect error");
        return 1;
    }

我不太能理解这里的bind有什么用, 在创建socket的时候不是已经返回socket的句柄了吗, 那么直接用就好了啊, 为什么还要bind一下? 如果不bind会怎么样? 还有操作系统内核维护的socket是在bind时期创建的还是在构造socket的时候创建的?

或者我想在这里说一下自己的想法: (以下是我的想法)

socket(AF_INET, SOCK_STREAM, 0)这里, 程序已经向操作系统申请了一个socket, 但是现在这个socket什么都没有, 没有源地址和端口也没有目标地址和端口, 在调用bind了后会绑定源地址和端口比如127.0.0.1:8080, 也就是bind是用来绑定本机的ip和端口号的要不然socket就不知道从哪accpet客户端的连接

请问诸位, bind的含义到底是什么?

阅读 3.5k
3 个回答

原文:'在调用bind了后会绑定源地址和端口比如127.0.0.1:8080, 也就是bind是用来绑定本机的ip和端口号的要不然socket就不知道从哪accpet客户端的连接' 这款就是意义呀,socket 句柄只是用来操作输入输出的字节数据的,至于从哪里输入往哪里输出你得告诉她吧,这就是 bind 做的事情

系统实现网络通信的基本方式通常是使用 Socket 编程模型,所以,不管你是使用Java语言,还是C/C++,Go,PHP,只要你跟网络打交道,那就离不开Socket。

申明:本文讲解的 是基于linux内核,基于TCP/IP 协议的 Intenet socket

https://zhuanlan.zhihu.com/p/...

我在通过乎的这篇文章似乎想通了:)

客户端不需要bind, 连接服务器的时候, 会自动绑定一个本地的随机端口.

服端必须绑定, 要不然怎么提供服务呢?

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
宣传栏