Pregunta

¿Cómo hago para crear un servidor de archivos de políticas de socket en C #? Todo lo que tiene que hacer es escuchar en el puerto 843 la cadena & Quot; & Lt; policy-file-request / & Gt; & Quot; seguido de un byte NULL y luego devolver una cadena XML (que es el archivo de política de socket).

No he codificado este tipo de cosas antes y no estoy seguro de por dónde empezar. ¿Lo creo en un servicio de Windows? Cualquier sugerencia o enlace son bienvenidos.

Fondo:

Para contactar un servicio web desde flash, estoy usando la biblioteca 'as3httpclient' en lugar de URLRequest / URLLoader. Esto se debe a que me permite enviar encabezados personalizados con solicitudes GET. Esta biblioteca utiliza sockets de bajo nivel para hacer sus cosas.

Cuando flash usa sockets de bajo nivel para conectarse a un servidor, busca un archivo de política de socket, y esto debe ser atendido por un servidor de archivos de política de socket.

Artículo de archivo de política de socket de Adobe

¿Fue útil?

Solución

Algunas cosas a tener en cuenta al usar su arquitectura sugerida:

Intentando enviar una solicitud HTTP a través de sockets

Principalmente, debe tener en cuenta que aunque puede chatear http en un nivel inferior utilizando sockets, hay una gran cantidad de casos en los que la comunicación de esta manera fallará. Principalmente, estas fallas ocurrirán si el usuario tiene un servidor proxy habilitado en su navegador, ya que no hay medios efectivos para descubrir y usar el proxy cuando se conecta a través de un socket.

Para crear un servidor de políticas, puede usar clase TcpListener . Comenzaría a escuchar de la siguiente manera:

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

El método NewClientHandler tendría la forma:

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

En ese momento, es posible que desee proporcionar el objeto tcpClient a una clase de su propia creación para manejar la validación de los datos que provienen del socket. Voy a llamarlo RemoteClient.

En RemoteClient, tendría algo como esto:

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

y un método de recepción:

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

y algunos métodos de envío:

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

Esos son todos los detalles importantes que creo. Escribí esto hace algún tiempo ... parece que el método de recepción podría funcionar con una reelaboración, pero debería ser suficiente para comenzar.

Otros consejos

Cree un socket de escucha.

Cuando se abre una conexión, realice una recepción y espere la cadena esperada. Cuando lo reciba, envíe el contenido del archivo y luego cierre el socket.

Envuelva esto en un servicio (que se ejecuta como una cuenta con pocos privilegios).

La mayor parte del trabajo se realiza con el System.Net.Sockets.Socket clase, la documentación contiene una muestra, la API es muy similar a la API de socket BSD en general (en gran parte hay una asignación 1: 1 de la API BSD al método Socket (o tipo de ayuda)) por lo que cualquier fondo debe ser fácilmente traducible.

Tuve que hacer esta tarea con Java y C #, son bastante similares.

Puede echar un vistazo a archivo de política de Java .

Algunos problemas pueden verse en esta respuesta: https://stackoverflow.com/a/12854204/1343667

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top