2009-08-21 6 views
0

NetFoss erfordert, dass Sie es mit einer Befehlszeile wie dies auszuführen:Passing Sockel Von C# NetFoss

nf.bat/n [#]/h [#] [Befehlszeile] wo/n [# ] ist eine Knotennummer und/h [#] ist ein OS-Socket-Handle.

Ich möchte etwas in C# schreiben sehr ähnlich, was ein Telnet BBS tun würde, wenn es Türspiele läuft. Er sollte den Client-Socket akzeptieren, ein paar vom Client übertragene Informationen sammeln und den Socket dann an NetFoss übergeben, damit er eine DOS-basierte Anwendung ausführen kann, die die Kommunikation über einen fossilen Treiber unterstützt.

ich ehrlich war gerade zu raten, wie um dies zu realisieren, und hier ist, was ich kam mit:

class Program 
{ 
    const int BACKLOG_SIZE = 20; 

    static void Main(string[] args) 
    { 
     Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); 
     server.Bind(new IPEndPoint(IPAddress.Any, 3102)); 
     server.Listen(BACKLOG_SIZE); 
     while (true) 
     { 
      Socket socket = server.Accept(); 

      Process p = new Process(); 
      p.EnableRaisingEvents = false; 
      p.StartInfo.FileName = @"c:\netfoss\nf.bat"; 
      p.StartInfo.Arguments = @"/n1 /h" + socket.Handle + @" c:\game\game.bat 1"; 
      p.StartInfo.WorkingDirectory = "c:\netfoss"; 
      p.StartInfo.UseShellExecute = false; 
      p.Start(); 
     } 
    } 
} 

Interessanterweise die Anwendung, die NetFoss über game.bat ausgeführt wird, mit dem C# ausgegeben das Konsolenfenster der Anwendung, aber nicht den Telnet-Client, und noch interessanter ist, dass der Telnet-Client die erste NetFoss-Nachricht erhält, die anzeigt, dass er mit dem Socket kommunizieren kann. Warum wird die Anwendung, die an NetFoss übergeben wird, an mein Konsolenfenster anstatt an den Telnet-Client gesendet?

Wer weiß, was ich vermisse?

EDIT:

Ich vergaß zu erwähnen, dass ich auch versucht, UseShellExecute auf TRUE, und dies wirft ein NetFoss Fehlermeldung, dass es sich um ein ungültiges Handle ist. Aus meiner Sicht müsste ich das Handle in irgendeiner Weise duplizieren, damit die nicht verwaltete Anwendung darauf zugreifen kann? Gibt es eine Möglichkeit zu erreichen, was ich mit C# versuche?

Danke, Marc

Antwort

1

Es ist normal, dass die DOS-Anwendung Ausgänge an der Konsole Fenster, aber es sollte auf das Telnet-Client ausgegeben.

Da Sie die anfängliche NetFoss-Versionsnachricht in Ihrem Telnet-Client sehen, wissen wir, dass das Socket-Handle erfolgreich an NetFoss übergeben wird ... Es scheint also das Problem, dass Ihre DOS-Anwendung nicht FOSSIL ist ist derzeit nicht für die Verwendung einer FOSSIL- oder INT14h-Kommunikationsmethode konfiguriert.

Grüße, Mike NetFoss Entwickler

+0

ich für nicht aktualisiert dies früher entschuldigen, aber es scheint, dass es die ganze Zeit arbeitet. Das Auflegen, das ich hatte, ist, dass ich einen Telnet-Client in Flash erstellte, und da es domänenübergreifend war, führte es zunächst eine domänenübergreifende Verbindungsanforderung durch und übergab es, bevor eine vollständige Verbindung hergestellt werden konnte. Ich habe gerade den Code hinzugefügt, um die zwei verschiedenen Szenarien vor der Übergabe der Verbindung zu behandeln, und alles hat wie erwartet funktioniert. Aber danke für die Antwort! :) – Lusid