// return type static int ctrl_cmd(struct socket_server *ss, struct socket_message *result) { int fd = ss->recvctrl_fd; // the length of message is one byte, so 256+8 buffer size is enough. uint8_t buffer[256]; uint8_t header[2]; block_readpipe(fd, header, sizeof(header)); int type = header[0]; int len = header[1]; block_readpipe(fd, buffer, len); // ctrl command only exist in local fd, so don't worry about endian. switch (type) { case 'S': return start_socket(ss,(struct request_start *)buffer, result); case 'B': return bind_socket(ss,(struct request_bind *)buffer, result); case 'L': return listen_socket(ss,(struct request_listen *)buffer, result); case 'K': return close_socket(ss,(struct request_close *)buffer, result); case 'O': return open_socket(ss, (struct request_open *)buffer, result); case 'X': result->opaque = 0; result->id = 0; result->ud = 0; result->data = NULL; return SOCKET_EXIT; case 'D': return send_socket(ss, (struct request_send *)buffer, result, PRIORITY_HIGH, NULL); case 'P': return send_socket(ss, (struct request_send *)buffer, result, PRIORITY_LOW, NULL); case 'A': { struct request_send_udp * rsu = (struct request_send_udp *)buffer; return send_socket(ss, &rsu->send, result, PRIORITY_HIGH, rsu->address); } case 'C': return set_udp_address(ss, (struct request_setudp *)buffer, result); case 'T': setopt_socket(ss, (struct request_setopt *)buffer); return -1; case 'U': add_udp_socket(ss, (struct request_udp *)buffer); return -1; default: fprintf(stderr, "socket-server: Unknown ctrl %c.\n",type); return -1; }; return -1; }
int socket_server::ctrl_cmd(struct socket_message * result) { int fd = recvctrl_fd; uint8_t buffer[256]; uint8_t header[2]; block_readpipe(fd, (void *)header, sizeof(header)); int type = header[0]; int len = header[1]; block_readpipe(fd, buffer, len); switch (type) { case 'S': return start_socket((struct request_start *)buffer, result); case 'B': return bind_socket((struct request_bind *)buffer, result); case 'L': return listen_socket((struct request_listen *)buffer, result); case 'K': return close_socket((struct request_close *)buffer, result); case 'O': return open_socket((struct request_open *)buffer, result);; case 'X': result->opaque = 0; result->ud = 0; result->id = 0; result->data = nullptr; return SOCKET_EXIT; case 'D': printf("*****************send data*******************\n"); return send_socket((struct request_send *)buffer, result, PRIORITY_HIGH); case 'P': break; case 'A': break; case 'C': break; case 'T': setopt_socket((struct request_setopt *)buffer); return -1; case 'U': break; default: fprintf(stderr, "socket-server: unknown ctrl %c.\n", type); break; } return -1; }
// return type // 执行管道指令,写入socket_message static int ctrl_cmd(struct socket_server *ss, struct socket_message *result) { int fd = ss->recvctrl_fd; // the length of message is one byte, so 256+8 buffer size is enough. // 读管道数据,相反的数据写入管道逻辑见send_request方法 // len长度1个字节,所以缓冲区的长度为256足够 uint8_t buffer[256]; uint8_t header[2]; // 先读2字节的头 block_readpipe(fd, header, sizeof(header)); int type = header[0]; int len = header[1]; // 再读剩余数据部分 block_readpipe(fd, buffer, len); // ctrl command only exist in local fd, so don't worry about endian. switch (type) { case 'S': // PACCEPT -> CONNECTED // PLISTEN -> LISTEN // 把套接字加入事件循环 return start_socket(ss,(struct request_start *)buffer, result); case 'B': // 绑定套接字 return bind_socket(ss,(struct request_bind *)buffer, result); case 'L': // 监听套接字 return listen_socket(ss,(struct request_listen *)buffer, result); case 'K': // 关闭套接字 return close_socket(ss,(struct request_close *)buffer, result); case 'O': // 打开套接字 return open_socket(ss, (struct request_open *)buffer, result); case 'X': // 退出套接字 result->opaque = 0; result->id = 0; result->ud = 0; result->data = NULL; return SOCKET_EXIT; case 'D': // 发送高优先级数据 return send_socket(ss, (struct request_send *)buffer, result, PRIORITY_HIGH, NULL); case 'P': // 发送低优先级数据 return send_socket(ss, (struct request_send *)buffer, result, PRIORITY_LOW, NULL); case 'A': { struct request_send_udp * rsu = (struct request_send_udp *)buffer; return send_socket(ss, &rsu->send, result, PRIORITY_HIGH, rsu->address); } case 'C': return set_udp_address(ss, (struct request_setudp *)buffer, result); case 'T': // 设置套接字 setopt_socket(ss, (struct request_setopt *)buffer); return -1; case 'U': add_udp_socket(ss, (struct request_udp *)buffer); return -1; default: fprintf(stderr, "socket-server: Unknown ctrl %c.\n",type); return -1; }; return -1; }