We are running a survey to help us improve the experience for all of our members. If you see the survey appear, please take the time to tell us about your experience if you can.
Confused by some problem,Looking into 2 Case study in ESP serires and WizFi360's CMSIS_DRIVER WIFI Driver (WiFi_WizFi360.c and WiFi_ESPxxxx.c)
1st is at AT_Notify(): updating link_id and SOCKET_STATE_CONNECTED by response for <link_id>,CONNECT2nd is that 1st affect ARM_WIFI_SocketAccept()'s data updating.
Conditions:
Case 1: One Client Connected 0,CONNECT --->(discription: <link_id>,CONNECT)AT+CIPSTATUSSTATUS:5+CIPSTATUS:0,"TCP","192.168.36.2",58428,6000,1has not a problme
Case 2: 2nd Client Connected1,CONNECTAT+CIPSTATUSSTATUS:5+CIPSTATUS:0,"TCP","192.168.36.2",58428,6000,1\r\n+CIPSTATUS:1,"TCP","192.168.36.3",55362,6000,1\r\nhas some problem
Details: 1. When 1st Client CONNECTs Server, AT_Notify() under 292 line code is not a problem.But when 2nd Client CONNECTs Server in case that 1st Client is CONNECTED state<refer to 292 line>if (Socket[n].state == SOCKET_STATE_SERVER) { Socket[n].conn_id = conn.link_id; Socket[n].state = SOCKET_STATE_CONNECTED;}
1st client state can be updated to SOCKET_STATE_CONNECTED and Socket[n].conn_id = conn.link_id;but 2nd client state can not be update to SOCKET_STATE_CONNECTED and Socket[n].conn_id = conn.link_id;
2. Socket's backlog is only updated under 2580 line, when ARM_WIFI_SocketAccept() is called.and because of ARM_WIFI_SocketAccept()'s 2554 line: if (conn.link_id == Socket[n].conn_id) conditions,
the data below lines can not be updated. /* Copy remote ip */ memcpy (Socket[n].r_ip, conn.remote_ip, 4); /* Set remote port */ Socket[n].r_port = conn.remote_port; /* Set local port */ Socket[n].l_port = conn.local_port;
3. To use static int32_t ARM_WIFI_SocketAccept (int32_t socket, uint8_t *ip, uint32_t *ip_len, uint16_t *port) Assuming that Server application use max. 4 connection, does Server application have alway to iterate and check 4 socket, to update Socekt's data and stateexample: for (i=1 ; i<5; i++) //because 0 is server ARM_WIFI_SocketAccept (i, , , ) This question's reason is ARM_WIFI_SocketAccept(){
2551 line: sock = &Socket[socket];2534 line: n = sock->backlog;}"n" is dependent on ARM_WIFI_SocketAccept()'s input argument socket and backlog is updated 2580 lin
4. Can you explain or illustrate how to use "backlog"
Refer to your own code below----------------------------------------------------------------------
AT_Notify(){
292 line start:
else { /* Check server sockets and put connection on the backlog */ for (n = 0U; n < WIFI_SOCKET_NUM; n++) { if (Socket[n].state == SOCKET_STATE_SERVER) { /* Set pointer to server socket */ sock = &Socket[n]; /* Find available backlog socket */ do { n = Socket[n].backlog;
if (Socket[n].state == SOCKET_STATE_LISTEN) { /* Set connection id and change state */ Socket[n].conn_id = conn.link_id; Socket[n].state = SOCKET_STATE_CONNECTED; break; } } while (Socket[n].backlog != sock->backlog); break; } }
if (n != WIFI_SOCKET_NUM) { /* Set event */ osEventFlagsSet (pCtrl->evflags_id, WIFI_WAIT_CONN_ACCEPT); } }
324 line end:
}
static int32_t ARM_WIFI_SocketAccept(){
2440 line start:
ex = AT_Cmd_GetStatus (AT_CMODE_EXEC);
if (ex == 0) { /* Wait until response arrives */ ex = WiFi_Wait (WIFI_WAIT_RESP_GENERIC, WIFI_RESP_TIMEOUT);
if (ex == 0) { /* Check response */ do { /* Response arrived */ ex = AT_Resp_GetStatus (&conn); if (ex >= 0) { /* Check if structure contains information relevant for current link id */ if (conn.link_id == Socket[n].conn_id) { /* Copy remote ip */ memcpy (Socket[n].r_ip, conn.remote_ip, 4); /* Set remote port */ Socket[n].r_port = conn.remote_port; /* Set local port */ Socket[n].l_port = conn.local_port; } } } while (ex > 0); } } 2566 line end:
2580 line start:
/* Return socket number */ rval = n;
/* Update backlog, put current socket to the end of list */ while (Socket[n].backlog != sock->backlog) { n = Socket[n].backlog; } Socket[n].backlog = (uint8_t)rval; Socket[rval].backlog = sock->backlog; 2588 line end:
2622 line: return (rval);}