elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.


 


Tema destacado: Sigue las noticias más importantes de elhacker.net en ttwitter!


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  .NET (Moderadores: Novlucker, seba123neo, kub0x, Eleкtro)
| | | |-+  Servidor socket TCP C#
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Servidor socket TCP C#  (Leído 768 veces)
FanAdmin

Desconectado Desconectado

Mensajes: 4


Ver Perfil
Servidor socket TCP C#
« en: 24 Julio 2017, 22:46 »

OPTÉ POR DEJAR ESTE TOPIC

Buenas, estoy creando un Cliente via Sockets en AS3, y su respectivo servidor en C#...
Funciona bien solo que el servidor C# solo lee la primera entrada que le envía el cliente al iniciar la conexión cliente servidor.
Luego el Cliente si envía packets, el servidor ya no lo escucha...
Y aquí les dejo el código:


ENTRADA PRINCIPAL DEL PROGRAMA EN C# CONSOLA
Código:
using System;
using SnapServer.SaptConn.Network;
using System.Net.Sockets;
using System.Net;

namespace SaptServer
{
    class Program
    {
        public const int Port = 8888;
        public static string[] ClientsOnline;
        static void Main(string[] args)
        {
            Server server = new Server();
            Server.serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            Server.serverSocket.Bind(new IPEndPoint(IPAddress.Any, Port));
            Server.serverSocket.Listen(999);

            Console.WriteLine(".:|_serVerYork_|:.");
            server.Start();
        }
    }
}


SERVER.CS
Código:
using System;
using System.Net;
using System.Net.Sockets;
using System.Text;

namespace
{
    class Server
    {
        public static Socket serverSocket, clientSocket;
        private byte[] buffer;

        public void Start()
        {
            clientSocket = serverSocket.Accept();
            buffer = new byte[clientSocket.ReceiveBufferSize];
            while (clientSocket.Available == 0)
            {
                receiveData();
            }
        }

        private void receiveData()
        {
                try
                {
                    int received = clientSocket.Receive(buffer);
                    if (received != 0)
                    {
                        Array.Resize(ref buffer, received);
                        string receivedMsg = UTF8Encoding.UTF8.GetString(buffer);
                        Array.Resize(ref buffer, clientSocket.ReceiveBufferSize);
                        if(receivedMsg.Contains("policy-file-request"))
                        {
                            if(Clients.OrganizarClientes(Convert.ToString(clientSocket.LocalEndPoint)))
                            {
                                sendMsg("<?xml version=\"1.0\"?><cross-domain-policy><allow-access-from domain=\"*\" to-ports=\"8888\" /></cross-domain-policy>");
                                clientSocket.Close();
                                Start();
                            } else {
                                Console.WriteLine("Nuevo cliente: " + clientSocket.LocalEndPoint);
                                sendMsg("<?xml version=\"1.0\"?><cross-domain-policy><allow-access-from domain=\"*\" to-ports=\"8888\" /></cross-domain-policy>");
                                clientSocket.Close();
                                Start();
                            }
                        } else {
                            Console.WriteLine("Cliente_" + clientSocket.LocalEndPoint + ": " + receivedMsg);
                            Messages.Messages.ClasificarMsg(receivedMsg);
                            Start();
                        }
                    } else { return; }
                } catch (Exception ex){}
            
            receiveData();
        }

        public static void sendMsg(string data)
        {
            clientSocket.Send(UTF8Encoding.UTF8.GetBytes(data));
            
        }
    }
}

// RESPONDO EL XML YA QUE EL SOCKET AS3 NECESITA EL ARCHIVO XML PARA PASAR POR EL PUERTO Y/O DOMINIO ASIGNADO EN EL XML...


CLIENTS.CS
Código:
using System;
using System.Collections.Generic;

namespace
{
    public class Clients
    {
        public static bool OrganizarClientes(string data)
        {
            string[] tmpStr = data.Split(':');
            List<string> tmpList = new List<string>();
            bool tmpBool = false;
            try
            {
                for (int i = 0; i < Program.ClientsOnline.Length; i++)
                {
                    tmpList.Add(Program.ClientsOnline[i]);
                    if (!(Program.ClientsOnline[i] == tmpStr[0])){ tmpBool = false; } else { tmpBool = true; break; }
                }
            }catch(Exception ex) { tmpBool = false; }
            if (tmpBool)
            {
                return true;
            }else { tmpList.Add(tmpStr[0]); Program.ClientsOnline = tmpList.ToArray(); return false; }
        }
    }
}


MESSAGES.CS
Código:
using System;

namespace
{
    class Messages
    {
        public static void ClasificarMsg(string data)
        {
            switch (data)
            {
                case ("Conexión establecida"):
                    Server.sendMsg("GoToLogin");
                    Console.WriteLine("Server: " + "GoToLogin");
                    break;

                 //else else...
            }
        }
    }
}


CLIENTE AS3:
Código:
var newSocket:Socket; // <- El tipo de Socket en AS3
newSocket = new Socket("IP", 8888);
newSocket.addEvent....
....

