2014-12-10 1 views
2

Я прочитал все, что я могу найти о почтовых ящиках, и мне все еще остается проблема с записью на почтовый ящик, который был открыт для чтения сервером почтового сервера на другом компьютере.Напишите на mailslot на удаленном компьютере, используя Delphi

У меня нет проблемы с почтовыми ящиками на компьютер. Например, если я пытаюсь писать в Mailslot на локальном компьютере, как это:

var 
    sMsg: string; 
    iBytes: DWORD; 
begin 
    SlotName := '\\.\mailslot\testslot'; 
    Handle := CreateFile(PChar(SlotName), GENERIC_WRITE, FILE_SHARE_READ, nil, 
    OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0); 
    Result := WriteFile(Handle, sMsg[1], Length(sMsg), iBytes, nil); 
end; 

CreateFile проваливается с файлом, не существует код ошибки, если программа сервера почтового слота не создала почтовый слот.

Однако, если я передаю что-то вроде этого \\MYSERVER\mailslot\testslot в качестве имени почтового ящика, он всегда возвращает действительный дескриптор файла. Даже если имя компьютера недействительно, оно все равно возвращает дескриптор файла, а затем WriteFile также преуспевает.

Я надеялся, что CreateFile потерпит неудачу, если либо имя пользователя неверно, либо сервер почтового ящика на этом компьютере не создал почтовый ящик, но это, похоже, не так, кажется, что это происходит только при написании mailslot на локальном компьютере.

Может кто-нибудь просветить меня?

+0

Я повторно пометил ваш вопрос, потому что это вопрос Windows API. –

ответ

3

В CreateFile() documentation состоянии:

почтовых слоты

Если CreateFile открывает конец клиентской части Mailslot, функция возвращает INVALID_HANDLE_VALUE, если клиент почтового слота пытается открыть локальный почтовый слот прежде, чем сервер почтового слота имеет создал его с помощью функции CreateMailSlot.

Это означает, что CreateFile() не может проверить наличие удаленного почтового ящика, только локального почтового ящика. Это соответствует поведению, которое вы видите. Windows может легко проверить, существует ли локальный почтовый ящик, но не может проверить, существует ли удаленный почтовый ящик. Это имеет смысл, если учесть, что почтовые ящики реализованы с использованием дейтаграмм (aka, UDP). UDP не знает, существует ли удаленное назначение или нет. Все, что он может сделать, это поместить пакет в сеть и надежда достигает цели. Об этом говорится в Nuch в Mailslot documentation:

Одним из важных моментов является то, что почтовые слоты широковещательных сообщений с помощью датаграмм. Дейтаграмма - это небольшой пакет информации, которую сеть посылает по проводу. Как и радио- или телевизионная трансляция, датаграмма не предлагает подтверждения получения; нет способа гарантировать, что датаграмма была получена. Так же, как горы, большие здания или мешающие сигналы могут привести к потере радио- или телевизионного сигнала, есть вещи, которые могут препятствовать тому, чтобы датаграмма достигла определенного места назначения.

Вот почему CreateFile() и WriteFile() не выходят из строя, когда удаленный почтовый слот не существует. Они просто не знают, так или иначе.