原文“send先比较待发送数据的长度len和套接字s的发送缓冲的长度, 如果len大于s的发送缓冲区的长度,该函数返回SOCKET_ERROR;”
问题: 如果发送大文件,len大于s的发送缓冲区的长度,那么直接发送是行不通的么?也就是调用该函数就只是返回而不做其他数据操作?
问题: 如果发送大文件,len大于s的发送缓冲区的长度,那么直接发送是行不通的么?也就是调用该函数就只是返回而不做其他数据操作?
解决方案 »
- 用vc6.0如何读取图片的详细信息(exif信息),如照相机型号,拍摄时间等!
- 求购VC进销存源码
- 怎样将CreateFileMapping用于远程文件?
- 我要换工作,不知道用友是否好进,工资如何?
- 内存问题,在线等
- 我用的是无标题栏的对话框,怎样对能使它在运行时在任务栏上显示标题和图标?
- 编译错误:fatal error C1010: unexpected end of file while looking for precompiled header directive
- 怎样用mfc读取文件夹内所有图片,并且将每个图片的文字信息都叠加到该图片上
- 求问一个友元函数形式的操作符重载的问题
- MS SQL 2000特大问题,一起讨论
- MFC中EDIT框的输出问题
- 请问:我要做一个身份证的识别 ——需要些什么知识?
UDP有个最大包(65535个字节),如果发送数据超过这个数,那么就如LZ所说
TCP没有那个限制,我试过一次发送4M的数据,都正确接收了,所以没有问题
但对于未知的错误我们都需要应对:
所以如果发送较大的文件,需要以这样的方式send:
// while(needlen>0)
// {
// ret=send(thissocket,&(buffer[j]),needlen,0);
// if(ret==0)
// {
// //;
// }
// else if(ret==SOCKET_ERROR)
// {
// //;
// }
// needlen-=ret;
// j+=ret;
// }明白了吗
会返回WSAENOBUFS错误
假如是非阻塞就会返回发送的字节所以大文件发送要求你自己分片
If no buffer space is available within the transport system to hold the data to be transmitted, send will block unless the socket has been placed in nonblocking mode
如果你的socket是阻塞方式的,那么send函数会停在这里,一直到有充足的空间存放你的数,函数才返回;
如果是非阻塞方式,那么函数会马上返回SOCKET_ERROR,如果调用WSAGetLastError(),返回值是WSAEWOULDBLOCK,表示“无法立即完成一个非阻挡性套接字操作。”
如有错误,请大牛们指正~~