Quisiera saber que me recomendarían para este tipo de proyectos! Se acepta cualquier sugerencia... Saludos!


· Tema movido C# no es parte de C/C++, es .NET
>aquí las reglas del foro
-Engel Lex


« Última modificación: 3 Septiembre 2017, 18:25 por FranAdmin » En línea

ivancea96


Conectado Conectado

Mensajes: 3.203


ASMático


Ver Perfil WWW
Re: Servidor socket TCP C#
« Respuesta #1 en: 25 Julio 2017, 13:46 »

Hay varias cosas que deberías reestructurar.
Una de ellas es que creas el serverSocket desde fuera. Sería más correcto que lo creases, bindeases y lo pusieras a escuchar dentro del método Start, pasándole los parámetros. Pero bueno, esto es secundario actualmente.

El principal problema es el Start y el receiveData. ReceiveData es una función recursiva. ¿Por qué? Dentro del Start la llamas en bucle, para qué hacerla recursiva. Sería preferible cambiar la recursión por un bucle. Y bueno, no solo es recursiva sino que llama a Start. Este flujo pues... ¿Esperas que la función "receiveData" acepte a otros clientes? Si quieres que tras un cliente, espere a otro, entonces pon un bucle dentro de la función Start, por ejemplo.

Y luego, en la función Start, tienes un bucle que es "while(Available == 0)". Mientras que no haya datos, leemos datos. ¿Y qué ocurre si cuando llegamos a este punto ya hay datos?


En línea

FanAdmin

Desconectado Desconectado

Mensajes: 4


Ver Perfil
Re: Servidor socket TCP C#
« Respuesta #2 en: 25 Julio 2017, 17:52 »

Intenté cambiar el código pero sigue resultando lo mismo...

Nuevo SERVER.CS:
Código
  1. using System;
  2. using System.Net;
  3. using System.Text;
  4. namespace
  5. {
  6.    class Server
  7.    {
  8.        public static Socket serverSocket, clientSocket;
  9.        public const int Port = 8888;
  10.        private byte[] buffer;
  11.  
  12.        public void Start()
  13.        {
  14.            //Server server = new Server();
  15.            //Server.serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
  16.            //Server.serverSocket.Bind(new IPEndPoint(IPAddress.Any, Port));
  17.            Server.serverSocket.Listen(999);
  18.            clientSocket = serverSocket.Accept();
  19.            buffer = new byte[clientSocket.ReceiveBufferSize];
  20.            while (buffer.Length > 0)
  21.            {
  22.                try
  23.                {
  24.                    int received = clientSocket.Receive(buffer);
  25.                    if (received != 0)
  26.                    {
  27.                        Array.Resize(ref buffer, received);
  28.                        string receivedMsg = UTF8Encoding.UTF8.GetString(buffer);
  29.                        Array.Resize(ref buffer, clientSocket.ReceiveBufferSize);
  30.                        if (receivedMsg.Contains("policy-file-request"))
  31.                        {
  32.                            if (Clients.OrganizarClientes(Convert.ToString(clientSocket.LocalEndPoint)))
  33.                            {
  34.                                sendMsg("<?xml version=\"1.0\"?><cross-domain-policy><allow-access-from domain=\"*\" to-ports=\"8888\" /></cross-domain-policy>");
  35.                                clientSocket.Close();
  36.                                Start();
  37.                            }
  38.                            else
  39.                            {
  40.                                Console.WriteLine("Nuevo cliente: " + clientSocket.LocalEndPoint);
  41.                                sendMsg("<?xml version=\"1.0\"?><cross-domain-policy><allow-access-from domain=\"*\" to-ports=\"8888\" /></cross-domain-policy>");
  42.                                clientSocket.Close();
  43.                                Start();
  44.                            }
  45.                        }
  46.                        else
  47.                        {
  48.                            Console.WriteLine("Cliente" + clientSocket.LocalEndPoint + ": " + receivedMsg);
  49.                            Messages.Messages.ClasificarMsg(receivedMsg);
  50.                            Start();
  51.                        }
  52.                    }
  53.                    else { return; }
  54.                }
  55.                catch (Exception ex) { }
  56.            } Start();
  57.        }
  58.  
  59.        public static void sendMsg(string data)
  60.        {
  61.            clientSocket.Send(UTF8Encoding.UTF8.GetBytes(data));
  62.  
  63.        }
  64.    }
  65. }

Lo que ocurre en el emulador al ejecutarlo e iniciar el cliente es:

Nuevo Cliente: IP:8888
Cliente: Conexión establecida
Servidor: TestMensaje

Y en el Cliente se visualiza el mensaje "TestMensaje"...

Pero en cambio, el cliente envía un packet cada 1 segundo, pero no se visualiza en el servidor...
« Última modificación: 25 Julio 2017, 18:11 por FranAdmin » En línea

ivancea96


Conectado Conectado

Mensajes: 3.203


ASMático


Ver Perfil WWW
Re: Servidor socket TCP C#
« Respuesta #3 en: 25 Julio 2017, 22:58 »

