[网络编程]-请教关于Socket.BeginReceive的正确用法!?

marshhj 2014-11-18 03:18:30
最近在实现一个简易的网关服务器,首先尝试着用FlyTCP来实现。碰到了一些疑惑。

TcpSvr中,accept到客户端之后,调用 BeginReceive(buffer,....);
他这里用到的buffer是通用的(每个监听并接受的客户端都用这个buffer来receive)。
但是我当初理解的是,这个是异步多线程的,得每个客户端分配一个buffer。
网上看到有些文章确实是一个客户端分配一个buffer。

问题来了:
1.那FlyTCP这里面意思是不是,某一瞬间只可能收到一玩家的消息?而后面其他玩家的消息要排队?
2.又或者是这个FlyTCP的实现有问题?
...全文
3092 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
并发测试时,要注意随机产生100k字节的测试数据去发送,然后确定服务器返回的值。如果用固定的数据去测试,那么服务器端“张冠李戴了”可能也不能迅发现。 软件的质量,在于测试。编写程序的目的不过是为了通过测试(并不是完成需求),而设计测试用例才是真正能够面向需求的。
layershow 2014-11-19
  • 打赏
  • 举报
回复
2 实现有问题
  • 打赏
  • 举报
回复
写出共享 buffer 的代码,可能是因为急于弄一个演示,缺少一定强度的“并发”测试的结果。先写个测试程序,创建客户端连接并且发送一定量(比如说100k大小)的消息,然后读取服务器返回值验证结果是否正确。然后,你的测试程序只要是并发(比如说20个线程)去循环执行测试程序(比如说每一个线程中都把测试用例执行10遍),瞬间就能发现并发错误。 另外,应用程序的 buffer 的大小不等于底层windows网络驱动的缓冲池。底层是1000字节多一点大小(不到1024字节),不代表着应用层也应该这么大。应用程序中应该设置为差不多100万字节,才能保证通讯比较快。
showjim 2014-11-19
  • 打赏
  • 举报
回复
有的系统对并发要求不高,可以用串行的模式处理,但是要在程序逻辑上保证它是串行的,就可以只用一个buffer。
showjim 2014-11-19
  • 打赏
  • 举报
回复
除非没有并发BeginReceive,必须一个客户端分配一个buffer,但不是每次BeginReceive一个buffer。
by_封爱 版主 2014-11-19
  • 打赏
  • 举报
回复
正常来说 一个全局的buffer就够了 下面的 我个人认为没什么必要.. 仅仅代表个人观点..
marshhj 2014-11-19
  • 打赏
  • 举报
回复
引用 3 楼 diaodiaop 的回复:
buffer是缓冲区.... http://www.cnblogs.com/chenxizhang/archive/2011/09/10/2172994.html 建议LZ看下这个文章..能深入的理解socket异步的东西.. 另外 FlyTcp是什么?别人封装的DLL么? 我没有听过 不过既然封装了 你应该看不到BeginReceive这样的代码. 只能看到3个方法.. 连接 发送 断开
你好,文章我看了,你发的文章就是我说的FlyTcp的用法。FlyTcp 是网上别人发的轻巧的开源的Tcp库。

     //这里的buffer是成员变量,每次Accept一个客户端的时候,都用这同一个buffer传到BeginReceive
     client.BeginReceive(buffer,0,buffer.Length,SocketFlags.None,new AsyncCallback(ReceiveMessage),client);
还有网上看到的另外一种

     //这是每次都new 一个。 如果上面那种可以用的话,那下面这种每个都new 是不是有点多余了!?
     buffer = new byte[1024];
     client.BeginReceive(buffer,0,buffer.Length,SocketFlags.None,new AsyncCallback(ReceiveMessage),client);
by_封爱 版主 2014-11-18
  • 打赏
  • 举报
回复
buffer是缓冲区....

http://www.cnblogs.com/chenxizhang/archive/2011/09/10/2172994.html

建议LZ看下这个文章..能深入的理解socket异步的东西..

另外 FlyTcp是什么?别人封装的DLL么? 我没有听过

不过既然封装了 你应该看不到BeginReceive这样的代码.

只能看到3个方法..

连接

发送

断开

marshhj 2014-11-18
  • 打赏
  • 举报
回复
引用 1 楼 hefeng_aspnet 的回复:
http://www.csharpwin.com/csharpspace/13263r8436.shtml
这篇文章我也看过,是每次BeginReceive的时候new 一个buffer。那样的话,FlyTcp的代码是不是有问题呢? 怎样可以测试出他这种共用buffer的方法有问题呢?

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