大侠:关于TServerSocket的一个小问题(50分)

  • 主题发起人 主题发起人 tomyang
  • 开始时间 开始时间
T

tomyang

Unregistered / Unconfirmed
GUEST, unregistred user!
大家好!
在编程的过程中我希望能够实现ClientSocket每发出一个Socket,ServerSocket就有一个响应的事件。
ServerSocket的ServerType是nonblocking,经常出现ServerSocket接受socket是ClientSocket
两次甚至更多次发出的Socket累加在一起。
修改ServerType 为nonblocking后,类似问题虽然不是那么的频繁,但是还有。
大侠能否帮助我得到想要的结果呢?

本人对Socket编程的基础知识不是很好,希望有高手能给我补一课讲讲threadblock和
nonblock的区别。
 
你可以采用以下方式
1. 客户端向服务器发包
2. 服务器收到包后进行处理
3. 服务器将处理结果返回
4. 客户端收到返回结果后再进行第二次发包
 
to Dlp:
你的方法虽然是Client一个包,Server一个事件。但是效率太低了。我需要的是Client不断
的发包,Server不断的接收。接收到后在线程中处理,处理完毕后在线程中将结果返回Client
。如果用你的方法的话,效率恐怕实在太低了。
 
请将ClientSocket的ClientType设成ctblocking。
也可能你的包的大小超过了1M.
 
to shangjintong :
ClientSocket的ClientType 好象和ServerSocket的接收方式没有关系。如果有关系,你能
详细的说说吗?我发的包都是文本,不大不到1k。
 
哈哈,tomyang朋友,你也遇到了我以前的问题。
我的答案可能会让你失望,但事实就是如此。TCP是一个可靠的<b>管道</b>,完全有
可能你两次发送的数据在被一次接收,TCP不给你加结束符号。

即你发送"1234567"和"ABCDEF",接收端收到是"1234567ABCD"和"EF"。

我的办法是客户端在发送报文时都添加结束符号(如'/n'),接收端定义一个全局数组
(如buf : array[0..1023] of char),
然后每次都按照固定缓冲大小(如1024)从TCP管道中取出数据,检查次缓冲中的结束
符号,截取合法的报文进行处理,然后将剩下的“残缺”保文保存到全局数组中,下
一次接收下来的报文先同Buf拼接,在重复上述操作。
 
to 吕雪松:
听了老兄的话,虽然有些遗憾,但是还是非常的感激,不用我再瞎试验了。
实际上昨天登出此贴的时候我已经将我的程序改为Threadblocking,但是仍然是此结果,当
时我已经不抱太大的希望,今天刚刚被吕兄宣判死刑。
还好我先有准备,吕兄的方法,现在已经实现的。跟我以前写的读串口程序的处理方法一样。
谢谢吕兄!区区100分请吕兄笑纳。
 
吕兄:
不好意思,看来仅有50分
 
后退
顶部