使用的是官方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源端口号进行自加处理,以新的端口去连接服务器*/
}
}