【问题标题】:Passing Socket From C# to NetFoss将套接字从 C# 传递到 NetFoss
【发布时间】:2010-11-21 19:01:59
【问题描述】:

NetFoss 要求您使用类似于以下的命令行运行它:

nf.bat /n[#] /h[#] [命令行] 其中 /n[#] 是节点号,/h[#] 是 OS 套接字句柄。

我想用 C# 编写一些非常类似于 telnet BBS 在运行门游戏时所做的事情。它应该接受客户端套接字,收集从客户端传递给它的一些信息,然后将套接字传递给 NetFoss 以用于运行基于 DOS 的应用程序,该应用程序支持通过化石驱动程序进行通信。

老实说,我只是在猜测如何解决这个问题,这就是我想出的:

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();
        }
    }
}

有趣的是,NetFoss 通过 game.bat 运行的应用程序正在输出到 C# 应用程序的控制台窗口,而不是 telnet 客户端,更有趣的是 telnet 客户端确实收到了显示它的初始 NetFoss 消息能够与套接字通信。那么,为什么传递给 NetFoss 的应用程序输出到我的控制台窗口而不是 telnet 客户端?

有人知道我错过了什么吗?

编辑:

我忘了提到我还尝试将 UseShellExecute 设置为 TRUE,这会引发 NetFoss 错误,指出它是无效句柄。据我了解,我必须以某种方式复制句柄,以便非托管应用程序可以访问它?有什么方法可以使用 C# 完成我想要做的事情吗?

谢谢, 马克

【问题讨论】:

    标签: c# sockets telnet


    【解决方案1】:

    DOS 应用程序输出到您的控制台窗口是正常的,但它也应该输出到 telnet 客户端。

    由于您在 telnet 客户端中看到初始 NetFoss 版本消息,我们知道套接字句柄已成功传递给 NetFoss...所以听起来问题是您的 DOS 应用程序不支持 FOSSIL,或者当前未配置为使用 FOSSIL 或 INT14h 通信方法。

    问候,迈克 NetFoss 开发者

    【讨论】:

    • 我很抱歉没有尽快更新,但它似乎一直在工作。我遇到的问题是我在 Flash 中构建了一个 telnet 客户端,并且由于它是跨域的,因此它首先进行连接并传递跨域策略请求,然后才被允许完全连接。我只是在传递连接之前添加了处理两种不同场景的代码,一切都按预期工作。但感谢您的回复! :)
    猜你喜欢
    • 2011-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-20
    • 2014-08-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多