Работа с удаленными MailSlot-ами
От: Alex Smirnov Россия  
Дата: 22.10.02 12:16
Оценка:
при использовании CreateFile( "\\\\.\\mailslot\\name_slot",....) винды нормально отрабатывают запись в него, если вместо точки поставить сетевое имя (даже собственной машины) винды перестают понимать что делать с данными, занятость проца подскакивает до 100%, всё нахрен виснет и уже не разгребается! Вопрос вообщем-то такой — кто использовал запись в слоты??? Где тут возможны подвохи?
Alex
Re: Работа с удаленными MailSlot-ами
От: Ed.ward Россия  
Дата: 22.10.02 13:13
Оценка:
Здравствуйте Alex Smirnov, Вы писали:

AS>при использовании CreateFile( "\\\\.\\mailslot\\name_slot",....) винды нормально отрабатывают запись в него, если вместо точки поставить сетевое имя (даже собственной машины) винды перестают понимать что делать с данными, занятость проца подскакивает до 100%, всё нахрен виснет и уже не разгребается! Вопрос вообщем-то такой — кто использовал запись в слоты??? Где тут возможны подвохи?


я ипользовал Mailslot для посылки сообщений на Messanger, риф быль только один, передавать разом оказалось возможным не более 400 байт, хотя в MSDN написано что нельзя более 128 байт (я так понимаю это максимальный размер SMB пакета)

Ed.ward
Re[2]: Работа с удаленными MailSlot-ами
От: Alex Smirnov Россия  
Дата: 22.10.02 13:52
Оценка:
Здравствуйте Ed.ward, Вы писали:

EW>я ипользовал Mailslot для посылки сообщений на Messanger, риф быль только один, передавать разом оказалось возможным не более 400 байт, хотя в MSDN написано что нельзя более 128 байт (я так понимаю это максимальный размер SMB пакета)


У меня прога с оЧЧЕЕЕНь большой частотой пишет в слоты. Получается кусок типа такого:


где-то ранее:
 int m_iMaxMailSlotSize = 400;

MyWrite( char* Name, char* pData, int iSizeData)
{
        HANDLE m_hSlot = CreateFile( Name, GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL);
        if(m_hSlot == INVALID_HANDLE_VALUE) return;
        for( ; iSizeData > 0; iSizeData -= m_iMaxMailSlotSize)
        {
            int iSize = (iSizeData < m_iMaxMailSlotSize) ? iSizeData : m_iMaxMailSlotSize;
        if(!WriteFile( m_hSlot, pData, iSize, &dwWriten, NULL))
                         break;
        pData += m_iMaxMailSlotSize;
        }
        CloseHandle( m_hSlot);
}


main()
{
  .....
   ....
    while()
    {
       ...
       ...
       Имя слота выдаёт функция в которой ищется не используемый в данный момент слот.
       MyWrite( Name, data, size);
    }
}


В какой-то момент для записи выбирается слот в который мы только что писали,и при попытки его использовать
винды отчебучивают или наложение данных при приёме у сервера,или просто что-то начинают предпринимать такое серьёзное
что забивают весь проц. на 100%.
Alex
Re: Работа с удаленными MailSlot-ами
От: Hacker_Delphi Россия  
Дата: 23.10.02 06:52
Оценка:
Здравствуйте Alex Smirnov, Вы писали:

AS>при использовании CreateFile( "\\\\.\\mailslot\\name_slot",....) винды нормально отрабатывают запись в него, если вместо точки поставить сетевое имя (даже собственной машины) винды перестают понимать что делать с данными, занятость проца подскакивает до 100%, всё нахрен виснет и уже не разгребается! Вопрос вообщем-то такой — кто использовал запись в слоты??? Где тут возможны подвохи?

Когда-то писал все нормально работало...
попробуй добавить путь к слоту не должно, конечно повлиять, но кто их, в M$ знает???
Если при компиляции и исполнении вашей программы не происходит ни одной ошибки — это ошибка компилятора :)))
Re[3]: Работа с удаленными MailSlot-ами
От: Dima_Lt Литва http://dimchansky.github.io/
Дата: 07.01.03 13:59
Оценка:
Здравствуйте, Alex Smirnov, Вы писали:


AS>У меня прога с оЧЧЕЕЕНь большой частотой пишет в слоты. Получается кусок типа такого:


AS>

AS>
AS>где-то ранее:
AS> int m_iMaxMailSlotSize = 400;

