[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

Gracias nuevamente por las respuestas ocasionadas.

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



Así lo binde:

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.Bind(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();
        }
    }
}


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

kub0x

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

Visita mi perfil en ResearchGate


DeMoNcRaZy

Cita de: 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.

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 (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 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("Servidor: {0}", Encoding.Default.GetString(buffer));

            Console.ReadKey();
        }
    }
}


Servidor:

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);
            sck.Bind(endPoint);
            Console.WriteLine("Conectando...");
            System.Threading.Thread.Sleep(1000);
            sck.Listen(0);
            Console.WriteLine("Se ha conectado correctamente.");

            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("Cliente: {0}", Encoding.Default.GetString(buffer));

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

            Console.ReadKey();
        }
    }
}


Lo que da un resultado similar a este:



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