Foro de elhacker.net

Programación => .NET (C#, VB.NET, ASP) => Mensaje iniciado por: DeMoNcRaZy en 30 Agosto 2015, 17:55 pm



Título: [C#] Conectar Socket (denegación)
Publicado por: DeMoNcRaZy en 30 Agosto 2015, 17:55 pm
Buenas,

Tengo un problema a la hora de estableces una conexión socket con la pc.

Código
  1. IPEndPoint endPoint = new IPEndPoint(IPAddress.Parse("89.140.16.6"), 80);
  2. sck.Connect(endPoint);

Y me salta este error:

(http://i.imgur.com/Oqg3ACJ.png)

Me dice que el equipo denegó la conexión, y la IP que tengo colocada es la que me aparece en:http://www.cual-es-mi-ip.net/ (http://www.cual-es-mi-ip.net/)  
PD: No tengo ningún puerto abierto. (modem)

He pensado en bajarme Xampp y cambiar la ip por localhost pero no se si funcionará en W10 y si funcionará como espero.

Su supieran a que se debe dicho error lo agradecería.
Cualquier información adicional es bienvenida.

Saludos.


Título: Re: [C#] Conectar Socket (denegación)
Publicado por: kondrag_X1 en 30 Agosto 2015, 18:04 pm
si trabajas en tu propia máquina porque no usas 127.0.0.1???


Título: Re: [C#] Conectar Socket (denegación)
Publicado por: DeMoNcRaZy en 30 Agosto 2015, 18:19 pm
si trabajas en tu propia máquina porque no usas 127.0.0.1???

Gracias por tu respuesta.
Parece funcionar en la clase Client.

Pero en la parte Server tengo esto:

Código
  1. Socket sck = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
  2.  
  3. sck.Bind(new IPEndPoint(127.0.0.1, 80));
  4. sck.Listen(0);
  5.  

Y me marca error en IPEndPoint:

(http://i.imgur.com/oaxHvJ2.png)

Cuando me debería aceptar el mismo parámetro que en Client, pero no.

Saludos.


Título: Re: [C#] Conectar Socket (denegación)
Publicado por: Eleкtro en 30 Agosto 2015, 22:58 pm
me marca error en IPEndPoint:

(http://i.imgur.com/oaxHvJ2.png)

Fíjate bien en el mensaje de error, ¿qué te dice?, que no hay ningún constructor que acepte 4 parámetros, por ende, hazte la siguiente pregunta:
¿Qué estoy haciendo mal para que detecte estar pasándole 4 argumentos en lugar de dos?.

Cuando me debería aceptar el mismo parámetro que en Client, pero no.

Es obvio que el código no puede compilar ya que hay un error de sintaxis, no puedes escribir una IP tal cual, se espera un valor entero y no puede contener puntos, lo que escribiste no es "nada", pero es que de todas formas no le estás intentando pasar el mismo valor. ya que en la primera imagen usas el overload que toma cómo argumento un objeto IPAddress, y en la segunda imagen, la del error, intentas utilizar el constructor que toma cómo argumento un valor Int64, intentando pasarle cómo argumento una IP tal cual, la cual obviamente no sep uede reconocer como un valor entero...

En la primera imagen usas la función Parse para parsear una cadena de texto que contiene una IP, hay mucha diferencia, en la segunda imagen no lo haces, usas el otro constructor.

Saludos


Título: Re: [C#] Conectar Socket (denegación)
Publicado por: DeMoNcRaZy en 30 Agosto 2015, 23:41 pm
Gracias por tu respuesta.

Creo que era problema al darle valor.

Ahora el problema es que me deniegan el acceso al socket:

(http://i.imgur.com/sXtMvwo.png)

La cosa es que en cliente me va bien, me muestra "introduzca el mensaje":

Código
  1. Socket sck = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
  2.  
  3.            IPEndPoint endPoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 80);
  4.            sck.Connect(endPoint);
  5.  
  6.            Console.WriteLine("Introduzca su mensaje: ");
  7.            string msg = Console.ReadLine();
  8.  
  9.            byte[] msgBuffer = Encoding.Default.GetBytes(msg);
  10.            sck.Send(msgBuffer, 0, msgBuffer.Length, 0);
  11.  
  12.            byte[] buffer = new byte[255];
  13.  
  14.            int rec = sck.Receive(buffer, 0, buffer.Length, 0);
  15.  
  16.            Array.Resize(ref buffer, rec);
  17.  
  18.            Console.WriteLine("Recibo: {0}", Encoding.Default.GetString(buffer));
  19.  
  20.            Console.ReadKey

Y el problema me lo da en el servidor al ejecutarlo:
Código
  1. Socket sck = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
  2.  
  3.            IPEndPoint endPoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 80);
  4.            sck.Bind(endPoint);
  5.            sck.Listen(0);
  6.  
  7.            Socket acc = sck.Accept();
  8.  
  9.            byte[] buffer = Encoding.Default.GetBytes("Hola Client!");
  10.            acc.Send(buffer, 0, buffer.Length, 0);
  11.  
  12.            buffer = new byte[255];
  13.  
  14.            int rec = acc.Receive(buffer, 0, buffer.Length, 0);
  15.  
  16.            Array.Resize(ref buffer, rec);
  17.  
  18.            Console.WriteLine("Mostrando: {0}", Encoding.Default.GetString(buffer));
  19.  
  20.            sck.Close();
  21.            acc.Close();
  22.  
  23.            Console.ReadKey();

¿A que puede deberse esto? ¿Puede estar ocupado el sockets?

Saludos.


Título: Re: [C#] Conectar Socket (denegación)
Publicado por: kub0x en 31 Agosto 2015, 01:35 am
Buenas!

He ejecutado tu snippet y va perfecto. Ahora, el método main me queda así:

Código
  1. static void Main(string[] args)
  2.        {
  3.            System.Threading.Thread t = new System.Threading.Thread(Listen);
  4.            t.Start();
  5.            System.Threading.Thread.Sleep(1000);
  6.            Connect();
  7.        }

Debes de hacer un método para el Listen y otro para el Connect y primero llamas al Listen desde el hilo, esperas 1 seg y llamas a Connect.

No he tocado nada de tu code. Pruébalo y nos cuentas.

Saludos.


Título: Re: [C#] Conectar Socket (denegación)
Publicado por: DeMoNcRaZy en 31 Agosto 2015, 02:18 am
Gracias por su respuesta.
He logrado algo más, pero me he quedado un poco atrancado por acá.

Tengo esto en server:

Código
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Net;
  5. using System.Net.Sockets;
  6. using System.Text;
  7. using System.Threading.Tasks;
  8.  
  9. namespace Server
  10. {
  11.    class Program
  12.    {
  13.        static void Main(string[] args)
  14.        {
  15.            Socket sck = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
  16.  
  17.            IPEndPoint endPoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 80);
  18.            System.Threading.Thread.Sleep(1000);
  19.            sck.Connect(endPoint);
  20.            sck.Listen(0);
  21.  
  22.  
  23.            Socket acc = sck.Accept();
  24.  
  25.            byte[] buffer = Encoding.Default.GetBytes("Hola Client!");
  26.            acc.Send(buffer, 0, buffer.Length, 0);
  27.  
  28.            buffer = new byte[255];
  29.  
  30.            int rec = acc.Receive(buffer, 0, buffer.Length, 0);
  31.  
  32.            Array.Resize(ref buffer, rec);
  33.  
  34.            Console.WriteLine("Mostrando: {0}", Encoding.Default.GetString(buffer));
  35.  
  36.            sck.Close();
  37.            acc.Close();
  38.  
  39.            Console.ReadKey();
  40.        }
  41.    }
  42. }
  43.  

Si no coloco:
Código
  1. sck.Listen(0);

Me da este mensaje:

(http://i.imgur.com/ieNWuNJ.png)

Y si coloco el sck.Listen(0) me da esto:

(http://i.imgur.com/Okhp46O.png)

Parece que fallo en algo... y no doy con ello. Disculpa las molestias ocasionadas.

Y aquí por si quiere ver la parte client (aquí creo que no me pasa nada ya que lo inicio y me dice que ingrese un mensaje, pero no recibo respuestas):

Código
  1. using System.Collections.Generic;
  2. using System.Linq;
  3. using System.Net;
  4. using System.Net.Sockets;
  5. using System.Text;
  6. using System.Threading.Tasks;
  7.  
  8. namespace Client
  9. {
  10.    class Program
  11.    {
  12.        static void Main(string[] args)
  13.        {
  14.            Socket sck = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
  15.  
  16.            IPEndPoint endPoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 80);
  17.            sck.Connect(endPoint);
  18.  
  19.            Console.WriteLine("Introduzca su mensaje: ");
  20.            string msg = Console.ReadLine();
  21.  
  22.            byte[] msgBuffer = Encoding.Default.GetBytes(msg);
  23.            sck.Send(msgBuffer, 0, msgBuffer.Length, 0);
  24.  
  25.            byte[] buffer = new byte[255];
  26.  
  27.            int rec = sck.Receive(buffer, 0, buffer.Length, 0);
  28.  
  29.            Array.Resize(ref buffer, rec);
  30.  
  31.            Console.WriteLine("Recibo: {0}", Encoding.Default.GetString(buffer));
  32.  
  33.            Console.ReadKey();
  34.        }
  35.    }
  36. }

Lo tengo ordenados por 2 proyectos, osea Client y Server.

(http://i.imgur.com/qxuwb0z.png)

Gracias de nuevo.
Más o menos me acerco más al problema. Pero no se es raro.

Saludos.


Título: Re: [C#] Conectar Socket (denegación)
Publicado por: kub0x en 31 Agosto 2015, 02:24 am
¿Por que en el server haces un connect antes que el listen? El server bindea y escucha nada más, el cliente sólo conecta.

Primero ejecuta el server, déjalo en segundo plano corriendo y acto seguido ejecuta el cliente, dos .exe independientes como bien dices. Debería funcionar.

Si no sigues los pasos descritos seguirá teniendo problemas. Suerte y nos cuentas ;)

Saludos.


Título: Re: [C#] Conectar Socket (denegación)
Publicado por: DeMoNcRaZy en 31 Agosto 2015, 02:41 am
Me quedo atrapado en escuchar el listen.

Código
  1. //System.Threading.Thread t = new System.Threading.Thread(endPoint);

No logro encontrar que valor devolverle. Pongo endPoint o sck y me subraya en error.

Por lo que he intentado hacerlo así:

Código
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Net;
  5. using System.Net.Sockets;
  6. using System.Text;
  7. using System.Threading.Tasks;
  8.  
  9. namespace Server
  10. {
  11.    class Program
  12.    {
  13.        static void Main(string[] args)
  14.        {
  15.            Socket sck = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
  16.  
  17.            IPEndPoint endPoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 80);
  18.            //System.Threading.Thread t = new System.Threading.Thread(endPoint);
  19.            sck.Listen(0);
  20.            System.Threading.Thread.Sleep(1000);
  21.            sck.Connect(endPoint);
  22.  
  23.  
  24.            Socket acc = sck.Accept();
  25.  
  26.            byte[] buffer = Encoding.Default.GetBytes("Hola Client!");
  27.            acc.Send(buffer, 0, buffer.Length, 0);
  28.  
  29.            buffer = new byte[255];
  30.  
  31.            int rec = acc.Receive(buffer, 0, buffer.Length, 0);
  32.  
  33.            Array.Resize(ref buffer, rec);
  34.  
  35.            Console.WriteLine("Mostrando: {0}", Encoding.Default.GetString(buffer));
  36.  
  37.            sck.Close();
  38.            acc.Close();
  39.  
  40.            Console.ReadKey();
  41.        }
  42.    }
  43. }
  44.  

Pero me marca que no le paso al sck.Listen un argumento válido.

(http://i.imgur.com/C8NqR9e.png)

Gracias y disculpe las molestias ocacionadas.

Saludos.


Título: Re: [C#] Conectar Socket (denegación)
Publicado por: kub0x en 31 Agosto 2015, 02:54 am
Buenas de nuevo.

En ese code antes del Listen de falta bindear el socket al EndPoint que has instanciado justo una linea arriba.

Recuerda:

El server primero instancia el endpoint, se bindea o se liga o se asocia (sinónimos de bindear) al endpoint y luego se hace el listen.

Una vez que el listen veas que funciona se corre el cliente y el server debería aceptarlo.

Saludos!


Título: Re: [C#] Conectar Socket (denegación)
Publicado por: DeMoNcRaZy en 31 Agosto 2015, 03:09 am
Gracias nuevamente por las respuestas ocasionadas.

Cuando intento bindear ya me salta al mismo error que tenía al principio:

(http://i.imgur.com/GJo45bW.png)

Así lo binde:

Código
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Net;
  5. using System.Net.Sockets;
  6. using System.Text;
  7. using System.Threading.Tasks;
  8.  
  9. namespace Server
  10. {
  11.    class Program
  12.    {
  13.        static void Main(string[] args)
  14.        {
  15.            Socket sck = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
  16.  
  17.            IPEndPoint endPoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 80);
  18.            //System.Threading.Thread t = new System.Threading.Thread(endPoint);
  19.            sck.Bind(endPoint);
  20.            sck.Listen(0);
  21.            System.Threading.Thread.Sleep(1000);
  22.            sck.Connect(endPoint);
  23.  
  24.  
  25.            Socket acc = sck.Accept();
  26.  
  27.            byte[] buffer = Encoding.Default.GetBytes("Hola Client!");
  28.            acc.Send(buffer, 0, buffer.Length, 0);
  29.  
  30.            buffer = new byte[255];
  31.  
  32.            int rec = acc.Receive(buffer, 0, buffer.Length, 0);
  33.  
  34.            Array.Resize(ref buffer, rec);
  35.  
  36.            Console.WriteLine("Mostrando: {0}", Encoding.Default.GetString(buffer));
  37.  
  38.            sck.Close();
  39.            acc.Close();
  40.  
  41.            Console.ReadKey();
  42.        }
  43.    }
  44. }
  45.  

Ejecuto siempre primero Server y luego Client. Aunque lo haga viceversa me salta el error en Server.

Pero esto ahora es raro no se por que me da permiso denegado.. ya esto no sería fallo del código ¿no?

Muchas gracias.

Saludos.


Título: Re: [C#] Conectar Socket (denegación)
Publicado por: kub0x en 31 Agosto 2015, 03:18 am
Vale ya se me ocurre, y seguramente sea eso. El socket que intentas abrir ya está reservado por el sistema, fíjate si no existe otro proceso escuchando en el puerto 80.

Si fuese el caso y necesitarás dicho proceso, podrías aplicar la técnica de TCP port stealing la cual permite bindear/asociarse al mismo puerto que otra aplicación, aunque creo que había que especificar una flag para reutilizar el socket.

No tiene que ver con el fallo en cuestión, pero en el code de tu server después de hacer Listen intentas conectar, cosa que arrojará una excepción ya que el socket está siendo utilizado para la escucha. Para eso tienes el cliente, que será otro .exe u otro hilo/subproceso dentro del mismo proceso.

Ya tienes para probar.. Y recuerda, si el server escucha, no conectes desde el mismo.

Saludos.


Título: Re: [C#] Conectar Socket (denegación)
Publicado por: DeMoNcRaZy en 31 Agosto 2015, 21:46 pm
Vale ya se me ocurre, y seguramente sea eso. El socket que intentas abrir ya está reservado por el sistema, fíjate si no existe otro proceso escuchando en el puerto 80.

Si fuese el caso y necesitarás dicho proceso, podrías aplicar la técnica de TCP port stealing la cual permite bindear/asociarse al mismo puerto que otra aplicación, aunque creo que había que especificar una flag para reutilizar el socket.

No tiene que ver con el fallo en cuestión, pero en el code de tu server después de hacer Listen intentas conectar, cosa que arrojará una excepción ya que el socket está siendo utilizado para la escucha. Para eso tienes el cliente, que será otro .exe u otro hilo/subproceso dentro del mismo proceso.

Ya tienes para probar.. Y recuerda, si el server escucha, no conectes desde el mismo.

Saludos.

Gracias por la ayuda.
Al parecer no me dejaba acceder por que el IIS ocupaba el puerto 80.

Ahora parece funcionar debidamente.

Dejo aquí el código para utilidad.

Cliente:

Código
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Net;
  5. using System.Net.Sockets;
  6. using System.Text;
  7. using System.Threading.Tasks;
  8.  
  9. namespace Client
  10. {
  11.    class Program
  12.    {
  13.        static void Main(string[] args)
  14.        {
  15.            Socket sck = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
  16.  
  17.            IPEndPoint endPoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 80);
  18.            sck.Connect(endPoint);
  19.  
  20.            Console.WriteLine("Introduzca su mensaje:");
  21.            string msg = Console.ReadLine();
  22.  
  23.            byte[] msgBuffer = Encoding.Default.GetBytes(msg);
  24.            sck.Send(msgBuffer, 0, msgBuffer.Length, 0);
  25.  
  26.            byte[] buffer = new byte[255];
  27.  
  28.            int rec = sck.Receive(buffer, 0, buffer.Length, 0);
  29.  
  30.            Array.Resize(ref buffer, rec);
  31.  
  32.            Console.WriteLine("Servidor: {0}", Encoding.Default.GetString(buffer));
  33.  
  34.            Console.ReadKey();
  35.        }
  36.    }
  37. }
  38.  

Servidor:

Código
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Net;
  5. using System.Net.Sockets;
  6. using System.Text;
  7. using System.Threading.Tasks;
  8.  
  9. namespace Server
  10. {
  11.    class Program
  12.    {
  13.        static void Main(string[] args)
  14.        {
  15.            Socket sck = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
  16.  
  17.            IPEndPoint endPoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 80);
  18.            sck.Bind(endPoint);
  19.            Console.WriteLine("Conectando...");
  20.            System.Threading.Thread.Sleep(1000);
  21.            sck.Listen(0);
  22.            Console.WriteLine("Se ha conectado correctamente.");
  23.  
  24.            Socket acc = sck.Accept();
  25.  
  26.            byte[] buffer = Encoding.Default.GetBytes("Hola Client!");
  27.            acc.Send(buffer, 0, buffer.Length, 0);
  28.  
  29.            buffer = new byte[255];
  30.  
  31.            int rec = acc.Receive(buffer, 0, buffer.Length, 0);
  32.  
  33.            Array.Resize(ref buffer, rec);
  34.  
  35.            Console.WriteLine("Cliente: {0}", Encoding.Default.GetString(buffer));
  36.  
  37.            sck.Close();
  38.            acc.Close();
  39.  
  40.            Console.ReadKey();
  41.        }
  42.    }
  43. }
  44.  

Lo que da un resultado similar a este:

(http://i.imgur.com/PcKazrU.png)

Saludos.