找回密码
 加入
搜索
查看: 5256|回复: 11

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

  [复制链接]
发表于 2015-4-4 01:44:17 | 显示全部楼层 |阅读模式
TCP 通讯协议可使用  SYN  ACK  FIN  RST  PSH  URG 做为沟通

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

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

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

AU3中 如何才可以强制关闭 这个联机??
发表于 2015-4-6 20:43:37 | 显示全部楼层
如果服务端发送一个"CloseConnection"给客户端,然后关闭连接;客户端收到此消息后关闭连接。
这样可行?
发表于 2015-4-6 20:44:18 | 显示全部楼层
如果服务端发送一个"CloseConnection"给客户端,然后关闭连接;客户端收到此消息后关闭连接。
这样可行?
 楼主| 发表于 2015-4-7 09:14:20 | 显示全部楼层
回复 2# 漠北雪~狼
如果 SERVER 與 客户端  都適自己的程式 當然OK

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

驗證不過就表示 不是我自己的程式.....所以 想強製 關閉掉對方的程式
 楼主| 发表于 2015-4-7 10:35:06 | 显示全部楼层
回复 3# 漠北雪~狼

或者換個講法

服務端 可不可以 主動 拒絕 某個 客戶端的連線 跟斷開 它的連線
发表于 2015-4-7 22:06:09 | 显示全部楼层
可以啊,例:
CloseSocket($tCon)
再$tCon=0

你本看再netstat 看看,连接应该是不存在了的。
 楼主| 发表于 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[1] = $MainStr   Then  ; "0x232323232B"   
                 
                                         ;通過   $rDays[1] = $MainStr   的檢查 表示 是我自己的程式   所以放行 後續處理
                                 
                                Else
                                        ; 沒有通過則希望  強制關閉
                                                
                                                TCPCloseSocket($RegSocket)
                                                $RegSocket=0

                                EndIf
                                
                        EndIf
                EndIf
        EndIf
EndFunc   ;==>_TCPRecv

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×
发表于 2015-4-8 11:15:07 | 显示全部楼层
涨知识,学习了!
发表于 2015-4-9 22:25:33 | 显示全部楼层
你那图称之为TCP的2MSL,具体可看TCP/IP详解,又或者搜索关键词:2MSL TIME_WAIT
发表于 2015-4-9 22:50:25 | 显示全部楼层
实际应用中发现,AU3与部分程序通讯,在建立连接以后,对方回应数据后,等你接收到数据以后,马上会 @error ,由此AU3规范的判断断网已不适用,这样的情况下只能维持现有的Socket,而AU3单方面的关闭Socket ,会产生一个清理不掉的 FIN_WAIT2 ,目前我采取的是 AU3客户端 TCPshutdown() ,对方会主动关闭连接,重连的时候再次 TCPStartup() ,目前我使用的是 上来直接无阻塞测试端口,如果通讯可以建立,立马切换 阻塞模式,直接使用测试的Socket 进程后面的通讯,这样的效率很高,一般局域网可以在 500毫秒以下完成检测和建立连接,ADSL或者慢的网络 适当 放慢检测超时 如 800 - 1000 ,这样做非常完美,感觉不出一点卡,哪怕遇上死IP 也不会卡住。
 楼主| 发表于 2015-4-12 00:34:56 | 显示全部楼层
回复 9# ceoguang

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

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

所以想請問,是不是 有單方面 斷線 拒絕連接 又 不想等待 2MSL 的時間的方法呢??
发表于 2015-4-12 15:00:48 | 显示全部楼层
回复 11# kk_lee69

有,用UDP或原生SOCKET
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-11-23 04:17 , Processed in 0.081906 second(s), 24 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表