Просмотр исходного кода

add: network,tcpserver多客户端模式,能跑通,但仍需重构的版本

Wendal Chen 3 месяцев назад
Родитель
Сommit
c1b1fd07e8

+ 14 - 1
components/network/adapter/luat_lib_socket.c

@@ -931,17 +931,30 @@ static int l_socket_wait(lua_State *L)
 
 /*
 作为服务端开始监听
-@api socket.listen(ctrl)
+@api socket.listen(ctrl, multi_client)
 @user_data socket.create得到的ctrl
+@boolean multi_client 是否支持1对多客户端连接,true支持,false不支持,默认false不支持
 @return boolean true没有异常发生,false失败了,如果false则不需要看下一个返回值了,如果false,后续要close
 @return boolean true已经connect,false没有connect,之后需要接收socket.ON_LINE消息
 @usage 
 local succ, result = socket.listen(ctrl)
+-- 注意, 当目标适配器不支持1对多时,multi_client参数无效,并返回错误
 */
 static int l_socket_listen(lua_State *L)
 {
 	luat_socket_ctrl_t *l_ctrl = l_get_ctrl(L, 1);
 	L_CTRL_CHECK;
+	if (lua_isboolean(L, 2))
+	{
+		l_ctrl->netc->listen_multi_client = lua_toboolean(L, 2);
+		if (!network_accept_enable(l_ctrl->netc))
+		{
+			LLOGE("目标适配器不支持1对多客户端连接模式");
+			lua_pushboolean(L, 0);
+			lua_pushboolean(L, 0);
+			return 2;
+		}
+	}
 	int result = network_listen(l_ctrl->netc, 0);
 	lua_pushboolean(L, (result < 0)?0:1);
 	lua_pushboolean(L, result == 0);

+ 3 - 6
components/network/adapter/luat_network_adapter.c

@@ -2202,16 +2202,13 @@ int network_listen(network_ctrl_t *ctrl, uint32_t timeout_ms)
 	if (NW_STATE_LISTEN == ctrl->state)
 	{
 		DBG("socket %d is listen", ctrl->socket_id);
+		if (network_accept_enable(ctrl)) {
+			return 1;
+		}
 		return 0;
 	}
 	if (ctrl->socket_id >= 0)
 	{
-		if (network_accept_enable(ctrl))
-		{
-			DBG("socket %d is accept enable", ctrl->socket_id);
-			return 1;
-		}
-		DBG_ERR("listen but socket_id(%d) >= 0, state %d", ctrl->socket_id, ctrl->state);
 		return -1;
 	}
 	NW_LOCK;

+ 1 - 0
components/network/adapter/luat_network_adapter.h

@@ -210,6 +210,7 @@ typedef struct
     uint8_t state;
     uint8_t is_debug;
     uint8_t domain_ipv6;
+	uint8_t listen_multi_client; // 作为server时,是否支持一对多连接
 }network_ctrl_t;
 
 typedef struct

+ 5 - 0
components/network/adapter_lwip2/net_lwip2.c

@@ -418,6 +418,11 @@ static err_t net_lwip2_tcp_fast_accept_cb(void *arg, struct tcp_pcb *newpcb, err
 		net_lwip2_tcp_error(adapter_index, socket_id);
 		return 0;
 	}
+	if (prvlwip.socket[socket_id].pcb.tcp != NULL) {
+		LLOGE("accept fail, srv socket busy. from %s:%d", ipaddr_ntoa(&newpcb->remote_ip), newpcb->remote_port);
+		tcp_close(newpcb);
+		return ERR_OK;
+	}
 	prvlwip.socket[socket_id].pcb.tcp = newpcb;
 	// prvlwip.socket[socket_id].pcb.tcp->sockid = socket_id;
 	prvlwip.socket[socket_id].rx_wait_size = 0;

+ 5 - 2
olddemo/socket/tcp_server_mulit/tcpsrv.lua

@@ -21,7 +21,7 @@ local function serTask(port, adapter)
 	local buff = zbuff.create(1024)
 	while true do
 		log.info("开始监听客户端连接, 无限时长")
-		sys.wait(1000)
+		-- sys.wait(1000)
 		result, code = libnet.listen(dName, 0, netc)
 		log.info("监听结果", result, code)
 		if result then
@@ -40,8 +40,11 @@ local function serTask(port, adapter)
 			    log.info("客户端连上了", client, "发送个问候")
 			    log.info("发送数据", socket.tx(client, "helloworld"))
             end
+		else
+			log.info("监听失败或超时", result, code)
+			break
 		end
-		sys.wait(1000)
+		--sys.wait(1000)
 	end
 	libnet.close(dName, 5000, netc)
 	log.info("服务器关闭了")