rt_thread + stm32f103 + enc28j60 弄成一个 tcp server后,通过select实现检测,在客户端连续断开连接若干次<5次以后>,tcp server就down掉了,而且无法ping通,但是另外一个线程的udp还能接收包

31 views
Skip to first unread message

jason shi

unread,
Sep 19, 2014, 4:00:00 AM9/19/14
to rt-threa...@googlegroups.com
rt_thread + stm32f103 + enc28j60 弄成一个 tcp server后,通过select实现检测,
在客户端连续断开连接若干次<5次以后>,并recv + send 1024字节数据后,tcp server就down掉了,而且无法ping通,但是另外一个线程的udp还能接收包
#if 1
 while(1) 
    {
        /* init file describle */
        FD_ZERO(&rset);
        FD_SET(listenfd, &rset);
        
        /* set timeout */
        timeout.tv_sec = 10;
        timeout.tv_usec = 0;
        
        /* add active connection to client[] */
        for(i = 0; i < BACKLOG; i++) { 
          if(client[i])
          {
            FD_SET(client[i], &rset);
            maxfd = maxfd > client[i] ? maxfd : client[i];
          } 
        }
        
        /*  select */
        ret = select(maxfd +1, &rset, NULL, NULL, NULL);
        if(ret < 0) { 
          MY_DEBUG("%s,%d: select error\n\r",__func__,__LINE__);
          goto EXIT; 
        }else if(!ret){ 
          MY_DEBUG("%s,%d: select...\n\r",__func__,__LINE__); 
          continue; 
        }
        
        /* check every fd in client[] by set */
//        for(i = 0; i < conn_cout; i++) {
        for(i = 0; i < BACKLOG; i++) {
          /* if client[i] < 0 ,don't check */
          if(client[i] >= 0) {
              /* check client[]*/
              if(FD_ISSET(client[i], &rset)) { 
                ret = do_recv_msg(client[i]); 
                if(ret < 0) { 
                  MY_DEBUG("%s,%d: do recv faild !\n\r",__func__,__LINE__);
                  if(client[i])
                    lwip_close(client[i]); 
                  FD_CLR(client[i], &rset);
//                  client[i] = 0; 
                  client[i] = -1; 
                  conn_cout--;          //TODO...
                  MY_DEBUG("_______ conn_cout  = %d\n", conn_cout);
                }
              }
          }  
           
        } /* for()  check client[] */
        
        /* check listen fd by set or not */
        if(FD_ISSET(listenfd, &rset)) {
            confd = accept(listenfd, (struct sockaddr *)&client_addr, &sin_size);   /* accept */
            if(confd < 0)  { 
              MY_DEBUG("%s,%d: No new connect..\n\r",__func__,__LINE__);
              continue; 
            }
            /* add new connection to client[]  */
            if(conn_cout < BACKLOG) { 
              MY_DEBUG("%s,%d: add new connection to client[]..\n\r",__func__,__LINE__);
             /* set sockfd*/      
//              setsockopt(confd, SOL_SOCKET, SO_REUSEADDR,(const char*)&sock_reuse, sizeof(sock_reuse));
//              setsockopt(confd, SOL_SOCKET, SO_KEEPALIVE, (void *)&keepalive , sizeof(keepalive ));
//TODO...
              /* nonbloking */
//              lwip_ioctl(confd, FIONBIO, &k);
              for(i = 0; i < BACKLOG; i++) {
                if(client[i] < 0) {
                  
                   client[i] = confd;
                   break ;
                }
              }
              conn_cout++;
              MY_DEBUG("-----------------conn_cout = %d\n ", conn_cout);
//              client[conn_cout++] = confd;
              /* replace select maxfd by confd */
              if(confd > maxfd)   
                maxfd = confd;              
            }else { 
//              MY_DEBUG("%s,%d: more user connect.. server will rester..\n\r",__func__,__LINE__); 
                MY_DEBUG("%s,%d: more user connect.. zero all connect..\n\r",__func__,__LINE__); 

                    for(i = 0; i < BACKLOG; i++) { 
                      if(client[i] >= 0)  {
                        lwip_close(client[i]); 
                        FD_CLR(client[i], &rset);
                        client[i] = -1;
                      }
                     // goto EXIT;
                   }
                   conn_cout = 0;
                   continue ;
//              lwip_close(confd);
//              break;
            }

        }
    }    
#endif /*end while*/

不知道问题出在哪里了,是我自己程序写的问题,还是硬件<enc28j60 只有10M>速度跟不上,还是lwip协议栈里面有什么问题? 求指教,谢谢! 

bernard

unread,
Sep 19, 2014, 4:16:01 AM9/19/14
to rt-thread用户组
无法ping,但UDP还能收发?不能ping通,一般是驱动有问题。

--
You received this message because you are subscribed to the Google Groups "rt-thread用户组" group.
To unsubscribe from this group and stop receiving emails from it, send an email to rt-thread-cnus...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply all
Reply to author
Forward
0 new messages