![]() |
Net Send mit Mailslots
Ich habe folgenden Code von Assarbad vorliegen:
Delphi-Quellcode:
Zwei Probleme:
(******************************************************************************
This code is PUBLIC DOMAIN! You may find it on [url]http://assarbad.net[/url] or [url]http://assarbad.net[/url] Contact me via eMail: Assarbad AT gmx DOT info ... or via ICQ : 28 16 45 ******************************************************************************) function NetMessageBufferSendSubstA(ServerName, MsgName, FromName, Msg: AnsiString): Boolean; {.$DEFINE SYNCHRONOUS} const szService = '\mailslot\messngr'; MaxBufLen = $700; var hFile: THandle; WrittenBytes: DWORD; {$IFNDEF SYNCHRONOUS} ovs: OVERLAPPED; EventName:String; {$ENDIF} begin Result := False; if Length(Msg) > MaxBufLen then SetLength(Msg, MaxBufLen); {$IFNDEF SYNCHRONOUS} EventName:='NetSendEvent_'+ServerName; {$ENDIF} ServerName := '\\' + Servername + szService; hFile := CreateFileA( @ServerName[1], GENERIC_WRITE, FILE_SHARE_READ, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL or FILE_FLAG_NO_BUFFERING or FILE_FLAG_OVERLAPPED, 0); if hFile <> INVALID_HANDLE_VALUE then try Msg := FromName + #0 + MsgName + #0 + Msg; {$IFNDEF SYNCHRONOUS} ovs.hEvent := CreateEventA(nil, True, False, @EventName[1]); WriteFile(hFile, Pointer(Msg)^, Length(Msg), WrittenBytes, @ovs); {$ELSE} WriteFile(hFile, Pointer(Msg)^, Length(Msg), WrittenBytes, nil); {$ENDIF} Result := GetLastError = ERROR_IO_PENDING; finally {$IFNDEF SYNCHRONOUS} if WaitForSingleObject(ovs.hEvent, INFINITE) <> WAIT_TIMEOUT then {$ENDIF} CloseHandle(hFile); end; end; procedure TForm1.Button1Click(Sender: TObject); begin if not NetMessageBufferSendSubstA('hal9000', 'Empfänger', 'Absender', 'üäö') then RaiseLastOSError(); end;
Nachtrag: Kann ich mit der Funktion auch auf einen Win9x Rechner Nachrichten schicken auf dem WinPopup läuft? Ich meine da mal was gehört zu haben. |
Re: Net Send mit Mailslots
Zitat:
Delphi-Quellcode:
Zumindest WinPopup stellt die Zeichen dann richtig dar. Womit wohl auch die Frage:
function OEMConverter(s: AnsiString): string;
begin SetLength(Result,length(s)); if(length(Result) > 0) then CharToOEM(pchar(s),pchar(Result)); end; Zitat:
|
Re: Net Send mit Mailslots
Hm, ghut danke, dann wäre das schon mal behoben. Aber zufrieden bin ich erst, wenn ich dem Benutzer im Fall der Fälle eine aussagekräftige Fehlermeldung geben kann.
|
Re: Net Send mit Mailslots
Na ja, als (schlechte?) Idee fiele mir noch ein, vor dem Senden den Zielnamen aufzulösen. Sprich: die IP im Netzwerk ermitteln. Aber das klappt dann wirklich nur bei Computernamen. :?
|
Re: Net Send mit Mailslots
Ist mir egal, ich benutz' den Code nicht produktiv, es ist quasi Prototypen-Code. Und solchen veroeffentliche ich immer unter PUBLIC DOMAIN. Deshalb heisst es wohl selber basteln ;)
|
Re: Net Send mit Mailslots
Liste der Anhänge anzeigen (Anzahl: 1)
Mailslots senden auf verdacht hin die Messages and den Empfänger, egal ob der Empfänger existiert oder nicht. Somit kann es keine Fehlermeldungen bei Nichterreichbarkeit eines Empfängers geben. Dies ist also Prinzipbedingt und muß durch externen Code erledigt werden. Eine Möglichkeit, so wie ich sie bei meinen Mailslots genutzt habe, ist es das der Empfänger auf die gesendete Message antworten muß. Der Absender sendet nun seine Message und wartet auf die Bestätigungen der Empfänger. Die andere Möglichkeit wäre es die Verfügbarkeit des Empfängers zu überprüfen, sprich übers Netzwerk-API oder Socket-API die IP o.ä. herauszubekommen. Dies reicht aber nicht aus um zu erkennen ob der Empfämger-Mailslot auch tatsächlich die Nachricht empfangen hat. Am besten wäre es nun eine Software zu coden die einen eigenen Mailslot einrichtet. Über diesen werden die Nachrichten im Netzwek vesendet und eben auch der Empfang bestätigt. Diese Software leitet eventuell diese Nachrichten an den lokalen Messanger-Mailslot weiter.
Attached mein Mailslot Program das die Funktionen des Messangers ersetzt. Gruß Hagen |
Re: Net Send mit Mailslots
Zitat:
Danke Hagen, werde ich mir mal ankucken. |
Re: Net Send mit Mailslots
Zitat:
|
Re: Net Send mit Mailslots
@Luckie: "Public Domian Code" zuviel Fernsehen geschaut? Domian war doch so ein Fernseh-Seelenklempner ;)
|
Re: Net Send mit Mailslots
Da habe ich ja angerufen, aber der konnte mir auch nicht helfen. :?
|
Re: Net Send mit Mailslots
@Mathias, wieso ??
Meine Lösung arbeitet so das beim Starten der Anwendung eine Login-Notify-Message gebroadcastet wird. Alle anderen im Netz installierten MailSlots antworten gezielt auf diesen Clienten. Sie teilen ihren Rechnernamen und Usernamen per Message diesem neugestarteten Clienten mit. Das gleiche passiert beim Beenden eines Clientens. Somit weis jeder Client aktuell wer über die MailSlots erreichbar ist und kennt sogar dessen "Addresse". Das Versenden einer Nachricht kann nun als gezielt erfolgen. Sollte ein Addressat NICHT auf diese Nachticht antworten so weiß der Client das dieser Empfänger nicht mehr erreichbar ist und nimmt ihn aus seiner Liste raus. Ob nun die Nachricht vom Benutzer gelesen wurde oder nicht spielt für die Technik erstmal keine Rolle. Mein Mailslot programm könnte aber darauf umprogrammiert werden. Sozusagen muß der Benutzer nach dem Lesen der Nachricht diese bestätigen. Wichtig ist doch erstmal das die beschränkte Funktionalität der MailSlots durch ein besseres Protokoll techniche erweitert wird. Erst danach kann man sich über das Bestätigen durch die Benutzer Gedanken machen. Übrigens, es gibt mit den MailSlots noch zwei gravierende Nachteile: 1.) pro Nachricht können nur maximal 257 Bytes übertragen werden (NT 3.5 limitiert das auf diesen Wert). Somit muß das Protokoll für den MailSlot dies berücksichtigen und viel kleine Messages senden, falls die gesammte Nachricht dieses Limit überschreitet. 2.) Windows sendet auf allen Netzwerk-Kanälen wenn man MailSlots benutzt. D.h. sind auf einem Rechner die Netzwerkprotokolle Novell NetWare, Microsoft und NetBIOS installiert so wird über ALLE drei dieser Protokolle die gleiche Message versendet. MS macht dies weil es nicht weiß wenn es alles über die verschiedenen protokolle erreichen kann im Netz. Somit passiert es häufig das der Empfänger nacheinander und in NICHT-chronologischer Reihenfolge die gleichen Nachrichtenpackete empfangen kann. Man muß also jedes einzelne Nachrichten-Packet durchnummerieren und auf Empfängerseite die komplette Nachricht aus diesen einzelnen Packeten wieder zusammenbauen. All diese musste ich selber umsetzen, eben auch weil man über mein Program zB. Befehle an die Empfänger absetzen kann, zB. Remote-Neustart des Computers, oder ALLE Rechner im Netzwerk runterfahren, oder einfach mal eine WinWord-Datei versenden die dann beim Empfänger sofort mit WinWord geöffenet werden sollte. Mit MailDemo\Menu\Nachrichten\Befehl senden... oder ..\Benutzer neu starten... oder ..\Datei senden... kann man dies machen. All das ermöglicht meine verwendete MailSlot Komponente. Gruß Hagen |
Re: Net Send mit Mailslots
Hagen, nee - ich habe mir das Programm von dir im Anhang nicht angeschaut. Sorry. :oops: Ich sprach nur von dem Zitat. Damit kam ich nicht ganz klar. Wenn du einen eigenen Mailslot benutzt, dann muss der natürlich den anderen Teilnehmern bekannt sein. Darauf wollte ich hinaus. Wenn natürlich alle das selbe (ich nenn´s mal: ) Chatprogramm benutzen, dann spielt´s keine Rolle.
Aber ich war verwirrt wg. der Aussage: Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:54 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz