mongoose源码分析系列之Control socket pair
来源:互联网 发布:三个矩阵分配律 编辑:程序博客网 时间:2024/05/23 12:34
目录(?)[-]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
};
- 所在的结构体定义
- 变量赋值
- 发送端sp0
- 接收端sp1
- 轮询处理
- socket销毁
1. 所在的结构体定义
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);
// 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;
}
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]);
closesocket((*server)->ctl[1]);
0 0
- mongoose源码分析系列之Control socket pair
- mongoose源码分析系列之Control socket pair
- mongoose源码分析系列之server_data
- mongoose源码分析系列之listening_sock
- mongoose源码分析系列之active_connections
- mongoose源码分析系列之server_data
- mongoose源码分析系列之listening_sock
- mongoose源码分析系列之active_connections
- mongoose源码分析系列一
- mongoose源码分析系列一
- STL之pair源码分析
- Mongoose源码分析
- Mongoose源码分析
- Mongoose源码分析
- mongoose 源码分析 ppt
- Mongoose源码分析:mongoose的工作模型
- Mongoose源码之master_thread
- Mongoose源码分析:外篇之web服务器
- C语言学习笔记15
- mongoose源码分析系列一
- 版本适配中遇到的几个问题
- BPF自己写过滤包程序
- 五大浏览器兼容性
- mongoose源码分析系列之Control socket pair
- C++基础
- mongoose源码分析系列之server_data
- mongoose源码分析系列之listening_sock
- Python 元组、列表、字典、文件的用法
- C++和Java中的多态
- C++面向对象
- mongoose源码分析系列之active_connections
- 显示文档类型的属性内容