这些都是内的函数

服务器端流程

  1. 创建socket:选择UDP或TCP协议,返回一个整型句柄

    1
    2
    3
    int sockfd = socket(AF_INET, SOCK_STREAM, 0); // TCP
    // 或
    int sockfd = socket(AF_INET, SOCK_DGRAM, 0); // UDP
  2. 绑定socket:将socket绑定到特定IP地址和端口

    1
    2
    3
    4
    5
    6
    7
    struct sockaddr_in server_addr;
    memset(&server_addr, 0, sizeof(server_addr));
    server_addr.sin_family = AF_INET;
    server_addr.sin_addr.s_addr = htonl(INADDR_ANY); // 任意IP
    server_addr.sin_port = htons(PORT);

    bind(sockfd, (struct sockaddr*)&server_addr, sizeof(server_addr));
  3. 监听socket:监听绑定的端口(仅TCP需要)

    1
    listen(sockfd, BACKLOG); // BACKLOG为等待连接队列的最大长度
  4. 接受连接:接受客户端连接请求(仅TCP需要)

    1
    2
    3
    struct sockaddr_in client_addr;
    socklen_t client_len = sizeof(client_addr);
    int client_sockfd = accept(sockfd, (struct sockaddr*)&client_addr, &client_len);
  5. 发送数据

    1
    2
    3
    4
    5
    6
    // TCP
    send(client_sockfd, buffer, strlen(buffer), 0);

    // UDP
    sendto(sockfd, buffer, strlen(buffer), 0,
    (struct sockaddr*)&client_addr, sizeof(client_addr));
  6. 接收数据

    1
    2
    3
    4
    5
    6
    // TCP
    recv(client_sockfd, buffer, BUFFER_SIZE, 0);

    // UDP
    recvfrom(sockfd, buffer, BUFFER_SIZE, 0,
    (struct sockaddr*)&client_addr, &client_len);
  7. 关闭连接

    1
    2
    close(client_sockfd); // 关闭客户端连接
    close(sockfd); // 关闭服务器socket

客户端流程

  1. 创建socket:与服务器端相同

    1
    int sockfd = socket(AF_INET, SOCK_STREAM, 0); // TCP
  2. 发起连接:连接到服务器(仅TCP需要)

    1
    2
    3
    4
    5
    6
    7
    struct sockaddr_in server_addr;
    memset(&server_addr, 0, sizeof(server_addr));
    server_addr.sin_family = AF_INET;
    server_addr.sin_addr.s_addr = inet_addr("127.0.0.1"); // 服务器IP
    server_addr.sin_port = htons(PORT);

    connect(sockfd, (struct sockaddr*)&server_addr, sizeof(server_addr));
  3. 发送/接收数据:与服务器端相同

  4. 关闭连接

    1
    close(sockfd);

    ```