请教 Socket 高手!(100分)

  • 主题发起人 主题发起人 黑天
  • 开始时间 开始时间

黑天

Unregistered / Unconfirmed
GUEST, unregistred user!
一个局域网通讯,要求:
1、A 机向 B 机发一条消息,但希望 B 机能够立即返回答复。比如:
A->B 问:你是什么操作系统?B 在接收到 A 的请求后,
需要立即向 A 回复,因为 A 在向 B 机发出信息后,在一定时间
内可能还会向第三台机问其它问题。
2、我在一个 DLL 中封了一个窗体,同时加载 TServerSocket, TClientSocket,
很象 Delphi-Demos 中的 Chat。当 Socket 接收到消息时,就需要
判断:这是一条新消息,还是一条反馈消息。如果是反馈消息,则
需要向应用程序返回信息。于是由于不同步的问题,使得应用程序
的等待变得不确定。因为不可能用:
Connect->SendMsg->AcceptMsg 这样的单一流程直接获取反馈;而
必须先 Connect,然后等待响应,如果成功,则发 SendMsg,继续等待,
直到 DLL 中的 Socket 返回,才能完成这样的一个序列。

3、问题是:如果是两台机器,那么可以肯定消息的反馈是唯一的,而不管
需要等待多长时间;如果有多台呢?如果 A 机向 C 机的连接时间过长,
用户又转向连接 W 机,那么消息的滞后显然会带来许多问题了。

大致就是这么一个情况,想请教一下高手,有什么好的解决方案吗?
 
你可以在中間層MTS中加一個變量參數,在發送信息的給這個參數賦值,如果傳遞成功
就讓這中間層給這個變量回傳一值,然後判断這個返回值.試試看.
 
1、登记每个client的ip和sockethandle等属性,还有执行的步骤,这样可以识别是哪个
client和应该干什么。
2、保持不断的连接,这样在server端可以很容易判断到各个client和应该干什么了。
3、用多线程,每个线程管理一个client
 
to chenxz:
我可能没有说清楚,是没有特定服务器的。每台机器既是服务器,又是客户机。
关键在于本机的状态:比如 A 向其他机询问,则 A 认为是客户;而同时 C 又
可以向 A 询问,则 A 又变为服务器。为简单和正确的保证,我采用单线程模式,
即 A 机发出询问,即作为客户方时,在一定时间内将关闭服务而等待回复;超时
后或接收到反馈后再恢复侦听状态。我想知道这是不是有可能?预想的一个问题
就是:在 A 机等待中,是否会造成 C 对 A 的连接延时?

我在处理中,用了一个 ReqFeedBack 及 LastSendAddr 标志。当发出新消息时,
置 ReqFeedBack,这样在 OnSocketRead 中就可以根据 ReqFeedBack 判断该条消
息是新消息还是反馈消息;如果是新消息,则进行消息的本机处理,如果是反馈,
则直接可以返回给应用(用 WM_COPYDATA 返回,预先记录了一个应用的 hWnd)。
在两台机器的测试中, 是完全正常的,但就是发现了 Connect 的连接等待问题,
因此采用了一个 hWnd 记录连接反馈窗口句柄,当 Connect 连接成功, 则向 hWnd
发成功消息,此时应用可以在此消息处理中 SendMsg,而在 WM_COPYDATA 中接受
反馈。你们看, 这样有没有问题?可能会有什么隐患?
 
懒得麻烦,用广播就行了
 
1、如果是用控件,肯定不会造成阻塞延时的。
2、每个机器既是server又是client,为了简单化,在一个事务通信时,不要两个模式都
用到,如:a机向b机发出查询,即clienta->serverb,serverb返回结果是serverb->clienta。
这种情况下就不要涉及到servera和clientb,这样的话我上面所说的方式还是又用的。
 
看看 TCP UDP 协议的区别 
就自然清楚了
 
对发出的每一个消息增加一个唯一的ID不就行乐
 
多人接受答案了。
 
后退
顶部