阅读:2947回复:28
有谁对Socket编程熟啊,请教。
这几天忙着为公司的数码相机添加网络可视功能。用Socket通过局域网传输数据。主机开端口,客户机发数据,发现一秒钟只能发4帧左右数据(640*480,大概40KB一帧),主要是因为客户机在Send之后不能得到主机已经接受完成可以开始下一次发送的通知,只有Sleep一段时间,不知有没有好的方法呢?
还有10M/100M网卡速度是指什么速度?为什么发40K数据客户机要等待300多毫秒? 谢谢啊。 :) (这里放的分是鼓励回帖的,回答技术问题另外给专家分。) |
|
最新喜欢:![]()
|
沙发#
发布于:2002-10-24 13:16
这几天忙着为公司的数码相机添加网络可视功能。用Socket通过局域网传输数据。主机开端口,客户机发数据,发现一秒钟只能发4帧左右数据(640*480,大概40KB一帧),主要是因为客户机在Send之后不能得到主机已经接受完成可以开始下一次发送的通知,只有Sleep一段时间,不知有没有好的方法呢? 回答一部分: 10M/100M指每秒钟传送10M/100M BIT数据,包含包头、帧头数据,所以对于不同大小的数据包的传输速率是不同的。 |
|
|
板凳#
发布于:2002-10-24 13:25
10M/100M指每秒钟传送10M/100M BIT数据,包含包头、帧头数据,所以对于不同大小的数据包的传输速率是不同的。 多谢。那去掉包头、帧头后平均速度一般是多少呢?根据什么来分别是10M还是100M呢? |
|
|
地板#
发布于:2002-10-24 13:39
为什么send后不能接收响应?主机应该发确认啊 :mad: :mad: :mad:
|
|
|
地下室#
发布于:2002-10-24 13:41
你用的是什么方式?在100M里面我用Echorsvr测试过,双向可以每秒钟10多MByte,单项也可以7,8MByte/s,所以我觉得不管是10M还是100M,每秒钟传输40K*4应该是算法有问题。
|
|
5楼#
发布于:2002-10-24 13:43
如果你用的是TCP的话,为什么要Sleep才知道对方接受了?
如果是UDP的话,你可能需要做类似于tftp类似的简单协议来确认。 |
|
6楼#
发布于:2002-10-24 13:46
还有,你的显示和接收数据是不是在同一个线程里面做的?建议改成多线程试试。
|
|
7楼#
发布于:2002-10-24 14:25
[quote] 10M/100M指每秒钟传送10M/100M BIT数据,包含包头、帧头数据,所以对于不同大小的数据包的传输速率是不同的。 多谢。那去掉包头、帧头后平均速度一般是多少呢?根据什么来分别是10M还是100M呢? [/quote] 1.通常图像传输采取小包传输,因为网络传输存在丢包可能。相对来说,局域网可靠性高一些,时延较小;广域网则…… 2.平均速度依分包大小不同传输速度天差地别,没有一般值。想测试的话,写一个udp收发程序计算一下就知道。不过tcp传输效率会低一些。 建议到网络上搜索一下相关资料,注意网络传输会有丢包的可能 :D 要出去干活了,不能多说 ;) |
|
|
8楼#
发布于:2002-10-24 14:58
为什么send后不能接收响应?主机应该发确认啊 :mad: :mad: :mad: 用什么函数发回确认?还是自己定义回传数据表示接收完毕? |
|
|
9楼#
发布于:2002-10-24 15:03
你用的是什么方式?在100M里面我用Echorsvr测试过,双向可以每秒钟10多MByte,单项也可以7,8MByte/s,所以我觉得不管是10M还是100M,每秒钟传输40K*4应该是算法有问题。 我直接用MFC的CSocket类,用OnReceive响应客户机数据到达,然后调用Receive接收,没有什么别的算法了。是不是客户机将数据分成小包比如1kB一次快?我现在客户机一次发一帧图象40多KB。 |
|
|
10楼#
发布于:2002-10-24 15:03
[quote]为什么send后不能接收响应?主机应该发确认啊 :mad: :mad: :mad: 用什么函数发回确认?还是自己定义回传数据表示接收完毕? [/quote] TCP自己确认了,OS缓存你要发的数据,所以只要缓存容量够,你就能拼命发,不管它收到无。 如果是UDP,你自己确认的了。 |
|
|
11楼#
发布于:2002-10-24 15:04
如果你用的是TCP的话,为什么要Sleep才知道对方接受了? UDP和tftp是什么?不懂。我直接用CSocket类,应该是TCP吧? :D |
|
|
12楼#
发布于:2002-10-24 15:06
还有,你的显示和接收数据是不是在同一个线程里面做的?建议改成多线程试试。 接收和显示是不同的线程的。 |
|
|
13楼#
发布于:2002-10-24 15:54
还是自己用socket API吧,MFC的效率不敢肯定。
|
|
14楼#
发布于:2002-10-24 18:00
1,首先不要用MFC的API
2,改变Socket接收和发送缓冲区的大小,如改为20K。 3,Send函数可以一直发送,不必接收对端的响应。 4,如果需要类似源码,我可以提供。 |
|
|
15楼#
发布于:2002-10-24 18:31
[quote]如果你用的是TCP的话,为什么要Sleep才知道对方接受了? UDP和tftp是什么?不懂。我直接用CSocket类,应该是TCP吧? :D [/quote] faint ,TCP如果连接没断开肯定传输没问题,UDP可以通过连续发几次同样的包确保对方能收到(当然要给个序号,同一个序号表示内容相同的重复包) |
|
|
16楼#
发布于:2002-10-25 08:30
1,首先不要用MFC的API 非常感谢。我昨天试了一下直接用socket API速度确实很快,正在调试,如果搞不定的话再向你请教。 :) |
|
|
17楼#
发布于:2002-10-25 09:51
果然是socket API速度快。现在客户机采集的数据基本全部发到了主机而且不用等待,单路显示做完了,速度非常好,还要做多路的。谢谢大家。
我准备到开发工具使用版开一个帖子,给各位专家分,每人20分。再次感谢! |
|
|
18楼#
发布于:2002-10-25 10:09
果然是socket API速度快。现在客户机采集的数据基本全部发到了主机而且不用等待,单路显示做完了,速度非常好,还要做多路的。谢谢大家。 哦,专家分一定要啊。 |
|
19楼#
发布于:2002-10-25 10:13
[quote]果然是socket API速度快。现在客户机采集的数据基本全部发到了主机而且不用等待,单路显示做完了,速度非常好,还要做多路的。谢谢大家。 哦,专家分一定要啊。 [/quote] 当然,我现在就指着专家分活着呢 :mad: :mad: :mad: |
|
|
上一页
下一页