#c# #sockets #tcplistener
Вопрос:
Я попытался создать свою первую программу асинхронных сокетов на C#, несмотря на отсутствие ошибок в коде, она не принимает подключения. Я проверил по Телнету. это мой код TCP-сервера: я только что видел несколько примеров в Интернете, но не смог найти свою проблему, я считаю, что в мой код следует добавить что-то еще.
class Program { static byte[] Mybuffer = new byte[4096]; static TcpClient tc = new TcpClient(); private static void PrintUsageInfo() { } static void Main(string[] args) { TcpListener tl = new TcpListener(IPAddress.Parse("192.168.1.141"), 8008); tl.Start(); tl.BeginAcceptTcpClient(OnCompleteTCP, tl); } static void OnCompleteReadData(IAsyncResult isa) { int countreadbytes = 0; try { //TcpClient tc; tc = (TcpClient)isa.AsyncState; countreadbytes = tc.GetStream().EndRead(isa); if (countreadbytes==0) { Console.WriteLine("USER Disconnected"); //client disconnect return; } //continue to get data tc.GetStream().BeginRead(Mybuffer, 0, Mybuffer.Length, OnCompleteReadData, tc); Console.Write(Encoding.ASCII.GetString(Mybuffer)); } catch(Exception ex) { Console.WriteLine(ex.ToString()); } } static void OnCompleteTCP(IAsyncResult isa) { TcpListener tcpl = (TcpListener)isa.AsyncState; tc=tcpl.EndAcceptTcpClient(isa); tc.GetStream().BeginRead(Mybuffer, 0, Mybuffer.Length, OnCompleteReadData, tc); } }
Так в чем же проблема?
Комментарии:
1. Звучит как брандмауэр или привязка адреса; сначала попробуйте использовать
IPAddress.Any
в качестве первого аргумента. Если это сработает, отлично. Если это не так, временно отключите брандмауэр. Если это работает, создайте правило брандмауэра для порта 80082. TNX. отключение брандмауэра было первой мерой, которую я предпринял для решения этой проблемы, но она не работает даже с IP-адресом. Любой! Я думаю, что это должно быть что-то очень простое, чего я не смог найти
3. Можете ли вы подключиться по телетайпу к любой другой службе на целевой машине?
netstat -a
отобразит список портов прослушивания
Ответ №1:
Благодаря Каюсу Ярду я проверил netstat-a, чтобы увидеть все прослушивающие порты, но моего порта там не было. Итак, я выяснил, что это может быть проблемой при запуске процесса. Я поместил beginacceptcpclient в цикл while(true), и теперь он работает хорошо!
static void Main(string[] args) { TcpListener tl = new TcpListener(IPAddress.Any, 8008); tl.Start(); while (true) { tl.BeginAcceptTcpClient(OnCompleteTCP, tl); } }