请求完成端口的完整例子,谢谢!!!(100分)

  • 主题发起人 主题发起人 quida
  • 开始时间 开始时间
请问 桦树皮: 在主页哪里啊?我找不到啊?
 
to copy_paste:
发现一个BUG,如果在TServerClientSocket.Create中调用PrepareRecv没有让WSARecv
进入ERROR_IO_PENDING状态,那么以后的数据就都收不到了。

试验:在WSARecv这一句加断点;Client连接并发送;wait5秒;执行断点;那么以后的数据就都收不到了
 
mywyn
这都找出来了,呵
那例子N久没动它,只是以前为了了解IOCP的结构做的,现在都不知拿它来做什么,呵呵,本来还想优化其中的东西,不过现在提不起劲了,:D

楼主
那代码我已经尽量用标准方式写了,如果需要什么详细的说明,你只能找些资料看了。:)
 
to copy_paste:
我感觉第一次的WSARecv有一种向完成端口注册lpOverlapped数据结构的功能,并且起到了类似WSAASyncSelect(Fd_read)的作用。如果在以后的接收数据过程中再次进入ERROR_IO_PENDING状态,应该算是重新注册。这个例子澄清了很多模糊的概念,我以前一直以为:数据收完后WSARecv应该再次进入ERROR_IO_PENDING状态。

再次谢谢copy_paste的无私奉献,我查找了MSDN,可用的东西基本没有,可见这项技术M$也是遮遮掩掩的。

to quida:
copy_paste这个例子结构非常清晰,你把这个例子读懂了,完成端口也理解的差不多了。

 
to mywyn:
WSARecv起注册功能?不会吧,你把偶说糊涂了......
我觉得WSARecv与Recv要实现的功能是一样的,只不过是同步异步的不同而已,它们的目的相同,只是实现方法不一样。
WSARecv调用结束后,必须再次调用WSARecv才能接收数据(这跟Recv也是一样的)。
lpOverlapped参数都是系统在调用,我们都不能改变的,我们仅仅在使用它的地址。

copy_paste的例子我没仔细看,跟softdog的有什么不同吗?
 
to copy_paste:
你好!如果你把它优化了,制成完整的控件,你想多少报酬?
to mywyn:
感谢你的提点!如有时间我会尽力去研究的。
 
代码了可以看VC的代码,其实转换成DELPHI的代码也很容易。
最近我总算完成了完成端口服务器的测试,
我是2台机器每个机器开500个连接测试,简单的模拟1000并发连接。
我的测试Client是连续发送请求,压力相当大,基本上服务器的压力
接近7~8m/s,这个时候CPU占用也相当大,高达90%以上,但是整个系
统很稳定,对客户Client的响应很快,一会就处理了100万个请求。
 
to ego:
WSARecv与Recv在步骤上确实是没什么不同,不过如果Recv要想异步运行就必须配合其他函数,如用WSAASyncSelect(Fd_read)向系统注册。而WSARecv一个函数就可以完成上述功能。
lpOverlapped是系统在用,不过他是你调用WSARecv传过去的。
所以我说起WSARecv起注册功能,也许我的意思没讲明白,让你误解了。

to quida:
如果你想研究,copy_paste的例子足矣;如果你想用于商业应用,可以到:
http://www.playicq.com/dispdoc.php?id=2062下载。有说明,不过核心部分是DCU文件。
作者解决了双CPU的读写问题。







 
我的测试服务器程序在4CPU的机器上运行也没见有什么问题,不知道多CPU读写和单
CPU读写有什么区别。
 
张无忌,你的测试是不是1000个客户端不间断地同时向服务器发送数据包,然后服务器收到数据包后,对数据包进行业务处理后,再转发给相应的客户端?
我的完成端口例子也写完了(呵呵,当然,偶的例子太简单,基本上只是用来玩玩),但不知道怎样进行压力测试,服务器才算真正成功。
 
to mywyn:
谢谢你!你提供的那个服务器很好,可惜他不提供源代码,有些功能不能满足我的要求,我却改不了。
to 张无忌:
你好!感谢你的答复!你的源代码可以给我吗?如果你可以制成一个完善的控件的话,请你开个价,具体功能再商量好吗?
 
后退
顶部