关于SOCKET收发的问题(使用的是完成端口) ( 积分: 100 )

  • 主题发起人 主题发起人 appfirst
  • 开始时间 开始时间
A

appfirst

Unregistered / Unconfirmed
GUEST, unregistred user!
简单的说就是发送的数据包尺寸与接收的数据包尺寸不同,但如果这样一来我就无法处理数据了因为发送端在实际应用中是要做成完成端口方式发送的也就是说发送的顺序可能与接收的顺序不同,如果不能保证客户端发送的一个包到接收段仍是一个包的话,那可怎么处理?

我使用的是完成端口啊,假设客户端发送一个包,到服务端接收为两个包,服务端的工作线程为4个,那么系统能保证服务端接收的两个包都被一个工作线程顺序处理吗?
 
简单的说就是发送的数据包尺寸与接收的数据包尺寸不同,但如果这样一来我就无法处理数据了因为发送端在实际应用中是要做成完成端口方式发送的也就是说发送的顺序可能与接收的顺序不同,如果不能保证客户端发送的一个包到接收段仍是一个包的话,那可怎么处理?

我使用的是完成端口啊,假设客户端发送一个包,到服务端接收为两个包,服务端的工作线程为4个,那么系统能保证服务端接收的两个包都被一个工作线程顺序处理吗?
 
socket是流式的,即通信的单位是字节,而不是数据包。
即:1000字节发出之后,接收方有可能一次接收完,也可能1000次接收完。
至于何时接收完,何时算作一个包的发送完毕,完全取决于应用层的协议。最简单的做法是在数据包头部加入四个字节,表述本包的长度。
在服务器端,正确的做法是对每个客户端建立一个线程,处理不同的客户端。由于各个socket连接的handle是不同的,所以绝对不会搞混。
或者针对一个客户端启动两个线程,一个接收,一个发送,就更理想呢。
如果你想以数据包方式发送和接收,只有用java了,它支持对象的持续化。
c++和delphi是不支持的。
 
可是我是使用CPU个数*2+2个线程处理所有的客户端请求,客户端可能有成千上万个.不可能为每个客户端建立单独的线程处理,而且我现在也是使用包头的方式发送,但对于一个客户包到服务端可能被多个线程处理的问题就是个问题了,我可以使用同步处理,但我认为不是一个理想的方案,所以征求大家的解决方案.谢谢各位的参与!
 
呵呵,还没搞清楚啊
 
多人接受答案了。
 
后退
顶部