Si esque no has cambiado casi nada, solo un par de líneas. El resto, ha sido meter la función antigua (que estaba bien, salvo algunas correcciones) en la funcion Start. Sepáralas de nuevo, es bueno separar el código en funciones. Pero hayq eu distinguir bien qué es exactamente lo que va a hacer cada función.
Tu función receiveData lo que hacía era recibir los datos, bien, y cerrar el socket y pedir otro cliente y recibir sus datos y etc...
Eso no es una función con una utilidad clara.

Limítate a hacer, por ejemplo, esto:
Código:
Start: Bucle { aceptar cliente, trabajar los datos de ese cliente (llamando a receiveData }
ReceiveData: Enviar y recibir datos. Nada más (no llamas a Start ni llamas recursivamente a receiveData. Si quieres recibir más datos o esperar, si tal, harás un bucle

En fin, el resumen de esto es que los métodos deben tener una utilidad clara. Métodos que se llaman de forma circular (Start -> ReceiveData -> Start) pueden ser peligrosos, y en este caso en concreto, no es el momento de usarlo. Divide la función Start en pasos: Recibir cliente, manejar el cliente. Luego, si algún paso es grande (Manejar el cliente), lo mueves a un método privado. Luego, divide y analiza ese método privado.
En línea

Rekt

Desconectado Desconectado

Mensajes: 4


Ver Perfil
Re: Servidor socket TCP C#
« Respuesta #4 en: 2 Septiembre 2017, 17:06 »

Esperas saber programar un boombang desde 0 sin saber nisiquiera como funciona un bucle?  :silbar:.
Tu problema principal es que solo lees una vez lo que el cliente te envía y que estas reinventando la rueda.
En línea

AlbertoBSD
💻🌎🌍🌏🌐 NWO📱
Colaborador
***
Desconectado Desconectado

Mensajes: 3.088


Libertad!!!!!


Ver Perfil WWW
Re: Servidor socket TCP C#
« Respuesta #5 en: 2 Septiembre 2017, 17:19 »

Tu problema principal es que solo lees una vez lo que el cliente te envía y que estas reinventando la rueda.

Opinaria lo mismo que Rekt sobre reinventar la Rueda, C# generalemente ya tiene una API para cualquier cosa, Enviar correso, Enviar peticiones WEB, SQL etc... etc...

Si programas desde 0 (Reinventando la Rueda) Esta bien con fines didacticos e incluso siento yo que aprendes mejor. Pero si te faltan bases sobre como funcionan los ciclos e incluso como funcionan las conexiones TCP/IP entre otros puede salir contraproducente. Te puedes confundir muy facilmente e incluso terminar Frustrado.

Saludos!
En línea

Crackeame si puedes Wallet.dat
FanAdmin

Desconectado Desconectado

Mensajes: 4


Ver Perfil
Re: Servidor socket TCP C#
« Respuesta #6 en: 3 Septiembre 2017, 18:20 »

Esperas saber programar un boombang desde 0 sin saber nisiquiera como funciona un bucle?  :silbar:.
Tu problema principal es que solo lees una vez lo que el cliente te envía y que estas reinventando la rueda.

Buenas tardes, no se bien a qué te refieres, soy sincero, lo único que hice es buscar conexiones de sockets para mí app en Google.
Si así mismo, eso me sucedía, pero ya opte por dejarlo. Saludos!
En línea

FanAdmin

Desconectado Desconectado

Mensajes: 4


Ver Perfil
Re: Servidor socket TCP C#
« Respuesta #7 en: 3 Septiembre 2017, 18:23 »

Opinaria lo mismo que Rekt sobre reinventar la Rueda, C# generalemente ya tiene una API para cualquier cosa, Enviar correso, Enviar peticiones WEB, SQL etc... etc...

Si programas desde 0 (Reinventando la Rueda) Esta bien con fines didacticos e incluso siento yo que aprendes mejor. Pero si te faltan bases sobre como funcionan los ciclos e incluso como funcionan las conexiones TCP/IP entre otros puede salir contraproducente. Te puedes confundir muy facilmente e incluso terminar Frustrado.

Saludos!

Buenas tardes, si estoy de acuerdo con ustedes dos, fue una mala idea meterme con conexiones TCP vía sockets a primera vista sin entender su funcionamiento, por esto opte por estudiar de 0 como me lo planteaste y poco a poco voy entendiendo mejor. Saludos!!
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Socket C, programa servidor
Programación General
Rentero 2 792 Último mensaje 16 Junio 2004, 18:50
por Rentero
cliente/servidor socket « 1 2 »
Programación Visual Basic
mig5ueles 11 2,164 Último mensaje 22 Enero 2007, 20:47
por mig5ueles
Socket / cliente servidor
Java
danielo- 4 11,473 Último mensaje 2 Octubre 2009, 23:19
por Debci
socket cliente y servidor c++ / linux
Programación C/C++
d00ze13 0 3,044 Último mensaje 28 Abril 2011, 18:38
por d00ze13
Socket java Servidor Cliente
Java
momo1234 2 2,560 Último mensaje 12 Mayo 2012, 16:57
por momo1234
Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines