Передача сокета из C # в NetFoss - PullRequest
0 голосов
/ 22 августа 2009

NetFoss требует, чтобы вы запустили его с командной строкой, подобной этой:

nf.bat / n [#] / h [#] [командная строка] где / n [#] - номер узла, а / h [#] - дескриптор сокета ОС.

Я хочу написать что-то на C #, очень похожее на то, что бы делала телнет-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?

Кто-нибудь знает, что мне не хватает?

EDIT:

Я забыл упомянуть, что я также пытался установить для UseShellExecute значение TRUE, и это выдает ошибку NetFoss, говорящую о том, что это недопустимый дескриптор. Насколько я понимаю, мне придется каким-то образом дублировать дескриптор, чтобы неуправляемое приложение могло получить к нему доступ? Есть ли способ выполнить то, что я пытаюсь сделать с помощью C #?

Спасибо, Марк

1 Ответ

1 голос
/ 25 сентября 2009

Обычно приложение DOS выводит в окно консоли, но оно также должно выводить клиент telnet.

Поскольку вы видите начальное сообщение о версии NetFoss в вашем клиенте telnet, мы знаем, что дескриптор сокета успешно передается в NetFoss ... Так что, похоже, проблема в том, что ваше приложение DOS не знает о FOSSIL в настоящее время не настроен на использование метода FOSSIL или INT14h.

С уважением, Майк Разработчик NetFoss

...