云计算百科
云计算领域专业知识百科平台

TCP并发服务器

端口号快速复用函数

通过getsockopt和setsockopt函数,管理套接字的端口号复用设置。具体操作如下:

getsockopt函数

int getsockopt(int sockfd, int level, int optname, void *optval, socklen_t *optlen);

功能:获取套接字的某些选项的属性。

参数:

  • sockfd: 套接字描述符。
  • level: 获取的层级(例如SOL_SOCKET)。
  • optname: 要获取的操作名称(如SO_REUSEADDR)。
  • optval: 获取的值(0表示禁用,非0表示启用)。
  • optlen: 参数4的大小。
  • 返回值: 成功返回0,失败返回-1。


    setsockopt函数

    int setsockopt(int sockfd, int level, int optname, const void *optval, socklen_t optlen);

    功能:设置套接字的某些选项的属性。

    参数:

  • sockfd: 套接字描述符。
  • level: 设置的层级(例如SOL_SOCKET)。
  • optname: 要设置的操作名称(如SO_REUSEADDR)。
  • optval: 设置的值(0表示禁用,非0表示启用)。
  • optlen: 参数4的大小。
  • 返回值: 成功返回0,失败返回-1。


    示例代码:端口号快速复用

    // 获取当前端口号是否能快速复用
    int n;
    int len = sizeof(n);
    getsockopt(oldfd, SOL_SOCKET, SO_REUSEADDR, &n, &len);
    if (n == 0) {
    printf(\”端口号快速复用未启动\\n\”);
    } else {
    printf(\”端口号快速复用已经启动\\n\”);
    }

    // 设置当前套接字端口号快速复用
    n = 999;
    setsockopt(oldfd, SOL_SOCKET, SO_REUSEADDR, &n, sizeof(n));



    1. 循环服务器模型

    描述

    循环服务器模型是一次只处理一个客户端请求的传统方式,处理完一个客户端请求后,才会继续处理下一个客户端请求。由于其效率较低,每次只能执行单个任务,因此在高并发场景下表现不佳。

    在循环服务器模型中,服务器端采用了一个循环来不断接收客户端请求。每当一个客户端连接成功后,服务器创建一个新的套接字用于通信,并处理客户端的请求。每处理完一个客户端请求后,服务器继续等待下一个客户端的连接。

    主要步骤:

  • 创建套接字:使用 socket() 函数创建套接字。
  • 绑定:将套接字与服务器的 IP 地址和端口号绑定。
  • 监听:开始监听客户端连接请求。
  • 循环接收客户端请求:
    • 每次 accept() 成功后,创建一个新的套接字用于通信。
    • 循环收发信息,直到客户端断开连接。
  • 关闭连接:每次客户端断开连接后,关闭相应的套接字。
  • 关闭监听套接字

  • 循环服务器代码实现

    代码示例

    #include <myhead.h>
    #define IP \”192.168.60.45\”
    #define PORT 6666
    #define BACKLOG 20

    int main(int argc, const char *argv[]) {
    // 1. 创建套接字
    int oldfd = socket(AF_INET, SOCK_STREAM, 0); // IPV4, TCP协议
    if (oldfd == -1) {
    perror(\”socket\”);
    return -1;
    }

    // 2. 获取端口号属性,查看是否启用端口号快速复用
    int n;
    int len = sizeof(n);
    if (getsockopt(oldfd, SOL_SOCKET, SO_REUSEADDR, &n, &len) == -1) {
    perror(\”getsockopt\”);
    return -1;
    }
    if (n) {
    printf(\”端口号快速复用已经启动\\n\”);
    } else {
    printf(\”端口号快速复用未启动\\n\”);
    }

    // 设置端口号快速复用
    n = 999;
    if (setsockopt(oldfd, SOL_SOCKET, SO_REUSEADDR, &n, sizeof(n)) == -1) {
    perror(\”setsockopt\”);
    return -1;
    }
    printf(\”端口号快速复用成功\\n\”);

    // 3. 绑定IP和端口号
    struct sockaddr_in server = {
    .sin_family = AF_INET, // IPV4
    .sin_port = htons(PORT), // 端口号转换为网络字节序
    .sin_addr.s_addr = inet_addr(IP), // IP地址
    };
    if (bind(oldfd, (struct sockaddr *)&server, sizeof(server)) == -1) {
    perror(\”

    赞(0)
    未经允许不得转载:网硕互联帮助中心 » TCP并发服务器
    分享到: 更多 (0)

    评论 抢沙发

    评论前必须登录!