int server_socket_poll() { struct socket_server *ss = SOCKET_SERVER; assert(ss); struct socket_message result; int more = 1; int type = socket_server_poll(ss, &result, &more); switch (type) { case SOCKET_EXIT: return 0; case SOCKET_DATA: forward_message(SERVER_SOCKET_TYPE_DATA, false, &result); break; case SOCKET_CLOSE: forward_message(SERVER_SOCKET_TYPE_CLOSE, false, &result); break; case SOCKET_OPEN: forward_message(SERVER_SOCKET_TYPE_CONNECT, true, &result); break; case SOCKET_ERROR: forward_message(SERVER_SOCKET_TYPE_ERROR, false, &result); break; case SOCKET_ACCEPT: forward_message(SERVER_SOCKET_TYPE_ACCEPT, true, &result); break; default: server_error(NULL, "Unknown socket message type %d.",type); return -1; } if (more) { return -1; } return 1; }
static void * _poll(void * ud) { struct socket_server *ss = ud; struct socket_message result; for (;;) { int type = socket_server_poll(ss, &result, NULL); // DO NOT use any ctrl command (socket_server_close , etc. ) in this thread. switch (type) { case SOCKET_EXIT: return NULL; case SOCKET_DATA: printf("message(%" PRIxPTR ") [id=%d] size=%d\n",result.opaque,result.id, result.ud); free(result.data); break; case SOCKET_CLOSE: printf("close(%" PRIxPTR ") [id=%d]\n",result.opaque,result.id); break; case SOCKET_OPEN: printf("open(%" PRIxPTR ") [id=%d] %s\n",result.opaque,result.id,result.data); break; case SOCKET_ERROR: printf("error(%" PRIxPTR ") [id=%d]\n",result.opaque,result.id); break; case SOCKET_ACCEPT: printf("accept(%" PRIxPTR ") [id=%d %s] from [%d]\n",result.opaque, result.ud, result.data, result.id); break; } } }
/* 套接字模块的主函数, 不断处理各种套接字命令和套接字 I/O 事件, 将处理的结果发送给对应的服务. * 函数返回 0 表示需要退出套接字模块线程, 返回 -1 表示套接字模块处于忙碌状态, 返回 1 表示空闲的状态. * 检测是否忙碌是通过查看是否还有未执行完的套接字命令或者套接字 I/O 事件. * * 函数无参数 * 返回: 0 表示需要退出套接字模块线程; 1 表示空闲的状态; -1 表示套接字模块处于忙碌状态, 不应该打断; */ int skynet_socket_poll() { struct socket_server *ss = SOCKET_SERVER; assert(ss); struct socket_message result; int more = 1; int type = socket_server_poll(ss, &result, &more); switch (type) { case SOCKET_EXIT: return 0; case SOCKET_DATA: forward_message(SKYNET_SOCKET_TYPE_DATA, false, &result); break; /* SOCKET_CLOSE 的 result 中的 data 等于 NULL */ case SOCKET_CLOSE: forward_message(SKYNET_SOCKET_TYPE_CLOSE, false, &result); break; case SOCKET_OPEN: forward_message(SKYNET_SOCKET_TYPE_CONNECT, true, &result); break; case SOCKET_ERROR: forward_message(SKYNET_SOCKET_TYPE_ERROR, true, &result); break; /* SOCKET_ACCEPT 中得到的新的连接还没有 I/O 事件通知, 需要调用 skynet_socket_start 来开启 */ case SOCKET_ACCEPT: forward_message(SKYNET_SOCKET_TYPE_ACCEPT, true, &result); break; case SOCKET_UDP: forward_message(SKYNET_SOCKET_TYPE_UDP, false, &result); break; default: skynet_error(NULL, "Unknown socket message type %d.",type); return -1; } if (more) { return -1; } return 1; }
int main(int argc, char *argv[]) { if (argc != 4) { printf("Copyright (c) 2014, Dali Wang<*****@*****.**>.\n"); printf("Used: sms ip port serial\n"); printf("./sms 127.0.0.1 8888 /dev/ttyS0"); return 0; } sigign(); // 信号处理 // 注册返回函数 settings.on_message_begin = begin_cb; settings.on_url = url_cb; settings.on_header_field = field_cb; settings.on_header_value = value_cb; settings.on_headers_complete = herders_cb; settings.on_body = body_cb; settings.on_message_complete = end_cb; settings.on_status = status_cb; cssl_start(); // 开启CSSL库 //"/dev/ttyS1" serial = cssl_open(argv[3], callback, 0, 9600, 8, 0, 1); // 打开串口 // 打开失败 if (!serial) { printf("Open COM Fail = %s\n", cssl_geterrormsg()); // 获得错误信息 return -1; } ss = socket_server_create(); // 创建 socket_server int listen_id = socket_server_listen(ss, 100, argv[1], atoi(argv[2]), 32); // 监听 socket socket_server_start(ss, 200, listen_id); // 纳入事件管理 struct socket_message result; // 声明一个soket消息的结构 for (;;) { int type = socket_server_poll(ss, &result, NULL); // 事件循环 switch (type) { case SOCKET_EXIT: printf("exit(%lu) [id=%d]\n", result.opaque, result.id); goto EXIT_LOOP; case SOCKET_DATA: //printf("data(%lu) [id=%d] %s\n", result.opaque, result.id, result.data); OnReceive(result); // 收到数据,调用函数处理 break; case SOCKET_CLOSE: printf("close(%lu) [id=%d]\n", result.opaque, result.id); free((void*)result.opaque); break; case SOCKET_OPEN: printf("open(%lu) [id=%d] %s\n", result.opaque, result.id, result.data); break; case SOCKET_ERROR: printf("error(%lu) [id=%d]\n", result.opaque, result.id); break; case SOCKET_ACCEPT: { printf("accept(%lu) [id=%d %s] from [%d]\n", result.opaque, result.ud, result.data, result.id); // 初始化 HTTP 结构 struct http_parser *parser; parser = (http_parser *) malloc(sizeof(http_parser)); http_parser_init(parser, HTTP_REQUEST); socket_server_start(ss, (uintptr_t)parser, result.ud); // 纳入事件管理 id = result.ud; // 临时解决办法,应该使用 parser->data来传输 。 } break; } // switch } // for EXIT_LOOP: socket_server_release(ss); // 关闭 socket_server return 0; }