<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Mailslot Problem.]]></title><description><![CDATA[<p>Hallo Ihr,</p>
<p>ich habe die Idee eine Server-Client-Anwendung zu schreiben, bei der der Server ein x-beliebiger PC im LAN sein kann und es nie bekannt ist, welcher PC gerade als Server fungiert.<br />
Gelöst habe ich das Problem mit Mailslot. Der Client postet einfach eine Broadcast-Mail und wartet dann auf ein Echo. Erst dann wird die Verbindung via named Pipe hergestellt und Server-Client kommunizieren.</p>
<p>Zuerst habe ich ein simples Szenario aufgebaut.<br />
Server:</p>
<pre><code class="language-cpp">#include &lt;windows.h&gt;
#include &lt;iostream&gt;

HANDLE hSlot = NULL;
HANDLE hSlotEvent = NULL;

BOOL Makeslot() { 
    LPSTR lpszSlotName = &quot;\\\\.\\mailslot\\Myw32Slot&quot;; 

    hSlot = CreateMailslot(lpszSlotName, 0, MAILSLOT_WAIT_FOREVER, NULL);
    if (hSlot == INVALID_HANDLE_VALUE) return false;
	std::cout &lt;&lt; &quot;CreateMailslot successful.&quot; &lt;&lt; std::endl; 
    return true; 
} 

DWORD WINAPI MailSlotThread(void* lParam){
    DWORD cbMessage, cMessage, cbRead; 
    BOOL fResult; 
    char* lpszBuffer;
	DWORD nRes = 0;

	std::cout &lt;&lt; &quot;Thread startet ...&quot; &lt;&lt; std::endl;
    cbMessage = cMessage = cbRead = 0; 
    hSlotEvent = CreateEvent(NULL, true, false, NULL);

	for(;;){
       fResult = GetMailslotInfo(hSlot, NULL, &amp;cbMessage, &amp;cMessage, NULL);              
       if (!fResult) return 1;

       if (cbMessage == MAILSLOT_NO_MESSAGE) {
	       std::cout &lt;&lt; &quot;NO Message&quot; &lt;&lt; std::endl;
           nRes = WaitForSingleObject(hSlotEvent, 500);
		   if(nRes != WAIT_TIMEOUT) break;
	   } else {
          while(cMessage){
             lpszBuffer = new char[cbMessage];
             ReadFile(hSlot, lpszBuffer, cbMessage, &amp;nRes, NULL);
			 std::cout &lt;&lt; lpszBuffer &lt;&lt; std::endl;
			 cMessage--;
			 delete lpszBuffer;
		  }
	   }
	}
    return 0;   
}

void main(){
	DWORD hThread;
	Makeslot();
	hThread = (DWORD)CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE) MailSlotThread, 0, 0, NULL);
    MessageBox(NULL, &quot;Ok&quot;, &quot;stop here ...&quot;, 64);
}
</code></pre>
<p>Dann ein Client, der den Broadcast sendet:</p>
<pre><code class="language-cpp">#include &lt;windows.h&gt;

void WriteSlot(){ 
	LPSTR lpszMessage = &quot;Broadcast Slot - Message&quot;;  
    HANDLE hFile; 
    DWORD cbWritten; 

    hFile = CreateFile(&quot;\\\\*\\mailslot\\Myw32Slot&quot;, GENERIC_WRITE, 
                   FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); 

    if (hFile == INVALID_HANDLE_VALUE) return;
    WriteFile(hFile, lpszMessage, (DWORD) lstrlen(lpszMessage) + 1, &amp;cbWritten, NULL); 
} 

