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

Ge 2003-12-10 10:36:41
是很现实的一个问题,那位高人,花点时间帮我解决一下,感激不尽。。。
我即使设置足够大的缓冲,也只能收到8640bit,,
...全文
28 7 打赏 收藏 举报
写回复
7 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
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
分包发送和接收.
  • 打赏
  • 举报
回复
相关推荐
发帖
网络编程
加入

1.8w+

社区成员

VC/MFC 网络编程
社区管理员
  • 网络编程
申请成为版主
帖子事件
创建了帖子
2003-12-10 10:36
社区公告
暂无公告