Delphi ClientSocket 连接同步的判断

suxiaolsx 2014-07-26 07:54:47
是这样,A去调用B,然后B会与服务器C建立Socket连接,B给C发送消息,C反馈消息给B,B再返回给A,整个过程都需要同步进行,即等到上一步做完再做下一步。现在B与C建立连接是通过: ClientSocket.Open;来实现的,然后通过ClientSocket.Active是否为True来判断有没有连接上,ClientSocket.ClientType := ctBlocking;
问题是经常会出现未连接上的情况,即B给C发消息时ClientSocket.Active 还是 False;是设置了阻塞型Open方法还是有延时吗?我需要怎样去判断是否已经连接上,然后去发消息。求指教。
...全文
659 8 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
fang 2014-08-05
  • 打赏
  • 举报
回复
procedure TCustomWinSocket.DoSetAsyncStyles; var Msg: Integer; Wnd: HWnd; Blocking: Longint; begin Msg := 0; Wnd := 0; if FAsyncStyles <> [] then begin Msg := CM_SOCKETMESSAGE; Wnd := Handle; end; WSAAsyncSelect(FSocket, Wnd, Msg, Longint(Byte(FAsyncStyles))); if FASyncStyles = [] then begin Blocking := 0; ioctlsocket(FSocket, FIONBIO, Blocking); end; end; 看下这段代码,是因为TClientSocket使用的是WSAAsyncSelect通讯模型,ctBlocking设置的SOCKET是否是阻塞,但到你的应用这边是通过向 TCustomWinSocket = class private FHandle: HWnd; 这个FHandle窗口发异步消息来实现的,所以你在连接返回后要做同步等待TClientSocket的active状态或者是等待TClientSocket.FClientSocket.Connected状态,等待过程要你自己实现,等待最好是加超时处理在里面,防止不在线一直停在这里。
suxiaolsx 2014-08-04
  • 打赏
  • 举报
回复
引用 5 楼 fang098 的回复:
明白你说的意思了,你的网络通讯、协议数据处理是在B,A应该是UI方面的处理??你的B要通知A的话以数据回调的方式(如果B是DLL的话)很容易做到,我需要怎样去判断是否已经连接上,然后去发消息。求指教,你所说的就是一个点对点的网络通讯而已,感觉是你的业务逻辑没处理好。
首先谢谢你的回答,A调用B是用到回调,主要是B连接C的时候需要连接上才能往下做,但是经常出现还没连上就做下面的业务了。
fang 2014-07-31
  • 打赏
  • 举报
回复
引用 4 楼 suxiaolsx 的回复:
[quote=引用 3 楼 fang098 的回复:] [quote=引用 楼主 suxiaolsx 的回复:] 是这样,A去调用B,然后B会与服务器C建立Socket连接,B给C发送消息,C反馈消息给B,B再返回给A,整个过程都需要同步进行,即等到上一步做完再做下一步。现在B与C建立连接是通过: ClientSocket.Open;来实现的,然后通过ClientSocket.Active是否为True来判断有没有连接上,ClientSocket.ClientType := ctBlocking; 问题是经常会出现未连接上的情况,即B给C发消息时ClientSocket.Active 还是 False;是设置了阻塞型Open方法还是有延时吗?我需要怎样去判断是否已经连接上,然后去发消息。求指教。
把你的处理流程梳理下,B相对于A来说是服务端是吗?要开一个服务等A来连接,而B相对C来说你的B又是一个客户端是吗?B主动去连接C?你的B这一边是做透明数据转发,不处理任何协议上面的东西?也就是A丢过来是什么你就原样扔给了C?[/quote] B不是服务器,是一个中间数据处理的过程,就是把A传过来的东西做相应的逻辑处理并编成报文发给C,C是服务器。C处理的结果返回B也会做对应的处理解析再传给A。[/quote] 明白你说的意思了,你的网络通讯、协议数据处理是在B,A应该是UI方面的处理??你的B要通知A的话以数据回调的方式(如果B是DLL的话)很容易做到,我需要怎样去判断是否已经连接上,然后去发消息。求指教,你所说的就是一个点对点的网络通讯而已,感觉是你的业务逻辑没处理好。
suxiaolsx 2014-07-30
  • 打赏
  • 举报
回复
引用 3 楼 fang098 的回复:
[quote=引用 楼主 suxiaolsx 的回复:] 是这样,A去调用B,然后B会与服务器C建立Socket连接,B给C发送消息,C反馈消息给B,B再返回给A,整个过程都需要同步进行,即等到上一步做完再做下一步。现在B与C建立连接是通过: ClientSocket.Open;来实现的,然后通过ClientSocket.Active是否为True来判断有没有连接上,ClientSocket.ClientType := ctBlocking; 问题是经常会出现未连接上的情况,即B给C发消息时ClientSocket.Active 还是 False;是设置了阻塞型Open方法还是有延时吗?我需要怎样去判断是否已经连接上,然后去发消息。求指教。
把你的处理流程梳理下,B相对于A来说是服务端是吗?要开一个服务等A来连接,而B相对C来说你的B又是一个客户端是吗?B主动去连接C?你的B这一边是做透明数据转发,不处理任何协议上面的东西?也就是A丢过来是什么你就原样扔给了C?[/quote] B不是服务器,是一个中间数据处理的过程,就是把A传过来的东西做相应的逻辑处理并编成报文发给C,C是服务器。C处理的结果返回B也会做对应的处理解析再传给A。
fang 2014-07-28
  • 打赏
  • 举报
回复
引用 楼主 suxiaolsx 的回复:
是这样,A去调用B,然后B会与服务器C建立Socket连接,B给C发送消息,C反馈消息给B,B再返回给A,整个过程都需要同步进行,即等到上一步做完再做下一步。现在B与C建立连接是通过: ClientSocket.Open;来实现的,然后通过ClientSocket.Active是否为True来判断有没有连接上,ClientSocket.ClientType := ctBlocking; 问题是经常会出现未连接上的情况,即B给C发消息时ClientSocket.Active 还是 False;是设置了阻塞型Open方法还是有延时吗?我需要怎样去判断是否已经连接上,然后去发消息。求指教。
把你的处理流程梳理下,B相对于A来说是服务端是吗?要开一个服务等A来连接,而B相对C来说你的B又是一个客户端是吗?B主动去连接C?你的B这一边是做透明数据转发,不处理任何协议上面的东西?也就是A丢过来是什么你就原样扔给了C?
suxiaolsx 2014-07-28
  • 打赏
  • 举报
回复
引用 1 楼 hj3000 的回复:
ctBlocking模式下服务端要写多线程代码的。
现在是要等连接上服务器再做后续处理,但是好像是还没连接上,程序就已经往下走了,怎么能同步做的?
hj8090 2014-07-27
  • 打赏
  • 举报
回复
ctBlocking模式下服务端要写多线程代码的。

1,594

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 网络通信/分布式开发
社区管理员
  • 网络通信/分布式开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