CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
不看会后悔的Windows XP之经验谈 简单快捷DIY实用家庭影院
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  VC/MFC >  网络编程

快要急疯了,各位大侠快来帮帮忙,大放分!

楼主jjiaming(阿熊)2005-08-04 14:42:04 在 VC/MFC / 网络编程 提问

小弟现在在做一个小项目,现在在做网络部分,有几个问题不知道怎么解决:  
  1、一个数据发送的最大字节数是多少。  
  2、局域网   内有20台左右的机器(客户端),一次传送的数据最大量有30多K,服务器端每秒向所有客户端发送几个字节的数据,而客户端会不定时地向服务器端查询数据库。像这种情况,是用CAyncSocket还是CSocket?要不要用多线程?是用阻塞模式还是非阻塞模式。我现在的做法是,当服务端Accept时,就新建一个CAyncSocket对象,并放入一个队列中,服务器要发送数据时就直接从队列中取出相应的CAyncSocket对象指针,然后Send,不知道可不可行  
  3、我上网查了一下,说是有时多个数据包是放在一起发送的,也就是说服务器(或是客户端)多次发送的数据很可能只触发一次OnReceive,而且收到的可能不是完整的包数。  
  项目只有几天就要交付使用了,急得快要发疯了,分绝对不是问题,小弟还有一千多分。大家帮帮忙,不要让这个帖子沉下去。拜托了。解决了立即给分 问题点数:100、回复次数:13Top

1 楼dirdirdir3(风)回复于 2005-08-04 15:00:53 得分 15

1.大概8k吧,一次。  
  2。可以。  
  3。的确是这样,要自己订立一个协议来接收包,否则用UDP也可以。Top

2 楼jjiaming(阿熊)回复于 2005-08-04 15:16:54 得分 0

用udp可靠吗Top

3 楼happyparrot(快乐鹦鹉)回复于 2005-08-04 15:23:10 得分 15

用UDP不可靠。这是肯定的Top

4 楼jjiaming(阿熊)回复于 2005-08-04 15:30:58 得分 0

那是不是需要用多线程来替换OnReceive 啊Top

5 楼hyamw(林锋)回复于 2005-08-04 15:58:25 得分 20

偶曾经做过一个跟你说的类似的:不过稳定性没有经过彻底的测试。有问题大家讨论一下。  
  首先给accept的时候每个客户端都建立一个缓冲区。  
  如果recv到数据,则添加到缓冲区末尾。然后检查缓冲区中收到的数据。数据包应该有自己定义的格式:  
   
  数据包头标志|数据包长度|数据包内容|数据包尾标志  
   
  以上只是个例子,首先第一个应该是包头标志,如果不是,丢弃数据。然后根据数据包长度检查数据包尾标志,如果缓冲区的总数据长度小于数据包长度,则表示数据包接收还不完整;如果大于等于数据包长度,则查看包尾的位置是否为数据包尾标志,如果不符合,表示数据包有问题。你还可以加上其他的校验手段。  
  如果检查到有完整的数据包收到,进行相应的处理,并把数据包从缓冲区中删除。(剩下的数据不要删除哦,有可能是下一个包的数据)。缓冲区可以用队列来做  
   
  不过有个问题就是,服务器端需要给每个客户端都建立一个缓冲区,如果客户端数据太多的话,问题就大了。再有就是缓冲区大小的到底取多少。  
  对于你的需要来说,20个客户端,应该不是大问题。传输数据的最大量为30K的话,缓冲区取60K+就可以了。Top

6 楼jjiaming(阿熊)回复于 2005-08-04 16:13:53 得分 0

哦,这样啊。这下心里有底了  
  Top

7 楼fisker0303(天塌了,地陷了,小花狗不见了.)回复于 2005-08-04 17:24:12 得分 15

UDP的话,一个包最好限制在0.5K。Top

8 楼jjiaming(阿熊)回复于 2005-08-04 18:21:10 得分 0

to   hyamw(林锋)   :  
  如果正在进行数据的转换与处理,而这个时间正好Recevice事件又被触发了,那岂不是冲突了,这种可能性也不是没有啊Top

9 楼dirdirdir3(风)回复于 2005-08-04 19:43:46 得分 10

不会,你进行数据的转换与处理中是不可能触发Receive事件的,只要是同一个线程。Top

10 楼jjiaming(阿熊)回复于 2005-08-04 20:48:28 得分 0

哦,这样就好了,我一直担心这种事发生呢Top

11 楼jjiaming(阿熊)回复于 2005-08-04 23:01:08 得分 0

to   hyamw(林锋)   :  
  我觉得你的办法可以改进一下。可以改为建立两个缓冲区a   和b,缓冲区a存放非完整的数据包,缓冲区a存放完整的数据包,首先将收到的数据放入缓冲区b   内,然后拼合缓冲区ab   并读取其完整的数据包,再将b内不完整的数据包放入a内。说起来似乎更麻烦,但我觉得这样做好像容易实现点  
  Top

12 楼younggle(洋溢)回复于 2005-08-05 00:25:37 得分 15

参考一下这个,源代码可以直接使用了。  
  http://www.vczx.com/article/show.php?id=1041Top

13 楼hyamw(林锋)回复于 2005-08-05 08:46:41 得分 10

你使用多线程同步就没问题了,不过效率会降低一些(尤其是多个用户同时跟服务器通讯的时候)。Top

相关问题

  • 各位,小弟会急疯了。。。。
  • 请问这是什么错误啊!我快要急疯了。
  • ~~~~~~~~~~~~~~~~~~~~~~~~~~我快要疯了!~~~~~~~~~~~~~~~~~~~~~
  • 各位急救!
  • 各位大侠,救命啊。我要急疯了!
  • 急!!!!!有关CInternetSession::OpenURL异常的问题,快要把我逼疯了!
  • 各位高手请时!ADO的怪事!我怎么老是见到怪事呀!?!救救我啊!!!!!!我快要疯了!!!!
  • 急急急~~~!!!各位老大!!半个月了!!TOMCAT快把我搞疯了啊!!!!!!!!!
  • WSE快要我疯掉了!!!
  • 请教各位!!急!

关键词

  • 数据
  • 服务器
  • 客户
  • 多线程
  • 数据包
  • 缓冲区
  • cayncsocket
  • 客户端
  • 完整
  • 长度

得分解答快速导航

  • 帖主:jjiaming
  • dirdirdir3
  • happyparrot
  • hyamw
  • fisker0303
  • dirdirdir3
  • younggle
  • hyamw

相关链接

  • Visual C++类图书
  • Visual C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo