我写了一个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端的模式有问题。(我并没有采用多线程/而采用异步我觉得这样处理比较稳妥)

解决方案 »

  1.   

    服务器端还是用多线程吧。看看《windows核心编程》的线程池那一章,有帮助的。
      

  2.   

    我也覺得不用多線程,因為我自己用VC寫了一個testtool是不會有這樣的問題的.所以我認為是client端的程式處理上有問題.誰還有更好的想法說出來看看
      

  3.   

    我觉得还是用多线程比较稳妥,可以参考一下Peer的源码,他的底层数据传输,就是一个标准socket多线程处理.
      

  4.   

    谁能给我提供一份多线程使用CAsyncSocket class的sample code 提供URL即可 谢谢
      

  5.   

    你做网络通信时,一个问题需要注意,那就是“数据粘连”,也就是,本该“Recv 数据3”收到的,结果“Recv 数据2”就收到了,客户端,服务器都存在这样的问题。解决的方法很简单,就是制定通信协议,根据包的长度来接收数据
      

  6.   

    错位?会不会是delphi和VC对什么数据类型的定义长度有了不一致的地方?
      

  7.   

    回答:
    1.服务器这样处理问题不大,MFC的socket类做服务器不好,建议使用api+select
    2.closesocket()需要,shutdown()看情况
    3.楼主的问题出在这里了
      服务器采用异步模式,当收到客户端数据时,肯定回应了两个包吧,这里大多情况下会粘包,既使是同步模式,如果一次发包太小或两次发包间隔小于50ms,也会发生粘包。
      如果发生了粘包情况,client就只能recv到一次了,下一次recv自然而然就是错包了。
      

  8.   

    首先对JsuFcz()的回答表示感谢,如果我采用sleep(50)就不会出现粘包的现象吗?这个我会动手在测试,谢谢大家,如果谁还有好建议请在提供.
    我比较喜欢用CAsyncsocket的class,api+select还没有使用过,既然说MFC的socket类做的不够好请指出缺点.谢谢
      

  9.   

    有可能是字节对齐的问题,不同的人分别开发server和client的时候要注意,vc默认struct member alignment是8个字节,delphi不知道是多少,协同开发的时候最好约定好同为1。
    不同的集成开发环境的默认编译链接参数不同的
      

  10.   

    TO JsuFcz:
    请提供解决的办法.谢谢
      

  11.   

    永远不要指望socket一次send,对端就有一次recv!
    必须自己做包头分析处理,判断每个包的起止位置。socket只负责把缓冲按顺序传递,就没有分段的概念。