首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

VC中运用SOCKET通信 传输大数据

2012-09-21 
VC中使用SOCKET通信 传输大数据VC中使用SOCKET通信 传输大数据一个大的数据:BigBuff -- 2490K每次使用sock

VC中使用SOCKET通信 传输大数据
VC中使用SOCKET通信 传输大数据

一个大的数据:BigBuff -- 2490K
每次使用socket发送 将数据放到 发送数据包:stSendData ( 其中包含自定义包头,大小已被限制968)中

分多次发送至客户端 。


现在有多个BigBuff ,同时下发客户端 
我使用for循环下发 , 在客户端每次接收stSendData大小的包 ,重组BigBuff
客户端在循环接收完完整的收完一个BigBuff后,
再开始接收下一个。

。。。。。。。。。。。
想问的是 :在10次这样的操作中有4次 客户端会卡住 。
是同时发送数据量大的问题么?

客户端未加入任何检测数据包丢失的机制。 检测该如何检测。
我刚开始学习这一块 请教 一个解决方案。谢谢

[解决办法]
有可能你包发送快了,造成堵塞。这可能产生丢包。
我最近做rtp传输,我看到一般在收数据包前,都会用到fd_set结构体,通过select方式来判断缓冲区是否可用,可用再调用recv()。你可以了解下这方面的东西。
[解决办法]
阻塞啦,,建议用分块传输
[解决办法]
参照一下飞鸽的文件传输,好像用的是内存映射
[解决办法]
应该是接收端慢导致出现零窗口而阻塞了。可以抓包看一下。
[解决办法]
顶4L,肯定是接收端接收的问题,导致的!

建议定义自己的消息包,每次检验消息长度!
[解决办法]

探讨

参照一下飞鸽的文件传输,好像用的是内存映射

[解决办法]
不要服务端一直发,客户端一直收。最好服务端发送一个包, 客户端接受到以后回复一个确认包给服务端,服务端接受到确认包以后再发送下一个包。这样子交互起来才比较顺畅。别说2490K, 我200M的东西都发过。
[解决办法]
建议看看网络通信这本书,阻塞与非阻塞的相同和不同点。
[解决办法]
用分块传输,在数据包前面加个包头。
[解决办法]
自定义写个发送接收,检查发送和接收的结果
发送:直到发送完成或SOCKET出错才返回
BOOL MySend(SOCKET sock, LPVOID lpData, int nSize)
{
 //*自订义数据发送,直到发送完成时才返回
 char* Buf = (char*)lpData;
 int nLen = nSize;
 int n;
 int nIndex = 0;
 while(nLen > 0)
 {
n = send(sock, &Buf[nIndex], nLen, 0);
if(n == SOCKET_ERROR)
return FALSE;
nIndex += n;
nLen -= n;
 }
 return TRUE;
}
//接收:直到接收到指定数量的数据或SOCKET出错才返回
BOOL MyReceive(SOCKET sock, LPVOID lpData, int nSize)
{
 //*自订义数据接收,直到接收到指定大小的数据后才返回
 char* Buf = (char*)lpData;
 int nLen = nSize;
 int n;
 int nIndex = 0;
 while(nLen > 0)
 {
n = recv(sock, &Buf[nIndex], nLen, 0);
if(n == SOCKET_ERROR)
return FALSE;
nIndex += n;
nLen -= n;
 }
 return TRUE;
}

热点排行