找回密码
 加入
搜索
查看: 3075|回复: 2

[网络通信] 关于TCP几个基本逻辑观念问题,求教有经验的人

[复制链接]
发表于 2015-3-27 15:48:38 | 显示全部楼层 |阅读模式
目前正在学习怎么写 TCP 通讯,已经可以模仿出 主机端 接收讯息  客户端发送讯息

问题一 客户端发送前要 TCPConnect 作联机动作 然后用 TCPSend 送出数据,请问 数据送出完毕后 ,这个联机就会自动断掉 还是 必须由一方做TCPCloseSocket?? 是由哪方做 TCPCloseSocket??

问题二 目前 可做到 客户端 主动联机,发送讯息,主机端接收, 也可以 主机端 要求联机到 客户端 ,发送讯息,客户端接收,但是我想要的不是这样,
我想要的是  客户端 主动联机  到 主机端 ,主机接到讯息后, 联机不要断掉,再由主机端 回复讯息,这样该怎么做呢??
发表于 2015-3-29 18:29:02 | 显示全部楼层
问题一 如果是tcp,正常来说双方都要closesocket以释放资源
问题二 如果网络没有波动,tcp是会保持联机的.服务端调用TCPAccept成功返回后直接发注册即可。
发表于 2015-3-31 21:02:16 | 显示全部楼层
本帖最后由 shqf 于 2015-3-31 21:16 编辑

关于问题一,联机一般不会自动 断掉的。否则像联机游戏、线上聊天难以实现了。不管哪一方都 可主动断掉。
关于问题二,说不清楚,选了我编的一个服务端程序的一部分,你可看看,不过这段代码的功能是当有客户端连上服务端,服务端就接收消息,后判断消息类型,再作不同的讯息回复,然后断开,再等待客户端连接。
While 1
        If $ConnectedSocket = -1 Then ; If no connection look for one
                $ConnectedSocket = TCPAccept($MainSocket)
                If $ConnectedSocket >= 0 Then
                        $szIP_Accepted = _SocketToIP($ConnectedSocket) ;获取客户端IP地址
                        _SetEditData("与客户端" & $szIP_Accepted & "建立连接")
                EndIf
        Else ;If connected try to read some data
                $Recv = BinaryToString(TCPRecv($ConnectedSocket, 2014, 1), 4)
                If @error Then
                        ; ERROR OCCURRED, CLOSE SOCKET AND RESET ConnectedSocket to -1
                        _SetEditData("接收失败")
                        TCPCloseSocket($ConnectedSocket)
                        $ConnectedSocket = -1

                ElseIf $Recv <> "" Then
                        _SetEditData("收到:" & $Recv)

                        $MsgBody = StringSplit($Recv, "|")
                        If $MsgBody[1] = "VEF" Then ;Verify验证指令,格式为"VEF|中文用户名|口令"
                                $SendMsg="要回复的讯息..."
                                $Send = TCPSend($ConnectedSocket, StringToBinary($SendMsg , 4))
                                If @error Or $Send = 0 Then
                                        _SetEditData("回复失败")                                
                                EndIf
                                ;ElseIf $MsgBody[1] =
                                ;如果发来的是其他信息,就作相应的其他处理
                                ;...
                        EndIf
                        ;CLOSE SOCKET AND RESET ConnectedSocket to -1
                        TCPCloseSocket($ConnectedSocket)
                        $ConnectedSocket = -1
                        _SetEditData("断开与客户端的连接" & @CRLF)
                EndIf
        EndIf
        $nMsg = GUIGetMsg()
        Switch $nMsg
                Case
                        ;...
                Case
                        ;...
        EndSwitch
WEnd
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-12-23 07:28 , Processed in 0.104518 second(s), 24 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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