Передача данных через сокет.
// функция реакции на возможность передачи
void CProtocol::OnSend(int ErrCode)
{
CAsyncSocket::OnSend(ErrCode);
m_SendDataSize = 0;
while (m_SendDataSize < m_SendMemory.GetSize()) // пока есть данные для отправки
{
int n = Send(((BYTE*)m_SendMemory.GetAddr() + m_SendDataSize), m_SendMemory.GetSize()-m_SendDataSize); // запись в буфер сетевухи
// Анализ ошибок
if (n == SOCKET_ERROR)
{
ErrCode = GetLastError();
if (ErrCode != WSAEWOULDBLOCK)
{
CString s;
s.Format("Ошибка при передаче! Код ошибки %u", ErrCode);
MessageBox(0,s,"Сообщение",MB_OK);
Close();
}
}
else m_SendDataSize+= n;
}
m_SendMemory.Alloc(0);
m_SendDataSize = 0;
}
// функция посылки данных
void CProtocol::SendPacket(const void* p, DWORD size)
{
m_SendMemory.AddToMemory(&size, sizeof(DWORD)); // добавление размера данных
m_SendMemory.AddToMemory((BYTE*)p, size); // и свмих данных
OnSend(0);
}
2.17. Приём данных через сокет.
// получение данных
void CProtocol::OnReceive(int ErrCode)
{
CAsyncSocket::OnReceive(ErrCode);
if (m_IsReceiveSize) // Прием размера данных
{
int n = Receive((BYTE*)&m_ReceiveSize+m_ReceiveDataSize, sizeof(DWORD)-m_ReceiveDataSize);
// Анализ ошибок
if (n == SOCKET_ERROR)
{
ErrCode = GetLastError();
if (ErrCode != WSAEWOULDBLOCK)
{
CString s;
s.Format("Ошибка при приеме длины! Код ошибки %u", ErrCode);
MessageBox(0,s,"Сообщение",MB_OK);
Close();
}
}
else
// Анализ принятых данных
{
m_ReceiveDataSize+= n;
if (m_ReceiveDataSize == sizeof(DWORD)) // при приеме длины полностью
{
m_IsReceiveSize = false;
m_ReceiveData.Alloc(m_ReceiveSize);
m_ReceiveDataSize = 0;
}
}
}
else
// Прием самих данных
{
int n = Receive((BYTE*)m_ReceiveData.GetAddr()+m_ReceiveDataSize, m_ReceiveSize-m_ReceiveDataSize);
// Анализ ошибок
if (n == SOCKET_ERROR)
{
ErrCode = GetLastError();
if (ErrCode != WSAEWOULDBLOCK)
{
CString s;
s.Format("Ошибка при приеме собщения! Код ошибки %u", ErrCode);
MessageBox(0,s,"Сообщение",MB_OK);
Close();
}
}
else
// Анализ принятых данных
{
m_ReceiveDataSize+= n;
if (m_ReceiveDataSize == m_ReceiveSize) // при завершении приема пакета
{
m_ReceiveDataSize = 0;
m_IsReceiveSize = true;
//AfxMessageBox("Принят пакет!");
OnReceivePacket();
}
}
}
}
Дата добавления: 2014-12-24; просмотров: 673;