我写了一个Server端程式(VC/MFC)。另一个同事写了Client端程式(delphi)
还有其他的程式向Server做连接并索取数据是短连接(先connect 做完动作后close掉连接)
Server端的作法:
CServer从CAsyncSocket继承
在OnAccept(...)创建一个CClient对象(从CAsyncSocket继承)并将其保存于List中。
当Client发送数据到Server端CClient::OnReceive就会被触发。然后通过该socket对象
返回数据给Client端
当Client端断开连接的时候会触发CClient::OnClose()在其中将该对象从队列中删除
Server端采用异步处理
问题:
1,Server段这样的处理模式是否有问题 (个人觉得没有什么问题)
2,是否应该在OnClose中调用Shutdown及Close方法
3,现在Client端的程式是用Delphi写的他采用是一种同步的方式来处理步骤如下:
3.1 SEND 数据1
3.2 Recv 数据2 (阻塞在这里直到收到数据)
3.3 Recv 数据3
现在的问题是Run一段时间Client端收到的数据发生错位该收到数据2的时候结果收到的是其他的数据
后面的数据就都跟着错位。
我想知道是否是client程式的处理问题还是server端的模式有问题。(我并没有采用多线程/而采用异步我觉得这样处理比较稳妥)
还有其他的程式向Server做连接并索取数据是短连接(先connect 做完动作后close掉连接)
Server端的作法:
CServer从CAsyncSocket继承
在OnAccept(...)创建一个CClient对象(从CAsyncSocket继承)并将其保存于List中。
当Client发送数据到Server端CClient::OnReceive就会被触发。然后通过该socket对象
返回数据给Client端
当Client端断开连接的时候会触发CClient::OnClose()在其中将该对象从队列中删除
Server端采用异步处理
问题:
1,Server段这样的处理模式是否有问题 (个人觉得没有什么问题)
2,是否应该在OnClose中调用Shutdown及Close方法
3,现在Client端的程式是用Delphi写的他采用是一种同步的方式来处理步骤如下:
3.1 SEND 数据1
3.2 Recv 数据2 (阻塞在这里直到收到数据)
3.3 Recv 数据3
现在的问题是Run一段时间Client端收到的数据发生错位该收到数据2的时候结果收到的是其他的数据
后面的数据就都跟着错位。
我想知道是否是client程式的处理问题还是server端的模式有问题。(我并没有采用多线程/而采用异步我觉得这样处理比较稳妥)
1.服务器这样处理问题不大,MFC的socket类做服务器不好,建议使用api+select
2.closesocket()需要,shutdown()看情况
3.楼主的问题出在这里了
服务器采用异步模式,当收到客户端数据时,肯定回应了两个包吧,这里大多情况下会粘包,既使是同步模式,如果一次发包太小或两次发包间隔小于50ms,也会发生粘包。
如果发生了粘包情况,client就只能recv到一次了,下一次recv自然而然就是错包了。
我比较喜欢用CAsyncsocket的class,api+select还没有使用过,既然说MFC的socket类做的不够好请指出缺点.谢谢
不同的集成开发环境的默认编译链接参数不同的
请提供解决的办法.谢谢
必须自己做包头分析处理,判断每个包的起止位置。socket只负责把缓冲按顺序传递,就没有分段的概念。