mongoose源码分析系列之Control socket pair

本文深入探讨了mongoose中的Control socket pair,从结构体定义、变量赋值到发送端和接收端的详细操作,以及轮询处理和socket销毁的过程,揭示了mongoose内部通信的关键机制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 所在的结构体定义

struct mg_server {
  sock_t listening_sock;
  union socket_address lsa;   // Listening socket address
  struct ll active_connections;
  struct ll uri_handlers;
  char *config_options[NUM_OPTIONS];
  void *server_data;
  void *ssl_ctx;    // SSL context
  sock_t ctl[2];    // Control socketpair. Used to wake up from select() call
};

2. 变量赋值

mg_create_server函数:
  // Create control socket pair. Do it in a loop to protect from
  // interrupted syscalls in mg_socketpair().
  do {
    mg_socketpair(server->ctl);
  } while (server->ctl[0] == INVALID_SOCKET);

mg_socketpair函数具体实现
static int mg_socketpair(sock_t sp[2]) {
  struct sockaddr_in sa;
  sock_t sock, ret = -1;
  socklen_t len = sizeof(sa);

  sp[0] = sp[1] = INVALID_SOCKET;

  (void) memset(&sa, 0, sizeof(sa));
  sa.sin_family = AF_INET;
  sa.sin_port = htons(0);
  sa.sin_addr.s_addr = htonl(0x7f000001);

  if ((sock = socket(AF_INET, SOCK_STREAM, 0)) != INVALID_SOCKET &&
      !bind(sock, (struct sockaddr *) &sa, len) &&
      !listen(sock, 1) &&
      !getsockname(sock, (struct sockaddr *) &sa, &len) &&
      (sp[0] = socket(AF_INET, SOCK_STREAM, 6)) != -1 &&
      !connect(sp[0], (struct sockaddr *) &sa, len) &&
      (sp[1] = accept(sock,(struct sockaddr *) &sa, &len)) != INVALID_SOCKET) {
    set_close_on_exec(sp[0]);
    set_close_on_exec(sp[1]);
    ret = 0;
  } else {
    if (sp[0] != INVALID_SOCKET) closesocket(sp[0]);
    if (sp[1] != INVALID_SOCKET) closesocket(sp[1]);
    sp[0] = sp[1] = INVALID_SOCKET;
  }
  closesocket(sock);

  return ret;
}

3. 发送端sp[0]

mg_iterate_over_connections函数
    send(server->ctl[0], (void *) msg, sizeof(msg), 0);

4. 接收端sp[1]

execute_iteration函数
    recv(server->ctl[1], (void *) msg, sizeof(msg), 0);

5. 轮询处理

mg_poll_server函数
    add_to_set(server->ctl[1], &read_set, &max_fd);
    if (FD_ISSET(server->ctl[1], &read_set))

6. socket销毁

mg_destroy_server函数
    closesocket((*server)->ctl[0]);
    closesocket((*server)->ctl[1]);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值