Socket在Send和Recv的时候都需要传入需要发送和接收的字节数,返回实际发送和接收的字节数,再以这个返回值做为下一次发送或接收的偏移量. 只要你知道这个原理就不会溢出来. 还有就是发送和接收都用循环的方式.//Convert the package to send buffer and send the buffer. void CSocketClient::SendPackage() { //Conver to send buffer. m_protocol.PackageToSend(m_pkSend,m_bufSend); int iSend=0; while(m_bConn && m_bufSend.dwLen>0) { iSend=Send(m_bufSend.puData,m_bufSend.dwLen-iSend); m_bufSend.dwLen-=iSend; } }
void CSocketClient::OnReceive(int nErrorCode) { // TODO: Add your specialized code here and/or call the base class CSocket::OnReceive(nErrorCode); //Receive data. int iRecv=0;
UCHAR* pRecv=&m_bufRecv.puData[m_bufRecv.dwLen]; int iCount=MAX_BUFFER_LEN-m_bufRecv.dwLen;
iRecv=Receive(pRecv,iCount); if (iRecv>0) { m_bufRecv.dwLen+=iRecv; m_bufRecv.puData[m_bufRecv.dwLen]=0X00;
只要你知道这个原理就不会溢出来.
还有就是发送和接收都用循环的方式.//Convert the package to send buffer and send the buffer.
void CSocketClient::SendPackage()
{
//Conver to send buffer.
m_protocol.PackageToSend(m_pkSend,m_bufSend);
int iSend=0;
while(m_bConn && m_bufSend.dwLen>0)
{
iSend=Send(m_bufSend.puData,m_bufSend.dwLen-iSend);
m_bufSend.dwLen-=iSend;
}
}
{
// TODO: Add your specialized code here and/or call the base class
CSocket::OnReceive(nErrorCode);
//Receive data.
int iRecv=0;
UCHAR* pRecv=&m_bufRecv.puData[m_bufRecv.dwLen];
int iCount=MAX_BUFFER_LEN-m_bufRecv.dwLen;
iRecv=Receive(pRecv,iCount);
if (iRecv>0)
{
m_bufRecv.dwLen+=iRecv;
m_bufRecv.puData[m_bufRecv.dwLen]=0X00;
while(m_protocol.ReceiveToPackage(m_bufRecv,m_pkRecv))
{
ProcessRecvPackage();
}
}
}
我的msn [email protected]
钱还是先汇到我的帐号上吧,我怕你收不到
我看了一下,你好象是自己封装的Socket类,为什么不直接用MFC的CSocket呢?
你说的每当客户端连接时,内存就增加一点.客户端断开时,在服务器端的Work Socket的OnClose事件里delete this;就可以,我通常是这么做.
当客户端断开时,你服务端的负责与客户端连接的Work Socket会收到Close事件.在Work Socket的OnClose事件里面 delete this;就可以.