Всем привет! Пытаюсь отравить строку по сети, используя сокеты... Сервер выглядит так:
| Код | using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;
using System.Net; using System.Net.Sockets; namespace SERV { class Program { static int port = 8005; // порт для приема входящих запросов static void Main(string[] args) { // получаем адреса для запуска сокета IPEndPoint ipPoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"), port); // создаем сокет Socket listenSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); try { // связываем сокет с локальной точкой, по которой будем принимать данные listenSocket.Bind(ipPoint);
// начинаем прослушивание listenSocket.Listen(10);
Console.WriteLine("Сервер запущен. Ожидание подключений...");
while (true) { Socket handler = listenSocket.Accept(); // получаем сообщение StringBuilder builder = new StringBuilder(); int bytes = 0; // количество полученных байтов byte[] data = new byte[256]; // буфер для получаемых данных
do { bytes = handler.Receive(data); builder.Append(Encoding.Unicode.GetString(data, 0, bytes)); } while (handler.Available > 0);
Console.WriteLine(DateTime.Now.ToShortTimeString() + ": " + builder.ToString());
// отправляем ответ string message = "ваше сообщение доставлено"; data = Encoding.Unicode.GetBytes(message); handler.Send(data); // закрываем сокет handler.Shutdown(SocketShutdown.Both); handler.Close(); } } catch (Exception ex) { Console.WriteLine(ex.Message); } } } }
|
А клиент так:
| Код | using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;
using System.Net; using System.Net.Sockets; namespace CLIENT { class Program { // адрес и порт сервера, к которому будем подключаться static int port = 8005; // порт сервера static string address = "127.0.0.1"; // адрес сервера //static string address = "192.168.0.2"; // адрес сервера static void Main(string[] args) { try { IPEndPoint ipPoint = new IPEndPoint(IPAddress.Parse(address), port);
Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); // подключаемся к удаленному хосту
socket.Connect(ipPoint); Console.Write("Введите сообщение:"); string message = Console.ReadLine(); byte[] data = Encoding.Unicode.GetBytes(message); socket.Send(data);
// получаем ответ data = new byte[256]; // буфер для ответа StringBuilder builder = new StringBuilder(); int bytes = 0; // количество полученных байт
do { bytes = socket.Receive(data, data.Length, 0); builder.Append(Encoding.Unicode.GetString(data, 0, bytes)); } while (socket.Available > 0); Console.WriteLine("ответ сервера: " + builder.ToString());
// закрываем сокет socket.Shutdown(SocketShutdown.Both); socket.Close(); } catch (Exception ex) { Console.WriteLine(ex.Message); } Console.Read(); } } }
|
При запуске на одном ПК все работает, сообщение отправляется клиентом и принимается сервером... Если пытаюсь запустить в локальной сети (или в инете, приложение-сервер кидаю на компьютер с белым IP) - не работает, вылетает Exception "Попытка установить соединение была безуспешной..." 1. Порт 8005 открыт на сервере, более того, отключал у себя файервол, при коннекте через инет убирал роутер и пытался работать напрямую - толку 0. 2. В локальной сети так же ничего не вышло, хотя компы были подключены напрямую, IP-адреса заданы явно (192.168.0.1-2), а фаерволы выключены.
3. Самое веселое, сделал пример из msdn, на TcpChannel https://msdn.microsoft.com/ru-ru/library/system.runtime.remoting.channels.tcp.tcpchannel(v=vs.110).aspx Создал общую ДЛЛку, создал клиент и сервер, (только порт поставил 8005). Запустил у себя с 127.0.0.1, затем на сервере в инете с белым IP - все работает, вроде, как надо. Клиент выдает количество случившихся коннектов к серверу. "The remote object has been called 4 times. - при 4 открытиях-закрытиях приложения клиента. У себя фаервол не отключал. Это я все к тому, что непроброшенные/закрыте порты, фаерволлы и т.п. - все это не причем.
Ребята, выручайте, почему на сокетах нифига не работает???
Ой я олень, я ж у сервера прописал IPAddress.Parse("127.0.0.1"), а надо IPAddress.Any. Вот тупоооой... |