int sendCount = 0; // 已经发送的字节数
int left_len = len; // 剩余的字节数
int Times=0; // 发送次数
do{
sendCount = this->Send(sendBuffer + len-left_len, left_len, 0);// CAsyncSocket::Send()
left_len -= sendCount;
}while(left_len > 0)
请问发送大数据包时,比如100M或更大,以上代码在逻辑上好像没问题,但在实际通信中有没有问题呢?
我看到有些代码
在do中添加
Times++;
if(left_len > 0)
::Sleep(200);
在while中控制次数,比如Times<5.
请问这是干什么?
int left_len = len; // 剩余的字节数
int Times=0; // 发送次数
do{
sendCount = this->Send(sendBuffer + len-left_len, left_len, 0);// CAsyncSocket::Send()
left_len -= sendCount;
}while(left_len > 0)
请问发送大数据包时,比如100M或更大,以上代码在逻辑上好像没问题,但在实际通信中有没有问题呢?
我看到有些代码
在do中添加
Times++;
if(left_len > 0)
::Sleep(200);
在while中控制次数,比如Times<5.
请问这是干什么?
解决方案 »
- 如何获取系统安装软件信息?
- 在FormView里加按钮, 怎么点击都没反应啊, 怎么回事?
- 有谁用过MFC9.0中的BS_DEFCOMMANDLINK按钮风格
- 如何用ANSI程序读取UTF8编码的mysql数据库?
- 再发帖,为解决自动点“确定”按钮问题
- 求一个通过动态创建树节点生成的树,保存节点信息到数据库的例子
- 如何验证一用户为一domain内的有效用户?
- 急~~有偿求助,求网络语音会议解决技术
- 怎么程序实现收到其他机器通过net send命令或者netmessagebuffersend函数发过来的消息?
- 请问能否把在CDC中画的矢量图,如一条直线或圆转换成bmp形式??????
- connect()怎连接问题
- 在基于对话框的程序中画图
对方可以慢慢收,但是你没有慢慢发
(1)year2002提到了缓冲区的问题。
Socket默认的缓冲区大小是8KB,请问大数据是不是分批传送?比如要传送100KB的数据过去,代码如下:
int len = 100*1024; // 发送100KB
LPBYTE sendBuffer = new BYTE[len];
int sendCount = 0; // 已经发送的字节数
int left_len = len; // 剩余的字节数
do{
sendCount = this->Send(sendBuffer + len-left_len, left_len, 0);// CAsyncSocket::Send()
left_len -= sendCount;
}while(left_len > 0)
我们知道TCP建立连接之后,如果不断开或者不出现异常,就一直连接。
下面是MSDN上对Send返回值的说明:
If no error occurs, Send returns the total number of characters sent. (Note that this can be less than the number indicated by nBufLen.) Otherwise, a value of SOCKET_ERROR is returned, and a specific error code can be retrieved by calling GetLastError.
WSAENETDOWN The Windows Sockets implementation detected that the network subsystem failed.(Windows套接口实现检测到网络子系统失效)
WSAENOTCONN The socket is not connected.(套接口未被连接)
现假设不断开无异常,请问上面的while循环中,CAsyncSocket::Send是不是前12次发送8KB,第13次发送4KB呢?
“对方可以慢慢收,但是你没有慢慢发”,请问我给while循环中加一个Sleep,是不是就可以慢慢发了?
(2)blackcat242和hsuhuasu都提到要考虑返回错误码情况。
<1>断开,比如接收方突然关闭了应用程序,那么Send返回WSAENOTCONN,然后是不是要break。
<2>没有断开,而出现异常的情况,又要怎么处理呢?比如接收了一部分,然后异常,然后过一会有正常了,后面是不是涉 及到所谓断点续传的问题?请问又该如何处理呢?
你最好是等会,再尝试发送剩下的字节。
LPBYTE sendBuffer = new BYTE[len];
int sendCount = 0; // 已经发送的字节数
int left_len = len; // 剩余的字节数
do{
sendCount = this->Send(sendBuffer + len-left_len, left_len, 0);// CAsyncSocket::Send() if(sendCount != SOCKET_ERROR)
{
left_len -= sendCount;
}
else
{
// 中文显示出错信息
LPVOID lpMsgBuf;
FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER |
FORMAT_MESSAGE_FROM_SYSTEM,
0, GetLastError(),
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // 默认语言
(LPTSTR)&lpMsgBuf, 0, NULL);
// 显示
::MessageBox(0,(LPCTSTR)lpMsgBuf,_T("GetLastError"),MB_OK|MB_ICONINFORMATION );
// 释放内存
::LocalFree( lpMsgBuf );
// 退出while循环
break;
} if(left_len > 0)
::Sleep(200); // 慢发送
}while(left_len > 0)
delete sendBuffer;当然相应我接收端先读取文件长度,然后要做读状态控制。
以上代码中就不加次数控制了,直接以剩余字节数作为控制变量。
正在测试中……
比如发送缓冲区满了,你就可以等待发送缓冲区的可写事件来触发发送函数,尽量用SOCKET的消息或者事件模式,而不是用SLEEP