一个异步socket的问题

jincaomao 2011-02-10 03:33:52
BeginAccept(AsyncCallback, Object)

其中

BeginAccept(Int32, AsyncCallback, Object)

msdn:开始异步操作以接受传入的连接尝试并接收客户端应用程序发送的第一个数据块。

问题1:这第一个数据块有什么用? 和连接以后去Recive有区别吗?


我一直想优雅的解决一个问题没有好办法,不知道是否和 数据块这个参数有关。

问题2:我想让客户连接以后马上发给服务器验证信息,如果不是许可的客户,则把这个客户断掉。

我当前采用的办法是用一个Timer, 如果客户端连接以后几秒钟内没有发验证信息,则不是我的认证客户端,我把他断掉。 这样可以提高服务器端的性能, 但是这样的做法代码很乱,也不优雅,是否有更好的办法?
...全文
99 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
大飞飞虫 2011-02-10
  • 打赏
  • 举报
回复
BeginAccept接受到第一个数据块后,AsyncCallback会被调用。
也就是说,如果要进行超时检测,比较‘优雅’的方式是,
0,编写AsyncCallback对应的方法aaa
1,调用BeginAccept
-------------------------------------
2,随后aaa会自动被调用,在第一次aaa被调用时启动你的定时器开始超时记录(如果有并发的,你可能要为每一个连接ID设置一个TIMER)
3,当定时器tick触发后,检测室哪个连接的,拒绝他即可
4,如果某连接成功得到验证码,那么立即停止其对应的定时器

以上结构其实看起来复杂,但是并非会乱。(异步的东西或多或少都会有点乱)
你非常有必要做一个结构,来管理你的每个连接还有对应的超时定时器
jincaomao 2011-02-10
  • 打赏
  • 举报
回复
另外我是在一个学校教学, 让新接触socket的学生一次性理解东西太多不容易,所以就是能简化就简化,让程序结构不要太复杂,这样学生的思路更清晰。所以希望能更简洁一些。
jincaomao 2011-02-10
  • 打赏
  • 举报
回复
谢谢楼上的回答,看来这个“数据块”和我设想的功能一样,谢谢了,验证一下。

那其实和我在recive里面接是一样的,并且如果在AsyncCallback里面去验证也有不好的地方,就是客户的连接会被挂起,等待验证。

如果有人做破坏程序,发了大量的连接请求,但是不发验证数据,这样就会造成大量的挂起,直到服务器没法接收新的连接。

再等等,看是否有更好的解决。 谢谢楼上的两位朋友。

110,536

社区成员

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

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

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