请教关于CSocket接受数据的问题,如果发送的数据有100K,,那么接受端的程序应该怎么写??

Ge 2003-12-10 10:36:41
是很现实的一个问题,那位高人,花点时间帮我解决一下,感激不尽。。。
我即使设置足够大的缓冲,也只能收到8640bit,,
...全文
55 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
Healer 2003-12-14
  • 打赏
  • 举报
回复
阻塞不好...
vcar 2003-12-13
  • 打赏
  • 举报
回复
对于数据量大的时候,是用非阻塞方式会等待很长的时间,而且函数不会返回。
Ge 2003-12-13
  • 打赏
  • 举报
回复
非常感激还有个问题,socket中的阻塞机制是怎么样的啊,
smallfool 2003-12-10
  • 打赏
  • 举报
回复
循环接收。
BOOL CHSPacket::ReadBody(CHSConnection *pConnection)
{
ASSERT(pConnection);
CHSSocket *pSocket = pConnection->GetSocket();
ASSERT(pSocket);

if ( m_nLength > 0 && m_PacketStatus >= PS_READHEADEROK )
{
if ( m_pData == NULL )
{
try
{
m_pData = new TCHAR[m_nLength];
// 清 0
ZeroMemory(m_pData, m_nLength);

m_nBytesRead = 0;
m_PacketStatus = PS_READINGBODY;
}
catch (CMemoryException *e)
{
e->ReportError();
e->Delete();
return FALSE;
}
}

ASSERT(m_pData);

int nBytesRead = pSocket->Receive(m_pData + m_nBytesRead, m_nLength - m_nBytesRead);
if ( SOCKET_ERROR == nBytesRead )
{
if (WSAEWOULDBLOCK == pSocket->GetLastError())
{
// 继续进行接收
pSocket->AsyncSelect( FD_READ );
}
return FALSE;
}

m_nBytesRead += nBytesRead;
if ( m_nBytesRead < m_nLength )
{
pSocket->AsyncSelect( FD_READ );
return FALSE;
}

m_PacketStatus = PS_READBODYOK;

}
return TRUE;


}
sumkeen 2003-12-10
  • 打赏
  • 举报
回复
你不要指望一次收到所有的数据。
最好是分次接受,并且将每次接收的数据量垒加。
如果最后的接收数据量记数等于要接收的,那么肯定不会错了。

如:

nTotalReceive=0;
do
{
nReceive=m_socket.Receive(m_srcBuffer+nTotalReceive,1024);
nTotalReceive+=nReceive;
}
while(nTotalReceive<nTotal && nReceive>0)
ISunwu 2003-12-10
  • 打赏
  • 举报
回复
循环接收,知道收够为止.
fuxf 2003-12-10
  • 打赏
  • 举报
回复
分包发送和接收.

18,356

社区成员

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

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