Linux网络编程入门 互动版

在线工具推荐: Three.js AI纹理开发包 - YOLO合成数据生成器 - GLTF/GLB在线编辑 - 3D模型格式在线转换 - 可编程3D场景编辑器

上一节创建socket时,仅指定了协议类型以及服务类型,但是没有指定具体的socket地址。 bind函数含义如词义,给上述创建的套接字socket绑定一个socket地址。

比喻如下:我们创建了socket(安装电话机)以后,需要进行socket命名(应该去中国联通申请一个电话号码,并将该号码和电话机进行绑定)。

bind函数的Linux头文件以及函数定义如下:

#include<sys/socket.h>
int bind(int sockfd, const stuct sockaddr *my_addr, socklen_t addrlen);

bind函数参数以及返回值如下:

/**
  * socket命名
  *
  * @param sockfd socket文件描述符,上节socket函数返回的值
  * @param my_addr socket地址
  * @param addrlen socket地址的长度
  * @return 函数执行成功返回0,失败返回-1
*/
 int bind(int sockfd, const stuct sockaddr *my_addr, socklen_t addrlen);

结合之前socket地址初始化方法,写个程序,完成命名socket。

#include <stdio.h>
#include <stdlib.h>      // exit
#include <string.h>
#include <arpa/inet.h>   // sockaddr_in
#include <sys/socket.h>

int main(int argc, char *argv[])
{
    const char *server_ip = "127.0.0.1"; // IP地址字符串
    int server_port = 0x1234;
    int server_socket;

    server_socket = socket(PF_INET, SOCK_STREAM, 0);
    if (server_socket == -1) {
        perror("socket create error");
        exit(1);
    }
    printf("socket is %d\n", server_socket);

    struct sockaddr_in address;
    memset(&address, 0, sizeof(address));
    address.sin_family = AF_INET;
    address.sin_port = htons(server_port);
    address.sin_addr.s_addr = inet_addr(server_ip); 

    if (bind(server_socket, (struct sockaddr*)&address, sizeof(address)) == -1) {
        perror("bind error");
        exit(1);
    }
    printf("bind ok\n");

    return 0;
}

第13行创建一个socket。

第20~24行初始化一个socket地址,和之前相同。

第26行利用bind函数完成命名socket。

右侧打开bind_test.c文件,试添加bind函数,并编译测试。