Программирование сокетов на C # .NET: подключение к удаленным компьютерам - PullRequest
0 голосов
/ 07 апреля 2010

У меня есть типичный сервер и мой друг, использующий клиент для подключения к моему IP / порту, и он постоянно получает исключение: «Попытка подключения не удалась, поскольку подключенная сторона не ответила должным образом через некоторое время или не удалось установить соединение, так как подключенный хост не смог ответить {MY_IP}: {MY_PORT} "- Вам не нужно знать мой IP.

Клиент и сервер, однако, работают нормально по адресу обратной связи (127.0.0.1). У меня также нет брандмауэра и не активен брандмауэр Windows.

Сервер:

static void Main(string[] args)
        {
            Console.Title = "Socket Server";
            Console.WriteLine("Listening for messages...");

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

        IPAddress serverIP = IPAddress.Any;
        IPEndPoint serverEP = new IPEndPoint(serverIP, 33367);

        SocketPermission perm = new SocketPermission(NetworkAccess.Accept, TransportType.Tcp, "98.112.235.18", 33367);
        serverSock.Bind(serverEP);
        serverSock.Listen(10);

        while (true)
        {
            Socket connection = serverSock.Accept();

            Byte[] serverBuffer = new Byte[8];
            String message = String.Empty;

            while (connection.Available > 0)
            {
                int bytes = connection.Receive(
                    serverBuffer,
                    serverBuffer.Length,
                    0);

                message += Encoding.UTF8.GetString(
                    serverBuffer,
                    0,
                    bytes);
            }

            Console.WriteLine(message);
            connection.Close();
        }
    }

Клиент:

static void Main(string[] args)
    {
        // Design the client a bit
        Console.Title = "Socket Client";

        Console.Write("Enter the IP of the server: ");
        IPAddress clientIP = IPAddress.Parse(Console.ReadLine());
        String message = String.Empty;

        while (true)
        {
            Console.Write("Enter the message to send: ");
            // The messsage to send
            message = Console.ReadLine();

            IPEndPoint clientEP = new IPEndPoint(clientIP, 33367);

            // Setup the socket
            Socket clientSock = new Socket(
                AddressFamily.InterNetwork,
                SocketType.Stream,
                ProtocolType.Tcp);

            // Attempt to establish a connection to the server
            Console.Write("Establishing connection to the server... ");
            try
            {
                clientSock.Connect(clientEP);

                // Send the message
                clientSock.Send(Encoding.UTF8.GetBytes(message));
                clientSock.Shutdown(SocketShutdown.Both);
                clientSock.Close();
                Console.Write("Message sent successfully.\n\n");
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
        }
    }

Ответы [ 3 ]

0 голосов
/ 19 декабря 2012
while (connection.Available > 0)
        {
            int bytes = connection.Receive(
                serverBuffer,
                serverBuffer.Length,
                0);

            message += Encoding.UTF8.GetString(
                serverBuffer,
                0,
                bytes);
        }

Я не знаю причину (может быть, время), но количество доступных соединений всегда равно 0. Поэтому сервер не получает сообщение, отправленное клиентом.Удалите цикл while, и ваша программа будет работать без проблем.Я попробовал, и это сработало.

0 голосов
/ 18 февраля 2016

вам необходимо добавить разрешение, позволяющее сокету подключаться к определенной конечной точке, используя метод Assert (). Ниже может работать код сервера,

    static void Main(string[] args)
    {
        Console.Title = "Socket Server";
        Console.WriteLine("Listening for messages...");

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

    IPAddress serverIP = IPAddress.Any;
    IPEndPoint serverEP = new IPEndPoint(serverIP, 33367);

    SocketPermission perm = new SocketPermission(NetworkAccess.Accept, TransportType.Tcp, "98.112.235.18", 33367);
    perm.Assert();
    serverSock.Bind(serverEP);
    serverSock.Listen(10);

    while (true)
    {
        Socket connection = serverSock.Accept();

        Byte[] serverBuffer = new Byte[8];
        String message = String.Empty;

        while (connection.Available > 0)
        {
            int bytes = connection.Receive(
                serverBuffer,
                serverBuffer.Length,
                0);

            message += Encoding.UTF8.GetString(
                serverBuffer,
                0,
                bytes);
        }

        Console.WriteLine(message);
        connection.Close();
    }
}
0 голосов
/ 21 апреля 2010

Похоже, что это была ошибка на стороне клиента с некоторым брандмауэром.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...