Пример #1
0
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;
}
Пример #2
0
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;
		}
	}
}
Пример #3
0
/* 套接字模块的主函数, 不断处理各种套接字命令和套接字 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;
}
Пример #4
0
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;
}