void main(){
    WriteSlot();
}
</code></pre>
<p>Das funktioniert, mit einer Merkwürdigkeit:</p>
<p>Test ich das auf meiner privaten Maschine, auf der vier LAN-Karten gemeinsam über einen Router laufen, kommen auf dem Server vier Meldungen an. An diesem LAN ist gar nichts besonderes. Ganz normals Home-NETWORK. Teste ich das auf einem anderen LAN, auf dem sich hunderte von PC herumlümmeln, kommt exakt eine Meldung (was es zu erwarten war == succesful) an.<br />
Der Server sollte schon klar unterscheiden können, wer andocken will, da eine unzahl von Clients geplant ist. Was läuft da schief?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/227607/mailslot-problem</link><generator>RSS for Node</generator><lastBuildDate>Sat, 11 Apr 2026 03:01:53 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/227607.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 17 Nov 2008 17:58:59 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Mailslot Problem. on Mon, 17 Nov 2008 20:48:32 GMT]]></title><description><![CDATA[<p>Hallo Ihr,</p>
<p>ich habe die Idee eine Server-Client-Anwendung zu schreiben, bei der der Server ein x-beliebiger PC im LAN sein kann und es nie bekannt ist, welcher PC gerade als Server fungiert.<br />
Gelöst habe ich das Problem mit Mailslot. Der Client postet einfach eine Broadcast-Mail und wartet dann auf ein Echo. Erst dann wird die Verbindung via named Pipe hergestellt und Server-Client kommunizieren.</p>
<p>Zuerst habe ich ein simples Szenario aufgebaut.<br />
Server:</p>
<pre><code class="language-cpp">#include &lt;windows.h&gt;
#include &lt;iostream&gt;

HANDLE hSlot = NULL;
HANDLE hSlotEvent = NULL;

BOOL Makeslot() { 
    LPSTR lpszSlotName = &quot;\\\\.\\mailslot\\Myw32Slot&quot;; 

    hSlot = CreateMailslot(lpszSlotName, 0, MAILSLOT_WAIT_FOREVER, NULL);
    if (hSlot == INVALID_HANDLE_VALUE) return false;
	std::cout &lt;&lt; &quot;CreateMailslot successful.&quot; &lt;&lt; std::endl; 
    return true; 
} 

DWORD WINAPI MailSlotThread(void* lParam){
    DWORD cbMessage, cMessage, cbRead; 
    BOOL fResult; 
    char* lpszBuffer;
	DWORD nRes = 0;

	std::cout &lt;&lt; &quot;Thread startet ...&quot; &lt;&lt; std::endl;
    cbMessage = cMessage = cbRead = 0; 
    hSlotEvent = CreateEvent(NULL, true, false, NULL);

	for(;;){
       fResult = GetMailslotInfo(hSlot, NULL, &amp;cbMessage, &amp;cMessage, NULL);              
       if (!fResult) return 1;

       if (cbMessage == MAILSLOT_NO_MESSAGE) {
	       std::cout &lt;&lt; &quot;NO Message&quot; &lt;&lt; std::endl;
           nRes = WaitForSingleObject(hSlotEvent, 500);
		   if(nRes != WAIT_TIMEOUT) break;
	   } else {
          while(cMessage){
             lpszBuffer = new char[cbMessage];
             ReadFile(hSlot, lpszBuffer, cbMessage, &amp;nRes, NULL);
			 std::cout &lt;&lt; lpszBuffer &lt;&lt; std::endl;
			 cMessage--;
			 delete lpszBuffer;
		  }
	   }
	}
    return 0;   
}

void main(){
	DWORD hThread;
	Makeslot();
	hThread = (DWORD)CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE) MailSlotThread, 0, 0, NULL);
    MessageBox(NULL, &quot;Ok&quot;, &quot;stop here ...&quot;, 64);
}
</code></pre>
<p>Dann ein Client, der den Broadcast sendet:</p>
<pre><code class="language-cpp">#include &lt;windows.h&gt;

void WriteSlot(){ 
	LPSTR lpszMessage = &quot;Broadcast Slot - Message&quot;;  
    HANDLE hFile; 
    DWORD cbWritten; 

    hFile = CreateFile(&quot;\\\\*\\mailslot\\Myw32Slot&quot;, GENERIC_WRITE, 
                   FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); 

    if (hFile == INVALID_HANDLE_VALUE) return;
    WriteFile(hFile, lpszMessage, (DWORD) lstrlen(lpszMessage) + 1, &amp;cbWritten, NULL); 
} 

void main(){
    WriteSlot();
}
</code></pre>
<p>Das funktioniert, mit einer Merkwürdigkeit:</p>
<p>Test ich das auf meiner privaten Maschine, auf der vier LAN-Karten gemeinsam über einen Router laufen, kommen auf dem Server vier Meldungen an. An diesem LAN ist gar nichts besonderes. Ganz normals Home-NETWORK. Teste ich das auf einem anderen LAN, auf dem sich hunderte von PC herumlümmeln, kommt exakt eine Meldung (was es zu erwarten war == succesful) an.<br />
Der Server sollte schon klar unterscheiden können, wer andocken will, da eine unzahl von Clients geplant ist. Was läuft da schief?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1616101</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1616101</guid><dc:creator><![CDATA[CStern]]></dc:creator><pubDate>Mon, 17 Nov 2008 20:48:32 GMT</pubDate></item><item><title><![CDATA[Reply to Mailslot Problem. on Tue, 18 Nov 2008 17:18:17 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>sry das ich das mal &quot;hoch schiebe&quot;.<br />
Hat jemand mal den Code ausprobiert und hat ähnliches beobachtet?<br />
Wer ein kleines LAN um sich herum hat, bitte bitte ausprobieren <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1616670</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1616670</guid><dc:creator><![CDATA[CStern]]></dc:creator><pubDate>Tue, 18 Nov 2008 17:18:17 GMT</pubDate></item></channel></rss>