ut_sock_t ut_net_open_listener(const char* ip, int32_t port) { int32_t nerr = 0; ut_sock_t listener = ut_sock_tcp(); if(!ut_sock_isvalidate(listener)) return listener; UT_VERIFY_TRUE(ut_sock_reuseaddr(listener) == 0); nerr = ut_sock_bind(listener, ip, port); UT_CHECK_TRUE(nerr == 0); nerr = ut_sock_set_nonblock(listener); UT_CHECK_TRUE(nerr == 0); nerr = ut_sock_listen(listener, 128); UT_CHECK_TRUE(nerr == 0); return listener; FAIL: ut_net_close_listener(listener); return ut_sock_invalid(); }
void uninit_net_handle(struct net_t* net) { UT_CHECK_TRUE (net != 0); /*释放epoll*/ close(net->epoll_handle); net->epoll_handle = -1; /*释放epoll_event*/ NET_DELETE(net->wait_event); net->wait_event = 0; FAIL: return; }
void ut_channel_free(struct ut_channel_t* channel) { UT_CHECK_TRUE(channel != 0); struct ut_net_t* net = channel->net; UT_VERIFY_TRUE(net != 0); ut_channel_finalize(channel); ut_list_remove(&channel->queue_inuse); ut_list_push_tail(&net->queue_free, &channel->queue_inuse); FAIL: return; }
struct ut_channel_t* ut_net_deliver_socket(struct ut_net_t* net, ut_sock_t sock, recv_data rcvfunc, void* data) { struct ut_channel_t* channel = 0; UT_VERIFY_TRUE(net != 0); UT_VERIFY_TRUE(rcvfunc != 0); UT_CHECK_TRUE(0 == ut_sock_set_keepalive(sock)); UT_CHECK_TRUE(0 == ut_sock_set_nonblock(sock)); // 申请通道资源 channel = ut_channel_malloc(net); UT_CHECK_TRUE(channel != 0); UT_CHECK_TRUE(0 == ut_sock_getsock_info(sock, &channel->info.local_ip, &channel->info.local_port)); UT_CHECK_TRUE(0 == ut_sock_getpeer_info(sock, &channel->info.remote_ip, &channel->info.remote_port)); channel->sock = sock; channel->connection_data = rcvfunc; channel->user_data = data; UT_CHECK_TRUE(0 == do_deliver_socket(net, channel)); net->new_func(channel, net->user_data, channel->user_data); return channel; FAIL: ut_sock_close(sock); if (channel != 0) { channel->sock = ut_sock_invalid(); channel->connection_data = 0; channel->user_data = 0; ut_channel_free(channel); } return 0; }