Передача данных через сокет.

// функция реакции на возможность передачи

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; просмотров: 639;


Поиск по сайту:

При помощи поиска вы сможете найти нужную вам информацию.

Поделитесь с друзьями:

Если вам перенёс пользу информационный материал, или помог в учебе – поделитесь этим сайтом с друзьями и знакомыми.
helpiks.org - Хелпикс.Орг - 2014-2024 год. Материал сайта представляется для ознакомительного и учебного использования. | Поддержка
Генерация страницы за: 0.006 сек.