使用的是官方Demo,將SOCKET0設(shè)置為TCP服務(wù)器工作模式,可以正常收發(fā)數(shù)據(jù)。但客戶端主動斷開連接后就無法再次連接上。軟件提示“socket連接失敗 10061”,發(fā)送命令CMD12_GET_SOCKET_STATUS_SN查詢該SOCKET狀態(tài)為05,01。其中CH395SocketInterrupt()處理沒有做任何改動,針對這些異常我應(yīng)該如何處理?
void CH395SocketInterrupt(UINT8 sockindex)
{
? ?UINT8 ?sock_int_socket;
? ?UINT16 len;
? ?UINT16 tmp;
? ?UINT8 ?buf[10];
? ?sock_int_socket = CH395GetSocketInt(sockindex); ? ? ? ? ? ? ? ? ? /* 獲取socket 的中斷狀態(tài) */
? ?
? ?if(sock_int_socket & SINT_STAT_SENBUF_FREE) ? ? ? ? ? ? ? ? ? ? ? /* 發(fā)送緩沖區(qū)空閑,可以繼續(xù)寫入要發(fā)送的數(shù)據(jù) */
? ?{
? ? ? ?if(SockInf.SendLen >= SockInf.RemLen)SockInf.RemLen = 0; ? ? ?/* 數(shù)據(jù)已經(jīng)發(fā)送完畢 */
? ? ? ?else
? ? ? ?{
? ? ? ? ? ? SockInf.pSend += SockInf.SendLen; ? ? ? ? ? ? ? ? ? ? ? ?/* 對發(fā)送指針進(jìn)行偏移 */
? ? ? ? ? ? SockInf.RemLen -= SockInf.SendLen; ? ? ? ? ? ? ? ? ? ? ? /* 計算剩余長度 */
? ? ? ? ? ? if(SockInf.RemLen > 512)SockInf.SendLen = 512; ? ? ? ? /* 計算本次可以發(fā)送的數(shù)據(jù)長度 */
? ? ? ? ? ? else SockInf.SendLen = SockInf.RemLen; ? ??
? ? ? ? ? ? CH395SendData(sockindex,SockInf.pSend,SockInf.SendLen); /* 發(fā)送數(shù)據(jù) */
? ? ? ?}
? ?}
? ?if(sock_int_socket & SINT_STAT_SEND_OK) ? ? ? ? ? ? ? ? ? ? ? ? ? /* 發(fā)送完成中斷 */
? ?{
? ?}
? ?if(sock_int_socket & SINT_STAT_RECV) ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?/* 接收中斷 */
? ?{
? ? ? ?len = CH395GetRecvLength(sockindex); ? ? ? ? ? ? ? ? ? ? ? ? ?/* 獲取當(dāng)前緩沖區(qū)內(nèi)數(shù)據(jù)長度 */
? ? ? ?if(len == 0)return;
? ? ? ?if(SockInf.RemLen != 0)return; ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?/* 如果數(shù)據(jù)未發(fā)送完畢,則不再接收 */
? ? ? ?CH395GetRecvData(sockindex,len,CH395Buffer); ? ? ? ? ? ? ? ? ? ? /* 讀取數(shù)據(jù) */
? ? ? ?SockInf.RemLen = len; ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? /* 保存長度 */
? ? ? ?if(len > 512)len = 512; ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? /* 發(fā)送緩沖區(qū)最大為2048 */
? ? ? ?CH395SendData(sockindex,CH395Buffer,len);
? ? ? ?SockInf.SendLen = len; ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?/* 保存發(fā)送的長度 */
? ? ? ?SockInf.pSend = CH395Buffer; ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? /* 發(fā)送換取區(qū)指針 */
? ?}
? ?if(sock_int_socket & SINT_STAT_CONNECT) ? ? ? ? ? ? ? ? ? ? ? ? ?/* 連接中斷,僅在TCP模式下有效*/
? ?{
? ? ? ?if(SockInf.TcpMode == TCP_SERVER_MODE) ? ? ? ? ? ? ? ? ? ? ? /* 如果socket 為服務(wù)器模式,用戶可以獲取遠(yuǎn)端的IP和端口*/
? ? ? ?{
? ? ?//CH395CMDGetRemoteIPP(sockindex,buf);
? ? ? ?}
? ?}
? ?if(sock_int_socket & SINT_STAT_DISCONNECT) ? ? ? ? ? ? ? ? ? ? ? ?/* 斷開中斷,僅在TCP模式下有效 */
? ?{
? ?
? ?}
? ?if(sock_int_socket & SINT_STAT_TIM_OUT) ? ? ? ? ? ? ? ? ? ? ? ? ? /* 超時中斷,僅在TCP模式下有效 */
? ?{ ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? /*TCP 客戶端模式的時候,假如TCP CLIENT無法順利連接服務(wù)器端會進(jìn)入此中斷*/
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?/*此時可以把Socket源端口號進(jìn)行自加處理,以新的端口去連接服務(wù)器*/?
? ?}
}