Доброго здоровья, уважаемые!
Столкнулся недавно с такой траблой. Решил сделать TCP сервер, до этого работал с HTTP протоколом, никогда такого не было. Бессовестно передрал код у Либерти, немного своего добавил:Код | using System; using System.Data; using System.IO; using System.Net; using System.Net.Sockets;
public class AsyncTcpServer { private string host = "127.0.0.1"; private int port = 9999;
public static void Main() { AsyncTcpServer app = new AsyncTcpServer(); app.Run(); }
private void Run() { Console.WriteLine("***************TCP Server***************\r\n"); try { IPAddress ipHost;
if (!IPAddress.TryParse(host, out ipHost)) { Console.WriteLine("Ошибка! Неверный адрес"); return; }
TcpListener listener = new TcpListener(ipHost, port); listener.Start();
for (; ; ) { Socket socketForClient = listener.AcceptSocket(); if (socketForClient.Connected) { Console.WriteLine("Client connected"); ClientHandler handler = new ClientHandler(socketForClient); handler.StartRead(); } } } catch (Exception ex) { Console.WriteLine("Ошибка. " + ex.Message + "\r\nНажмите 'Enter' для выхода"); Console.ReadLine(); } }
class ClientHandler { private byte[] buffer; private Socket socket; private NetworkStream networkStream; private AsyncCallback callbackRead; private AsyncCallback callbackWrite;
public ClientHandler(Socket socketForClient) { socket = socketForClient; buffer = new byte[256]; networkStream = new NetworkStream(socketForClient); callbackRead = new AsyncCallback(this.OnReadComplete); callbackWrite = new AsyncCallback(this.OnWriteComplete); }
public void StartRead() { networkStream.BeginRead(buffer, 0, buffer.Length, callbackRead, null); }
private void OnReadComplete(IAsyncResult ar) { int bytesRead = networkStream.EndRead(ar); if (bytesRead > 0) { string s = System.Text.Encoding.ASCII.GetString(buffer, 0, bytesRead); Console.Write("Received {0} bytes from client: {1}", bytesRead, s); networkStream.BeginWrite(buffer, 0, buffer.Length, callbackWrite, null); } else { Console.WriteLine("Чтение данных завершено"); networkStream.Close(); socket.Close(); networkStream = null; socket = null; } }
private void OnWriteComplete(IAsyncResult ar) { networkStream.EndWrite(ar); Console.WriteLine("Запись в сокет завершена"); networkStream.BeginRead(buffer, 0, buffer.Length, callbackRead, null); } } }
|
подключался к ней телнетом, работает с одним НО: с локальным адресом внутри собственной машины. Дал эту консоль клиенту, когда он меняет адрес на сетевой, она выдает что угодно (различные ошибки, типа "нет связи" или "адрес неверен"), кроме данных. Радмином или телнетом клиент из сети к своей машине подключается нормально. К сожалению лишен возможности тестировать прогу в локальной сети, поэтому потерялся в догадках. Что поменять? (настройки, код, локалку, программера, варианты...) Заранее благодарен. |