原文“send先比较待发送数据的长度len和套接字s的发送缓冲的长度, 如果len大于s的发送缓冲区的长度,该函数返回SOCKET_ERROR;”
问题: 如果发送大文件,len大于s的发送缓冲区的长度,那么直接发送是行不通的么?也就是调用该函数就只是返回而不做其他数据操作?
问题: 如果发送大文件,len大于s的发送缓冲区的长度,那么直接发送是行不通的么?也就是调用该函数就只是返回而不做其他数据操作?
解决方案 »
- 求助!写了一个ActixeX界面,里面有一个edit框,但是无法响应backspace,已经弄了一天了,还没解决,急!急!急!
- 怎样在VC中生成HTM文件?
- 急:如何从结果集中一次取出多条记录
- 怎样改变程序在任务栏上的按钮的颜色?!谢谢!!!
- [调查]开发医疗信息化软件的请进哦,顶者有分!!!!!!
- 请问大虾关于vc网络编程!!!急
- 谁有Visual Assistant这个软件
- 如何实现写字板的replace功能?
- 请问:创建窗口后的第一个WM_SETFOCUS在什么时候产生?
- 开发了一个com组件,用c++再去调用释放的时候的崩溃到_Free处
- 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,表示“无法立即完成一个非阻挡性套接字操作。”
如有错误,请大牛们指正~~