kk_lee69 发表于 2015-4-4 01:44:17

关于 TCP 通讯协议,如何使用 RST方式 强制关闭联机

TCP 通讯协议可使用SYNACKFINRSTPSHURG 做为沟通

当一个客户端 发送联机请求后,发送的讯息无法通过服务端的认证
服务端使用 TCPCloseSocket($RegSocket) 关闭联机后

实际上 联机还是没有被踢掉除非客户端做出反应

查询资料后 发现 似乎 需要送出 RST 才可以强制关闭联机

AU3中 如何才可以强制关闭 这个联机??

漠北雪~狼 发表于 2015-4-6 20:43:37

如果服务端发送一个"CloseConnection"给客户端,然后关闭连接;客户端收到此消息后关闭连接。
这样可行?

漠北雪~狼 发表于 2015-4-6 20:44:18

如果服务端发送一个"CloseConnection"给客户端,然后关闭连接;客户端收到此消息后关闭连接。
这样可行?

kk_lee69 发表于 2015-4-7 09:14:20

回复 2# 漠北雪~狼
如果 SERVER 與 客户端都適自己的程式 當然OK

我知所以會這樣做是因為 服務器 要對外的,我不想人家一直 想嘗試 跟 我的服務器溝通探測
所以 加上了取得連線前必須要 先發送固定字串 驗證

驗證不過就表示 不是我自己的程式.....所以 想強製 關閉掉對方的程式

kk_lee69 发表于 2015-4-7 10:35:06

回复 3# 漠北雪~狼

或者換個講法

服務端 可不可以 主動 拒絕 某個 客戶端的連線 跟斷開 它的連線

漠北雪~狼 发表于 2015-4-7 22:06:09

可以啊,例:
CloseSocket($tCon)
再$tCon=0

你本看再netstat 看看,连接应该是不存在了的。

kk_lee69 发表于 2015-4-8 09:57:05

本帖最后由 kk_lee69 于 2015-4-8 10:02 编辑

回复 6# 漠北雪~狼




我的程式 如下:接收 對方 傳來的訊息後檢查看看是不是 規定的溝通方式,是的話 就放行不是 就關閉連線
從上圖可知 每個客戶端   會有兩個 Socket 號碼
目前我只能關掉一個,但是關掉的還是會卡在哪邊
因為
$RegSocket 第一次會跑一個溝通的 Socket 號碼後會在 建立最後確認的 Socket號碼而我只能抓到最後一次的


Func _TCPRecv()
        Local $RegSocket = -1, $RegIp, $rDays
        ;嘗試接收傳入的請求
        Dim $RegSocket = TCPAccept($MainSocket)
;~         ;當$RegSocket 不等於 -1 就是 有人請求了 就跑下面 檢查是不是 上線的請求
        If $RegSocket <> -1 Then

                Dim $recv_1 = TCPRecv($RegSocket, 1024 * 1024, 1)
                If @error Then
                        $error = Int(@error)
                        echo($error & "錯誤,無效的Socket:" & $RegSocket)
                EndIf
               
                If $recv_1 <> "" Then
                        $recvBtoS = _MAC_Decrypt( BinaryToString($recv_1, 4))
                        $rDays = StringSplit($recvBtoS, "+", 1)
                        If IsArray($rDays) Then
                                If $rDays = $MainStr   Then; "0x232323232B"   
               
                                         ;通過   $rDays = $MainStr   的檢查 表示 是我自己的程式   所以放行 後續處理
                               
                                Else
                                        ; 沒有通過則希望強制關閉
                                               
                                                TCPCloseSocket($RegSocket)
                                                $RegSocket=0

                                EndIf
                               
                        EndIf
                EndIf
        EndIf
EndFunc   ;==>_TCPRecv

deaph 发表于 2015-4-8 11:15:07

涨知识,学习了!

ceoguang 发表于 2015-4-9 22:25:33

你那图称之为TCP的2MSL,具体可看TCP/IP详解,又或者搜索关键词:2MSL TIME_WAIT

tvzml 发表于 2015-4-9 22:50:25

实际应用中发现,AU3与部分程序通讯,在建立连接以后,对方回应数据后,等你接收到数据以后,马上会 @error ,由此AU3规范的判断断网已不适用,这样的情况下只能维持现有的Socket,而AU3单方面的关闭Socket ,会产生一个清理不掉的 FIN_WAIT2 ,目前我采取的是 AU3客户端 TCPshutdown() ,对方会主动关闭连接,重连的时候再次 TCPStartup() ,目前我使用的是 上来直接无阻塞测试端口,如果通讯可以建立,立马切换 阻塞模式,直接使用测试的Socket 进程后面的通讯,这样的效率很高,一般局域网可以在 500毫秒以下完成检测和建立连接,ADSL或者慢的网络 适当 放慢检测超时 如 800 - 1000 ,这样做非常完美,感觉不出一点卡,哪怕遇上死IP 也不会卡住。

kk_lee69 发表于 2015-4-12 00:34:56

回复 9# ceoguang

我有查過一些資料 後來發現 FIN_WAIT2或者 TIME_WAIT 都必須要等 2MSL 系統才會清掉

有看過修改 註冊表 達到快速清掉的方法,但是 這個應該會影響所有的 TCP通訊

所以想請問,是不是 有單方面 斷線 拒絕連接 又 不想等待 2MSL 的時間的方法呢??

ceoguang 发表于 2015-4-12 15:00:48

回复 11# kk_lee69

有,用UDP或原生SOCKET
页: [1]
查看完整版本: 关于 TCP 通讯协议,如何使用 RST方式 强制关闭联机