[C#] Conectar Socket (denegación)

Iniciado por DeMoNcRaZy, 30 Agosto 2015, 17:55 PM

0 Miembros y 1 Visitante están viendo este tema.

DeMoNcRaZy

Buenas,

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

Código (csharp) [Seleccionar]
IPEndPoint endPoint = new IPEndPoint(IPAddress.Parse("89.140.16.6"), 80);
sck.Connect(endPoint);


Y me salta este error:



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/  
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.
Esta página web no está disponible - Google Chrome

kondrag_X1

si trabajas en tu propia máquina porque no usas 127.0.0.1???

DeMoNcRaZy

Cita de: kondrag_X1 en 30 Agosto 2015, 18:04 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 (csharp) [Seleccionar]

Socket sck = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

sck.Bind(new IPEndPoint(127.0.0.1, 80));
sck.Listen(0);


Y me marca error en IPEndPoint:



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

Saludos.
Esta página web no está disponible - Google Chrome

Eleкtro

#3
Cita de: YuseTist en 30 Agosto 2015, 18:19 PMme marca error en IPEndPoint:


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?.

Cita de: YuseTist en 30 Agosto 2015, 18:19 PMCuando 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








DeMoNcRaZy

Gracias por tu respuesta.

Creo que era problema al darle valor.

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



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

Código (csharp) [Seleccionar]
Socket sck = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

            IPEndPoint endPoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 80);
            sck.Connect(endPoint);

            Console.WriteLine("Introduzca su mensaje: ");
            string msg = Console.ReadLine();

            byte[] msgBuffer = Encoding.Default.GetBytes(msg);
            sck.Send(msgBuffer, 0, msgBuffer.Length, 0);

            byte[] buffer = new byte[255];

            int rec = sck.Receive(buffer, 0, buffer.Length, 0);

            Array.Resize(ref buffer, rec);

            Console.WriteLine("Recibo: {0}", Encoding.Default.GetString(buffer));

            Console.ReadKey


Y el problema me lo da en el servidor al ejecutarlo:
Código (csharp) [Seleccionar]

Socket sck = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

            IPEndPoint endPoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 80);
            sck.Bind(endPoint);
            sck.Listen(0);

            Socket acc = sck.Accept();

            byte[] buffer = Encoding.Default.GetBytes("Hola Client!");
            acc.Send(buffer, 0, buffer.Length, 0);

            buffer = new byte[255];

            int rec = acc.Receive(buffer, 0, buffer.Length, 0);

            Array.Resize(ref buffer, rec);

            Console.WriteLine("Mostrando: {0}", Encoding.Default.GetString(buffer));

            sck.Close();
            acc.Close();

            Console.ReadKey();


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

Saludos.
Esta página web no está disponible - Google Chrome

kub0x

Buenas!

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

Código (csharp) [Seleccionar]
static void Main(string[] args)
        {
            System.Threading.Thread t = new System.Threading.Thread(Listen);
            t.Start();
            System.Threading.Thread.Sleep(1000);
            Connect();
        }


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.
Viejos siempre viejos,
Ellos tienen el poder,
Y la juventud,
¡En el ataúd! Criaturas Al poder.

Visita mi perfil en ResearchGate


DeMoNcRaZy

Gracias por su respuesta.
He logrado algo más, pero me he quedado un poco atrancado por acá.

Tengo esto en server:

Código (csharp) [Seleccionar]

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading.Tasks;

namespace Server
{
    class Program
    {
        static void Main(string[] args)
        {
            Socket sck = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
       
            IPEndPoint endPoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 80);
            System.Threading.Thread.Sleep(1000);
            sck.Connect(endPoint);
            sck.Listen(0);


            Socket acc = sck.Accept();

            byte[] buffer = Encoding.Default.GetBytes("Hola Client!");
            acc.Send(buffer, 0, buffer.Length, 0);

            buffer = new byte[255];

            int rec = acc.Receive(buffer, 0, buffer.Length, 0);

            Array.Resize(ref buffer, rec);

            Console.WriteLine("Mostrando: {0}", Encoding.Default.GetString(buffer));

            sck.Close();
            acc.Close();

            Console.ReadKey();
        }
    }
}


Si no coloco:
Código (csharp) [Seleccionar]
sck.Listen(0);

Me da este mensaje:



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



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 (csharp) [Seleccionar]
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading.Tasks;

namespace Client
{
    class Program
    {
        static void Main(string[] args)
        {
            Socket sck = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

            IPEndPoint endPoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 80);
            sck.Connect(endPoint);

            Console.WriteLine("Introduzca su mensaje: ");
            string msg = Console.ReadLine();

            byte[] msgBuffer = Encoding.Default.GetBytes(msg);
            sck.Send(msgBuffer, 0, msgBuffer.Length, 0);

            byte[] buffer = new byte[255];

            int rec = sck.Receive(buffer, 0, buffer.Length, 0);

            Array.Resize(ref buffer, rec);

            Console.WriteLine("Recibo: {0}", Encoding.Default.GetString(buffer));

            Console.ReadKey();
        }
    }
}


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



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

Saludos.
Esta página web no está disponible - Google Chrome

kub0x

¿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.
Viejos siempre viejos,
Ellos tienen el poder,
Y la juventud,
¡En el ataúd! Criaturas Al poder.

Visita mi perfil en ResearchGate


DeMoNcRaZy

Me quedo atrapado en escuchar el listen.

Código (csharp) [Seleccionar]
//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 (csharp) [Seleccionar]

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading.Tasks;

namespace Server
{
    class Program
    {
        static void Main(string[] args)
        {
            Socket sck = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
       
            IPEndPoint endPoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 80);
            //System.Threading.Thread t = new System.Threading.Thread(endPoint);
            sck.Listen(0);
            System.Threading.Thread.Sleep(1000);
            sck.Connect(endPoint);


            Socket acc = sck.Accept();

            byte[] buffer = Encoding.Default.GetBytes("Hola Client!");
            acc.Send(buffer, 0, buffer.Length, 0);

            buffer = new byte[255];

            int rec = acc.Receive(buffer, 0, buffer.Length, 0);

            Array.Resize(ref buffer, rec);

            Console.WriteLine("Mostrando: {0}", Encoding.Default.GetString(buffer));

            sck.Close();
            acc.Close();

            Console.ReadKey();
        }
    }
}


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



Gracias y disculpe las molestias ocacionadas.

Saludos.
Esta página web no está disponible - Google Chrome

kub0x

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!
Viejos siempre viejos,
Ellos tienen el poder,
Y la juventud,
¡En el ataúd! Criaturas Al poder.

Visita mi perfil en ResearchGate