powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Траблы с CSocket, CSocketFile (MFC)
9 сообщений из 9, страница 1 из 1
Траблы с CSocket, CSocketFile (MFC)
    #32975168
Просто Guest
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Hi All...
Кто-нить писал приложение в "трехзвенной" архитектуре на MFC?.. Не могу побороть странную болезнь "сервера" - переодически он не отправляет "клиенту" пакет, хотя по коду это невозможно ... отловил 100% момент этого поведения и вот как это выглядит ...
Привожу часть кода отправки сформированного пакета с сервера:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
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 сокетного соединеия куда сначала считываю переданный с клиента пакет, а после в него же формерую ответный пакет, а остальное:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
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(); - я прокомментировал ... По идее эта команда инициирует передачу данных на клиента но только не в смоделированной ситуации - она выполняется но клиент ничего не получет (в смысле на него ничего не приходит) ... поможите плиз ... просто не представляю куда смотреть и что копать ... подскажите!
...
Рейтинг: 0 / 0
Траблы с CSocket, CSocketFile (MFC)
    #32975720
zuzu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а почему так ?
Код: plaintext
1.
2.
3.
 if ((bSuccess = (dwSize >  0 )) == TRUE) {
...
        }
а не так
Код: plaintext
1.
2.
3.
 if ((bSuccess = (dwSize >  0 ))) {
...
        }
где написанно что операция (bSuccess = (dwSize > 0)) должна возврасщать 0 или 1, помоему она возвращает 0 или чтото другое кроме нуля.
так что просто у тебя не выполняется этот код всегда
...
Рейтинг: 0 / 0
Траблы с CSocket, CSocketFile (MFC)
    #32975879
Просто Guest
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Hi zuzu
Ты глубоко не прав ... записи абсолютно идентичны ... дело вкуса - ну привык я так писать ... а bSuccess всегда или TRUE или FALSE ... точнее FALSE она никогда еще не была (для этого отдельная обработка ниже) ... те попадание "внутрь" ВСЕГДА ... но ведь НЕ всегда клиентская часть получает передаваемый пакет ... да если б хотя бы этот пакет приходил каким-то битым! ... так нет OnRecive на клиентском сокете вообще не отрабытывает иногда... я уже так устал биться с этим ... т.е. ситуация на клиенте выглядит следующим образом: все работает-работает, а потом "виснет" (разумеется - основной поток приостановлен пока с сервера не прийдет ожидаемый ответ) ...
удалось добиться 100%(почти - иногда "пробивает") повторяемости ситуации всего лишь поменяв местами два SQL запроса к серверу ... чует мое сердце, что здесь что-то с CMemFile и CArchive, но пока ничего сделать не могу ...
могет есть у кого какие-нибудь предположения ?
...
Рейтинг: 0 / 0
Траблы с CSocket, CSocketFile (MFC)
    #32976035
zuzu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а у тебя не может случайно получится что 2 потока пишут в тотже файл одновременно ?, и вообсче зачем писать в файл ?, буфер и так можно передать?
...
Рейтинг: 0 / 0
Траблы с CSocket, CSocketFile (MFC)
    #32976077
Просто Guest
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Нет писать не могут в один ... для каждого соединения на сервере открывается свой поток(CClientThread класс от CWinThread) => у каждого свои экземпляры CSocket, CSocketFile, CMemFile(куда, повторюсь, сначала считывается приходящий пакет, а потом в него формируется исходящий пакет) и т.д. и т.п. ... пишу в CMemFile+СArchive потому что серилизация! удобно однако, т.е. на клиенте ar << CString, на сервере ar >> CString ...
если я тебя правильно онял ... и вообще CMemFile это же "memory file" со всеми от сюда вытекающими
...
Рейтинг: 0 / 0
Траблы с CSocket, CSocketFile (MFC)
    #32976683
zuzu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а какая разница если он спроецированный в памети, я имел в веду работают несколько потоков с темже файлом или нет ?, если да то нужно какието семафоры юзать перед записью.
...
Рейтинг: 0 / 0
Траблы с CSocket, CSocketFile (MFC)
    #32977486
Просто Guest
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Hi zuzu
Нет ... каждый работает со своим ...
...
Рейтинг: 0 / 0
Траблы с CSocket, CSocketFile (MFC)
    #32979057
zuzu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Flush сбрасывает данные из временного буфера в финальный, если был бы файл на диске он бы сброил эти данные физически на диск, в данном случае он сбрасывает их в твой файл из памети, проблема быстрее всего в отсылке данных, ты этот кусок не показал.
...
Рейтинг: 0 / 0
Траблы с CSocket, CSocketFile (MFC)
    #32979846
Просто Guest
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Hi zuzu
Спасибо за участие ... проблему частично решил ... чтобы не повторяться вот тебе ссылка:
http://forum.sources.ru/index.php?showtopic=87956

к сожалению только частично: я решил поблему с серилизацией, но судя по всему придется отказаться от CArchive и соответственно от CSocketFile(подробности здесь - PRB: CArchive::Read Might Hang When Using CSocketFile
http://support.microsoft.com/default.aspx?...kb;en-us;192704 - это же можно посмотреть в MSDNе) - а значит переписывать сервер ... ну это постепенно ...
еще раз спасибо ...
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Траблы с CSocket, CSocketFile (MFC)
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]