C # Socket Policy File Server для низкоуровневых соединений сокетов AS3.0? - PullRequest
0 голосов
/ 11 сентября 2009

Как мне сделать файловый сервер политики сокетов в C #. Все, что нужно сделать, это прослушать порт 843 для строки «», за которой следует байт NULL, а затем вернуть строку XML (которая является файлом политики сокета).

Я не кодировал подобные вещи раньше и не уверен, с чего начать. Я создаю это в службе Windows? Любые советы или ссылки приветствуются.

Справочная информация:

Для связи с веб-сервисом из Flash я использую библиотеку «as3httpclient» вместо URLRequest / URLLoader. Это потому, что это дает мне возможность отправлять пользовательские заголовки с запросами GET. В этой библиотеке используются низкоуровневые сокеты.

Когда флэш-память использует низкоуровневые сокеты для подключения к серверу, она ищет файл политики сокетов - и этот файл должен обслуживаться файловым сервером сокетов.

Статья файла политики сокетов от Adobe

Ответы [ 3 ]

8 голосов
/ 11 сентября 2009

Несколько советов по использованию предложенной вами архитектуры:

Попытка отправить HTTP-запрос через сокеты

Как правило, вы должны знать, что даже если вы можете общаться по http на более низком уровне с помощью сокетов, существует большое количество случаев, когда общение таким способом не удастся. В основном эти сбои происходят, если у пользователя включен прокси-сервер в браузере, так как нет эффективных средств обнаружения и последующего использования прокси при подключении через сокет.

Чтобы создать сервер политики, вы можете использовать класс TcpListener . Вы бы начали слушать так:

var tcpListener = new TcpListener(IPAddress.Any, 843 );
tcpListener.start();
tcpListener.BeginAcceptTcpClient(new AsyncCallback(NewClientHandler), null);

Метод NewClientHandler будет иметь вид:

    private void NewClientHandler(IAsyncResult ar)
    {
        TcpClient tcpClient = tcpListener.EndAcceptTcpClient(ar);
        ...

В этот момент вы можете захотеть предоставить объект tcpClient классу вашего собственного создания для обработки проверки данных, поступающих из сокета. Я собираюсь назвать это RemoteClient.

В RemoteClient у вас будет что-то вроде этого:

    var buffer=new byte[BUFFER_SIZE];
    tcpClient.GetStream().BeginRead(buffer, 0, buffer.Length, Receive, null);

и метод получения:

    private void Receive(IAsyncResult ar)
    {
        int bytesRead;
        try
        {
            bytesRead = tcpClient.GetStream().EndRead(ar);
        }
        catch (Exception e)
        {

            //something bad happened. Cleanup required
            return;
        }

        if (bytesRead != 0)
        {
            char[] charBuffer = utf8Encoding.GetChars(buffer, 0, bytesRead);
            try
            {
                tcpClient.GetStream().BeginRead(buffer, 0, buffer.Length, Receive, null);
            }
            catch (Exception e)
            {
                //something bad happened. Cleanup required
            }
        }
        else
        {
            //socket closed, I think?
            return;
        }
    }

и некоторые методы отправки:

    public void Send(XmlDocument doc)
    {
        Send(doc.OuterXml);
    }
    private void Send(String str)
    {

        Byte[] sendBuf = utf8Encoding.GetBytes(str);
        Send(sendBuf);
    }
    private void Send(Byte[] sendBuf)
    {
        try
        {
            tcpClient.GetStream().Write(sendBuf, 0, sendBuf.Length);
            tcpClient.GetStream().WriteByte(0);
            tcpClient.GetStream().WriteByte(13); //very important to terminate XmlSocket data in this way, otherwise Flash can't read it.

        }
        catch (Exception e)
        {
            //something bad happened. cleanup?
            return;
        }
    }

Это все важные детали, которые я думаю. Я написал это некоторое время назад ... Метод Receive выглядит так, как будто он может помочь с переделкой, но этого должно быть достаточно для начала работы.

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

Создать сокет прослушивания.

Когда соединение открыто, выполните прием и дождитесь ожидаемой строки. После получения отправьте содержимое файла, а затем закройте сокет.

Оберните это в службу (запущенную как учетная запись с низкими привилегиями).

Большая часть работы выполняется с классом System.Net.Sockets.Socket , документация содержит пример. API очень похож на API сокетов BSD в целом (в основном это 1: 1 отображение из BSD API в метод Socket (или тип справки), поэтому любой фон должен быть легко переводимым.

0 голосов
/ 12 октября 2012

Мне пришлось выполнить эту задачу как с Java, так и с C #, они очень похожи.

Вы можете взглянуть на файл политики Java .

Некоторые проблемы можно увидеть в этом ответе: https://stackoverflow.com/a/12854204/1343667

...