如題,不論是用DEBUG395.exe工具測試還是直接代碼控制都出現這種情況,請教如何解決?
同時開啟了TCP服務器及UDP服務器兩個SOCKET,啟用了DHCP,中斷處理流程如下:
/**********************************************************************************
* Function Name ?: CH395SocketInterrupt
* Description ? ?: CH395 socket 中斷,在全局中斷中被調用
* Input ? ? ? ? ?: sockindex
* Output ? ? ? ? : None
* Return ? ? ? ? : None
**********************************************************************************/
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ā)送的數據 */
? ?{
? SockInf[sockindex].RemLen = 0;
? ?}
? ?if(sock_int_socket & SINT_STAT_SEND_OK) ? ? ? ? ? ? ? ? ? ? ? ? ? /* 發(fā)送完成中斷 */
? ?{
? ?SockInf[sockindex].RemLen = 0;
? ?}
? ?if(sock_int_socket & SINT_STAT_RECV) ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?/* 接收中斷 */
? ?{
? ? ? ?len = CH395GetRecvLength(sockindex); ? ? ? ? ? ? ? ? ? ? ? ? ?/* 獲取當前緩沖區(qū)內數據長度 */
? ? ? ?if(len == 0)return;
? ? ? ?if(SockInf[sockindex].RemLen != 0)return; /*有數據為發(fā)送完成*/
? if(len > 512)len = 512;?
??
? SockInf[sockindex].RemLen = ?len; ? ? ? ? ? ? ? ? ? ? ? ? ? ? /* 讀取數據 */
? ? ? ?CH395GetRecvData(sockindex,len,CH395Buffer); ? ? ? ? ? ? ? ? ?
? ? ? ?
? if(sockindex == UDP_SERVER_SOCKET)
? {
? ? ? ?CH395UDPSendTo(&CH395Buffer[8], (len -8),&CH395Buffer[4], ((UINT16)CH395Buffer[3] << 8) + CH395Buffer[2], sockindex);
? }
??
? if(sockindex == TCP_SERVER_SOCKET)
? {
? CH395SendData(sockindex,CH395Buffer,len);
? }
? ?}
? ?if(sock_int_socket & SINT_STAT_CONNECT) ? ? ? ? ? ? ? ? ? ? ? ? ? /* 連接中斷,僅在TCP模式下有效*/
? ?{
? ?}
? ?if(sock_int_socket & SINT_STAT_DISCONNECT) ? ? ? ? ? ? ? ? ? ? ? ?/* 斷開中斷,僅在TCP模式下有效 */
? ?{
? ?}
? ?if(sock_int_socket & SINT_STAT_TIM_OUT) ? ? ? ? ? ? ? ? ? ? ? ? ? /* 超時中斷,僅在TCP模式下有效 */
? ?{ ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? /*TCP 客戶端模式的時候,假如TCP CLIENT無法順利連接服務器端會進入此中斷*/
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? /*此時可以把Socket源端口號進行自加處理,以新的端口去連接服務器*/?
? ?}
}
使用UDP@TCP測試工具測試數據收發(fā),如下圖,正常的話收發(fā)數據長度應該是一致的。
UDP測試時,會重發(fā)。TCP則不會出現這種狀況。