读书人

winsock网络程序怎么提高传输速率

发布时间: 2013-01-28 11:49:56 作者: rapoo

winsock网络程序如何提高传输速率?
本帖最后由 oyljerry 于 2013-01-20 17:40:54 编辑 俺在做网络编程相关的项目。碰到了很多问题,来向各位前辈请教。俺是刚学编程的小白一个,所以有些低级问题,各位不要见笑。

程序实现一个server端向多个client端传送大量样本点(样本点可能有几千或者上万个,每个样本点为double型)。我用的是VC++6.0,是在MFC框架下用CAsyncSocket类来实现的。现在可以传数据了。但是传输速率感觉很慢。
问题一:怎么测这些样本点的传输速率?怎么测传输延时?使用工具还是写代码还是这些功能已经集成在开发环境中了?
问题二:如果传输速度比较慢,如何实现Server和Clinet间的高速传输?
问题三:每次往套接口发送一个double型数据,但用wireshark抓包看到data只有1个或者2个字节或者7个字节,为什么?
下面是发送端server的发送数据代码段:


while(!feof(stream))
{
count=fread(&data,sizeof(double),1,stream);
//设置发送缓冲区大小
if(getsockopt(sendSockets[idx-1],SOL_SOCKET,SO_SNDBUF, (char*)&SndBuf,&SndBufSize)!=SOCKET_ERROR)
{
if(SndBuf<1024)
SndBuf=1024;
setsockopt(sendSockets[idx-1],SOL_SOCKET,SO_SNDBUF,(char*)&SndBuf,SndBufSize);
}
//逐点发送信号
WaitForSingleObject(hMessageSend[idx-1],20);
if((SOCKET_ERROR==sendSockets[idx-1].Send(&data,count)))
{
NumError=GetLastError();
}
}



[解决办法]
问题三:

if((SOCKET_ERROR==sendSockets[idx-1].Send(&data,count))) 错误!

应改为:
Send( &data, count * sizeof(double) ) //第二个参数为发送字节数。

fread这个函数返回的是个数,而不是字节数。
[解决办法]
问题二:

如果想提高发送效率,应该组成大包再发送。

第一步:
BYTE* pBuf = new BYTE [ 5 * 1024 * 1024 ]; //开辟个足够大的内存。如:5MB。

第二步:
把流中的数据一次性拷贝到这块内存中。并得到实际占用的内存大小nRealSize。
这里nRealSize单位为字节。

第三步:
Send( pBuf, nRealSize );
[解决办法]
传输速率感觉很慢。

除了其他优化方法外,压缩要发送的数据,可能会大幅提高效率
[解决办法]
将要发送的数据比如几千个点一起打包,然后用zlib压缩库压缩后发送。
还要讲negle特性禁用掉。
[解决办法]
你要速率快,有要实时,其实你可以弄个折中方案。
因为tcp会把你的小包组成大包发送的。所以一次尽量多发送点。

[解决办法]
除了楼上提到了这些方法外,Win API 中有一个直接发送文件的函数,可以减少内核切换。
[解决办法]
引用:
除了楼上提到了这些方法外,Win API 中有一个直接发送文件的函数,可以减少内核切换。

哪个函数是传文件函数?传送大文件行吗,比如1G、2G、3G

读书人网 >VC/MFC

热点推荐