請(qǐng)問(wèn), tcp連接后,網(wǎng)線斷開(kāi), 要做什么處理? 發(fā)現(xiàn)再連接沒(méi)反應(yīng)
您好,關(guān)于使用EVT TCP例程拔掉網(wǎng)線再連接后,程序中在檢測(cè)到TCP Timeout后會(huì)重新創(chuàng)建Socket進(jìn)行連接,如下圖1。你可以用WireShark抓包看一下,如下圖2,拔掉網(wǎng)線再連接后,主機(jī)會(huì)向設(shè)備發(fā)送一個(gè)RST,會(huì)重新進(jìn)行連接。后續(xù)若有問(wèn)題,可通過(guò)郵箱(lzs@wch.cn)和我溝通。關(guān)于重新連接,這個(gè)過(guò)程可能要等10s左右,若要縮短這個(gè)時(shí)間,可以修改一下程序中keepalive的值,如下圖3。關(guān)于這三個(gè)值的介紹,在EVT協(xié)議棧庫(kù)說(shuō)明中有相關(guān)介紹。
圖1
圖2
圖3
拔網(wǎng)線
if (intstat & GINT_STAT_PHY_CHANGE) ? ? ? ? ? ? ? ? ? ? ? ? ? //PHY status change
? ? {
? ? ? ? i = WCHNET_GetPHYStatus();
? ? ? ? printf("phy state %d\n", i);
這里是能獲得狀態(tài)改變的。 我能否在這里關(guān)閉,然后重新listen ? 要怎么做?
您好,此處主要對(duì)PHY狀態(tài)查詢,在程序其他地方有檢測(cè)超時(shí)重新創(chuàng)建鏈接。若你那邊無(wú)法自動(dòng)重連,可以把你抓包數(shù)據(jù)發(fā)我看一下。
我這樣處理:
正常連接正常timeout參數(shù), PHY狀態(tài)里判斷網(wǎng)線斷, 然后重設(shè)timeout參數(shù)到極小值, 這樣插拔網(wǎng)線就能馬上觸發(fā) timeout。也就能馬上重新連上tcp
這樣處理有問(wèn)題嗎?
您好,在檢測(cè)到PHY斷開(kāi)后可以通過(guò)WCHNET_SocketClose釋放掉所創(chuàng)建的socket然后重新創(chuàng)建,如果做TCP服務(wù)器只需要關(guān)閉數(shù)據(jù)socket即可有新的連接請(qǐng)求協(xié)議棧會(huì)自動(dòng)創(chuàng)建,監(jiān)聽(tīng)端口可以不用重新創(chuàng)建一直保持監(jiān)聽(tīng)即可,如果是網(wǎng)線斷開(kāi)且PHY狀態(tài)沒(méi)有改變的情況(比如客戶端與連接的路由器或交換機(jī)之間連接異常)可以使用keepalive檢測(cè)到通信超時(shí)后協(xié)議棧自動(dòng)釋放掉異常的數(shù)據(jù)socket,如有其他問(wèn)題可與(zl@wch.cn)聯(lián)系。