CSocket::OnReceive() проблем

4 отговора 118 прегледа
#1

CSocket::OnReceive() проблем

Имам малка програмка, написана с помоща на MFC.
Използвам класът CSocket за предаване на данни по TCP/IP.
Направи ми впечатление, че не винаги събитието OnReceive()
настъпва когато се предават данни към програмката ми.
Даже под някои Win98 SE изобщо не се вдига нито веднъж,
въпреки че е Accept-ната връзката и данни се предават.
Класът CSocket е наследник на CAsyncSocket. Трябва ли да
се осъществи някаква синхронизация в OnReceive(), защото
в примерите на Microsoft не видях да правят такова нещо.
Те използват буфериране на данните с помоща на класът
CArchive. Може ли да се избегне използването на CArchive?

Ето малко от кода ми:

void CClientSocket::OnReceive(int nErrorCode)
{
m_pDlg->ProcessPendingReceive(this);
CSocket::OnReceive(nErrorCode);
}

void CExchangeDlg::ProcessPendingReceive(CClientSocket *pSocket)
{
const int nSize = sizeof(CLIENTDATA);

int nRead = m_pClientSocket->Receive((void *)(((BYTE *)m_pDataBuffer) + m_uiReadBytes), (nSize - m_uiReadBytes));
m_uiReadBytes += nRead;

switch (nRead)
{
case 0:
pSocket->Close();
break;
case SOCKET_ERROR:
if (GetLastError() != WSAEWOULDBLOCK)
{
SetStatusMsg("Socket error");
ProcessClientClose(pSocket);
}
break;
default:
if (m_uiReadBytes == nSize)
{
SetStatusMsg("Receiving...");
if (!ProcessPacket(m_pDataBuffer[0]))
PrepareSocketClose(pSocket);

m_uiReadBytes = 0;
memset(m_pDataBuffer, 0, sizeof(m_pDataBuffer));
}
}
}

Отговор
в отговор на WinSocket #2

Re: CSocket::OnReceive() проблем

хм, аз също в началото имах проблеми със тоя клас, защото той ползва за нотификация прозореца и без да искам го блокирах. да не би да имаш конструкции от типа изпращане и чакане да се получи OnReceive за да се излезе (някакво потвърждение)?

Отговор
в отговор на zaphod #3

Re: CSocket::OnReceive() проблем

Ами всъщност, прозорецът е диалогова кутия.
Целият проект е на MFC.
Вярно е, че реализирам нещо като протокол, но реално опашката за обработка на съобщенията на MFC се управлява автоматично и единственият проблем е ако се забиеш на някое събитие. По интересното е, че програмата работи безупречно на някои компютри а на други не. Значи аз съм тествал общо на 6 PC-та - 3 с Win98 SE и 3 WinXP. На 2 Win98 SE не работи като събитието OnReceive на CSocket не се вдига при постъпване на данни. На 3-тото PC с Win98 SE работи безупречно. На 3-те WinXP-та, на които аз съм тествал също работи безпроблемно. Има 2 теста направени под WinXP от други хора, при които също не работи.
Ще съм доволен дори някои да ми каже от къде мога да си сваля литература
по въпроса да прочета, как се справят другите.

Редактирано от WinSocket на

Отговор
в отговор на WinSocket #4

Re: CSocket::OnReceive() проблем

Май е разпространено мнението че CAssyncSocket трябва да се избягва. Точно защото праща месиджи на разни прозорци. Така е ставало по времето на win3.11 - сега е по-добре да се ползват нишки. Когато аз използвах CAssyncSocket си имах проблеми и затова си написах собствени класове(май някъде в codeguru.com има код по въпроса) за работа със сокети.

Отговор
в отговор на Teляka #5

Re: CSocket::OnReceive() проблем

Да съгласен съм, съжaлявам само че си загубих времето с
CSocket, имах идеята да си спестя малко труд, но се оказа, че
вместо това си отворих 2 пъти повече =(, благодаря все пак.

Отговор