AS>MyWrite( char* Name, char* pData, int iSizeData)
AS>{
AS>        HANDLE m_hSlot = CreateFile( Name, GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL);
AS>        if(m_hSlot == INVALID_HANDLE_VALUE) return;
AS>        for( ; iSizeData > 0; iSizeData -= m_iMaxMailSlotSize)
AS>        {
AS>            int iSize = (iSizeData < m_iMaxMailSlotSize) ? iSizeData : m_iMaxMailSlotSize;
AS>        if(!WriteFile( m_hSlot, pData, iSize, &dwWriten, NULL))
AS>                         break;
AS>        pData += m_iMaxMailSlotSize;
AS>        }
AS>        CloseHandle( m_hSlot);
AS>}

AS>
AS>main()
AS>{
AS>  .....
AS>   ....
AS>    while()
AS>    {
AS>       ...
AS>       ...
AS>       Имя слота выдаёт функция в которой ищется не используемый в данный момент слот.
AS>       MyWrite( Name, data, size);
AS>    }
AS>}
AS>


AS>В какой-то момент для записи выбирается слот в который мы только что писали,и при попытки его использовать

AS>винды отчебучивают или наложение данных при приёме у сервера,или просто что-то начинают предпринимать такое серьёзное
AS>что забивают весь проц. на 100%.

На мой взгляд, проблемы могут быть вызваны из-за несоблюдения следущих моментов:

The final problem with Windows 95 and 98 worth mentioning is memory leaks, which can occur when you're using timeout values on mailslots. When you create a mailslot using the CreateMailslot function with a timeout value greater than 0, the ReadFile function leaks memory when the timeout expires and the function returns FALSE. After many calls to the ReadFile function, the system becomes unstable and subsequent ReadFile calls whose timers expire start returning TRUE. As a result, the system is no longer able to execute other MS-DOS applications. To work around this, create the mailslot with a timeout value of either 0 or MAILSLOT_WAIT_FOREVER. This will prevent an application from using the timeout mechanism, which causes the actual memory leak.

Также при чтении
BOOL ReadFile(
    HANDLE hFile,
    LPVOID lpBuffer,
    DWORD nNumberOfBytesToRead, 
    LPDWORD lpNumberOfBytesRead, 
    LPOVERLAPPED lpOverlapped
);


CreateMailslot returns the handle hFile. The lpBuffer and nNumberOfBytesToRead parameters determine how much data can be read off a mailslot. It is important to make the size of this buffer greater than the nMaxMessageSize parameter from the CreateMailslot API call. Additionally, the buffer must be larger than incoming messages on the mailslot; if it is not larger, ReadFile will fail with the error ERROR_INSUFFICIENT_BUFFER. The lpNumberOfBytesRead parameter reports the actual number of bytes read when the ReadFile operation completes.
Re: [moderator] Работа с удаленными MailSlot-ами
От: Хитрик Денис Россия RSDN
Дата: 09.01.03 18:08
Оценка:
Алекс, здравствуйте!

Если вы хотите закрыть тему, то не надо голосовать за удаление! Лучше напишите сообщение, содержащее какой-нибудь результат, ответ на ваш вопрос, например. Может кому пригодится. По этой же причине считаю удаление темы нецелесообразным и оставляю сообщение жить в WinAPI. Долгих ему лет!

Напишите, какой вы для себя сделали вывод.
Это, конечно, просьба и вас ни к чему не обязывает.
Правила нашего с вами форума.
Как правильно задавать вопросы. © 2001 by Eric S. Raymond; перевод: © 2002 Валерий Кравчук.
Re: Работа с удаленными MailSlot-ами
От: xelby http://shop.biblio-globus.ru/cpr/
Дата: 09.01.03 19:31
Оценка:
Здравствуйте, Alex Smirnov, Вы писали:

AS>при использовании CreateFile( "\\\\.\\mailslot\\name_slot",....) винды нормально отрабатывают запись в него, если вместо точки поставить сетевое имя (даже собственной машины) винды перестают понимать что делать с данными, занятость проца подскакивает до 100%, всё нахрен виснет и уже не разгребается! Вопрос вообщем-то такой — кто использовал запись в слоты??? Где тут возможны подвохи?


Если нужна работа с mailslot под Delphi/C++Builder, то готовые компоненты есть в библиотеке globus.lib:
здесь
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.