Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Сети > CSocket, CSocketFile (MFC)


Автор: Просто Guest 23.3.2005, 07:21
Hi All...
Не могу побороть странную болезнь "сервера" - переодически он не отправляет "клиенту" пакет, хотя по коду это невозможно ... отловил 100% момент этого поведения и вот как это выглядит ...
Привожу часть кода отправки сформированного пакета с сервера:
Код

BOOL CClientThread::SendMsg()
{
         ....
         BYTE* pByte = NULL;
    try
    {
        DWORD dwSize = m_memFile.GetLength();
        if ((bSuccess = (dwSize > 0)) == TRUE) {
            pByte = m_memFile.Detach();
            m_pArchiveOut->Write(pByte, (UINT) dwSize);
            m_pArchiveOut->Flush(); // - вот здесь голова начинает болеть не по-детски
        }
    }
         ...
    if (pByte)
       free(pByte);
} 

где m_memFile - CMemFile сокетного соединеия куда сначала считываю переданный с клиента пакет, а после в него же формерую ответный пакет, а остальное:
BOOL CClientThread::InitInstance()
{
...
m_pClientSocket = new CClientSocket(this);
if (!m_pClientSocket->Attach(hConnected)) {
...
return FALSE;
}

m_pFile = new CSocketFile(m_pClientSocket);
m_pArchiveIn = new CArchive(m_pFile, CArchive::load);
m_pArchiveOut = new CArchive(m_pFile, CArchive::store);
...
}


Место где "ничего не происходит" - m_pArchiveOut->Flush(); - я прокомментировал ... По идее эта команда инициирует передачу данных на клиента но только не в смоделированной ситуации - она выполняется но клиент ничего не получет (в смысле на него ничего не приходит) ... поможите плиз ... просто не представляю куда смотреть и что копать ... подскажите!

Автор: Coocky 28.3.2005, 15:13
Цитата
она выполняется но клиент ничего не получет (в смысле на него ничего не приходит)

Я вообще-то немного так делал..
А можешь ли ты посмотреть-вормируется лм сообщение на клиенте о получении пакета?
А какой тип соединения?
Насколько я помню с помощью WinSock можно создавать два типа гнезда: TCP( содержат встроеные функции и обеспечивают гарантированую доставку сообщений) и UDP(требуют написания програмного кода для правильного приема -передачи пакетов).
Для TCP в качестве второго аргумента Create() нужно передать SOCK_STREAM.
Для UDP в качестве второго аргумента Create() нужно передать SOCK_DGRAM.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)