Send( const void* lpBuf, int nBufLen, int nFlags = 0 )函数的nBufLen的值有没有最大限制?

a6806 2003-09-12 11:04:41
MFC的CAsyncSocket类中的函数
Send( const void* lpBuf, int nBufLen, int nFlags = 0 )的nBufLen的值有没有最大限制?
另外,Receive( void* lpBuf, int nBufLen, int nFlags = 0 )函数的nBufLen的值有没有最大限制?
...全文
126 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
a6806 2003-09-12
  • 打赏
  • 举报
回复
这是服务器发送数据的代码:pSocket->Send(ucMsgstr,uiTotLen),ucMsgstr是一个很大的数组,uiTotLen==18426;数组中前18426byte是有数据的.
这是客户端接收数据的代码:m_ClientSocket->Receive(buf,20000);buf是一个很大的数组.
问题是这样的,虽然服务器只发送了一次,可是客户端却接受了5次,请问这是什么问题?
yzx110 2003-09-12
  • 打赏
  • 举报
回复
明显的限制是没有的,如果你的nBufLen太大,可能有时候产生你并不想要的结果。
比如CAsyncSocket中用的是异步套接字,他不管你发没法好就返回,如果对方接受的缓冲区不够的话,也就是对方不能立即接受你发动的数据,则数据很可能丢失。虽然你发了数据,但是对方没有受到数据。
alfwolf 2003-09-12
  • 打赏
  • 举报
回复
你的int支持多大就可以发多大
zhanshenpkl 2003-09-12
  • 打赏
  • 举报
回复
如果你的内存允许的话是没有的
phoenixandlinda 2003-09-12
  • 打赏
  • 举报
回复
TCP接收窗口的最大长度是每次能接受的数据的最值,超过的会被分段接受。
对大数据应该先将数据包收完,再做处理。你可以先去包头得到数据包的预定长度(包头不会超过1024 bytes吧?)

不知楼主是用阻塞还还是异步方式?
阻塞方式好办你一直等,直到数据包大小符合要求:
如上面的数据 uiTotLen==18426

unsigned __int16 nIndex,nLeft,nRet;
……
nIndex =0;
nLeft = 18426;
while(nLeft >0)
{
nRet = recv(hSocket,buffer+nIndex,nLeft);
nIndex += nRet;
nLeft -= nRet;
}
……

非阻塞的其实也类似:如用事件

unsigned __int16 g_nIndex,g_nLeft,nRet;

case FD_READ:
……
nRet = recv(hSocket,buffer+g_nIndex,g_nLeft);
g_nIndex += nRet;
g_nLeft -= nRet;
……

a6806 2003-09-12
  • 打赏
  • 举报
回复
数据是对的,但是服务器发送的数据有消息头和消息体,客户端接收到以后就读取消息头和消息体,如果分多次接收,那么每一次接收到数据都要按消息头和消息体的格式读取数据,那就出错了.这个问题该怎么解决呢?
kof99th 2003-09-12
  • 打赏
  • 举报
回复
底层网络堆栈实现的问题,网络传输的数据有最大长度限制,所以你发出去的数据肯定是分片发的,至于收到的时候怎么收,就要看底层网络是怎么实现的,它的缓冲区多大等因素都有很大的影响,所以,多次接受是很正常的。
关键是数据对不对。

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