CH395 tcp服务器调试求助

使用的是官方Demo,将SOCKET0设置为TCP服务器工作模式,可以正常收发数据。但客户端主动断开连接后就无法再次连接上。软件提示“socket连接失败 10061”,发送命令CMD12_GET_SOCKET_STATUS_SN查询该SOCKET状态为05,01。其中CH395SocketInterrupt()处理没有做任何改动,针对这些异常我应该如何处理?


void CH395SocketInterrupt(UINT8 sockindex)

{

   UINT8  sock_int_socket;

   UINT16 len;

   UINT16 tmp;

   UINT8  buf[10];


   sock_int_socket = CH395GetSocketInt(sockindex);                   /* 获取socket 的中断状态 */

   

   if(sock_int_socket & SINT_STAT_SENBUF_FREE)                       /* 发送缓冲区空闲,可以继续写入要发送的数据 */

   {

       if(SockInf.SendLen >= SockInf.RemLen)SockInf.RemLen = 0;      /* 数据已经发送完毕 */

       else

       {

            SockInf.pSend += SockInf.SendLen;                        /* 对发送指针进行偏移 */

            SockInf.RemLen -= SockInf.SendLen;                       /* 计算剩余长度 */

            if(SockInf.RemLen > 512)SockInf.SendLen = 512;         /* 计算本次可以发送的数据长度 */

            else SockInf.SendLen = SockInf.RemLen;     

            CH395SendData(sockindex,SockInf.pSend,SockInf.SendLen); /* 发送数据 */

       }

   }


   if(sock_int_socket & SINT_STAT_SEND_OK)                           /* 发送完成中断 */

   {


   }


   if(sock_int_socket & SINT_STAT_RECV)                              /* 接收中断 */

   {

       len = CH395GetRecvLength(sockindex);                          /* 获取当前缓冲区内数据长度 */

       if(len == 0)return;

       if(SockInf.RemLen != 0)return;                                /* 如果数据未发送完毕,则不再接收 */

       CH395GetRecvData(sockindex,len,CH395Buffer);                     /* 读取数据 */

       SockInf.RemLen = len;                                         /* 保存长度 */

       if(len > 512)len = 512;                                     /* 发送缓冲区最大为2048 */

       CH395SendData(sockindex,CH395Buffer,len);

       SockInf.SendLen = len;                                        /* 保存发送的长度 */

       SockInf.pSend = CH395Buffer;                                     /* 发送换取区指针 */

   }


   if(sock_int_socket & SINT_STAT_CONNECT)                          /* 连接中断,仅在TCP模式下有效*/

   {

       if(SockInf.TcpMode == TCP_SERVER_MODE)                       /* 如果socket 为服务器模式,用户可以获取远端的IP和端口*/

       {

     //CH395CMDGetRemoteIPP(sockindex,buf);

       }

   }


   if(sock_int_socket & SINT_STAT_DISCONNECT)                        /* 断开中断,仅在TCP模式下有效 */

   {

   

   }


   if(sock_int_socket & SINT_STAT_TIM_OUT)                           /* 超时中断,仅在TCP模式下有效 */

   {                                 /*TCP 客户端模式的时候,假如TCP CLIENT无法顺利连接服务器端会进入此中断*/

                                                                     /*此时可以把Socket源端口号进行自加处理,以新的端口去连接服务器*/ 

   }

}



您好,请确认芯片版本号是多少?如果是0x42版本,TCP连接断开后,socket0关闭,在DISConnect或者Timeout中断中重新打开。

假如是0x44版本,建议从我们网站下载“CH395EVT”包。参考下TCP SERVER的例程。

请将创建Socket代码发上来看看。


您好,请确认芯片版本号是多少?如果是0x42版本,TCP连接断开后,socket0关闭,在DISConnect或者Timeout中断中重新打开。

假如是0x44版本,建议从我们网站下载“CH395EVT”包。参考下TCP SERVER的例程。

请将创建Socket代码发上来看看。



    您好,请确认芯片版本号是多少?如果是0x42版本,TCP连接断开后,socket0关闭,在DISConnect或者Timeout中断中重新打开。

假如是0x44版本,建议从我们网站下载“CH395EVT”包。参考下TCP SERVER的例程。

请将创建Socket代码发上来看看。



                           

    您好,请确认芯片版本号是多少?如果是0x42版本,TCP连接断开后,socket0关闭,在DISConnect或者Timeout中断中重新打开。

假如是0x44版本,建议从我们网站下载“CH395EVT”包。参考下TCP SERVER的例程。

请将创建Socket代码发上来看看。


                       

这个问题已经解决,当时读SOCKET状态时,传错了参数。芯片版本是0x44的,TCP客户端断开连接时,SOCKET的状态时关闭的,重新打开并监听就OK了。建议官方Demo做的还是规范一些,一些异常处理还是需要的。


您好,0x44版本可直接使用TCP SERVER多连接功能,异常处理我们会考虑添加。


只有登录才能回复,可以选择微信账号登录