Невозможно выполнить пинг хост-компьютера с устройства, подключенного к точке доступа, или просмотреть веб-страницу, отображаемую http-сервером на хосте через подключенное к точке доступа устройство.
Моя цель состояла в том,чтобы обмениваться документами по Wi-Fi, без подключения к интернету.
Я начал с создания точки доступа, используя этот учебник [здесь][1]
Затем я создал простой http-сервер, используя различные учебные пособия онлайн-учебника.
Наконец, префикс http-это ip-адрес ноутбука(тот, на котором я запустил hotspot) на порту 1800.
Я действительно успешно подключился к точке доступа,но при вводе ip-адреса и порта ноутбука в url-адрес браузера клиента он не загружается и finnaly получает ошибку тайм-аута.
когда я ввожу то же самое (ip-адрес хоста и номер порта в url-адресе браузера), я действительно получаю веб-страницу.
Почему клиент не показывает веб-страницу, обслуживаемую хостом?
Исходный код
class Program { #region Main static void Main(string[] args) { Console.WriteLine("Starting Hotspot and http server"); var th = new Task(() => { Hotspot hotSpot = new Hotspot(); hotSpot.CreateHotSpot("Test", "123456789"); hotSpot.StartHotSpot(); String ip = hotSpot.getIp(); HttpServer httpServer = new HttpServer(ip); httpServer.Start(); }); th.Start(); Console.ReadLine(); } #endregion /// <summary> /// Create ,start ,stop Hotspot. /// share internet at the same time /// </summary> #region Hotspot class Hotspot { private string message = ""; private dynamic netsharingmanager = null; private dynamic everyConnection = null; private bool hasnetsharingmanager = false; ProcessStartInfo ps = null; #region constructor public Hotspot() { ps = new ProcessStartInfo("cmd.exe"); ps.UseShellExecute = false; ps.RedirectStandardOutput = true; ps.CreateNoWindow = true; ps.FileName = "netsh"; //sharing netsharingmanager = Activator.CreateInstance(Type.GetTypeFromProgID("HNetCfg.HNetShare.1")); if (netsharingmanager == null) { Console.WriteLine( "HNetCfg.HNetShare.1 was not found \n"); hasnetsharingmanager = true; } else { hasnetsharingmanager = false; } if (netsharingmanager.SharingInstalled == false) { Console.WriteLine( "Sharing on this platform is not available \n"); hasnetsharingmanager = false; } else { hasnetsharingmanager = true; } if (hasnetsharingmanager) { everyConnection = netsharingmanager.EnumEveryConnection; } } #endregion //check internet #region Check for internet public static bool CheckForInternetConnection() { try { using (var client = new WebClient()) { using (client.OpenRead("https://google.com/")) { return true; } } } catch { return false; } } #endregion #region start Hotspot public void StartHotSpot() { ps.Arguments = "wlan start hosted network"; ExecuteCommand(ps); Console.WriteLine("Starting Hotspot"); //check for connected clients var th = new Task(() => { while (true) { HotSpotDetails details = new HotSpotDetails(); List<String> MacAddr = details.Mac_connected_devices(); Console.WriteLine("\n\n---------------------------------"); foreach (var item in MacAddr) { Console.WriteLine("Connected Device Mac = {0}", item); } Console.WriteLine("---------------------------------\n\n"); Thread.Sleep(100000); } }); th.Start(); } #endregion #region Create hot spot public void CreateHotSpot(string ssid_par, string key_par) { ps.Arguments = string.Format("wlan set hostednetwork mode=allow ssid={0} key={1}", ssid_par, key_par); ExecuteCommand(ps); Console.WriteLine("Creating hotspot name {0}",ssid_par); } #endregion #region Stop hotspot public void stop() { ps.Arguments = "wlan stop hosted network"; ExecuteCommand(ps); } #endregion #region shareinternet public void Shareinternet(string pubconnectionname, string priconnectionname, bool isenabled) { bool hascon = false; dynamic thisConnection = null; dynamic connectionprop = null; if (everyConnection == null) { everyConnection = netsharingmanager.EnumEveryConnection; } try { foreach (dynamic connection in everyConnection) { thisConnection = netsharingmanager.INetSharingConfigurationForINetConnection(connection); connectionprop = netsharingmanager.NetConnectionProps(connection); Console.WriteLine("connectionprop name = {0} and pubconnectionname = {1}", connectionprop.name, pubconnectionname); if (connectionprop.name == pubconnectionname) //public connection { hascon = true; Console.WriteLine( string.Format("Setting ICS Public {0} on connection: {1}\n", isenabled, pubconnectionname)); Console.WriteLine("Setting ICS Public {0} on connection: {1}\n", isenabled, pubconnectionname); if (isenabled) { thisConnection.EnableSharing(0); } else { thisConnection.DisableSharing(); } } if (connectionprop.Name == priconnectionname) //private connection { hascon = true; Console.WriteLine( string.Format("Setting ICS Private {0} on connection: {1}\n", isenabled, pubconnectionname)); Console.WriteLine("Setting ICS Private {0} on connection: {1}\n", isenabled, pubconnectionname); if (isenabled) { thisConnection.EnableSharing(1); } else { thisConnection.DisableSharing(); } } if (!hascon) { this.message += "no connection found"; Console.WriteLine("no connection found"); } } } catch (Exception e) { Console.WriteLine("Hey an err in hotspot {0}", e); } } #endregion #region public string getIp() { string host_name = Dns.GetHostName(); string ip = string.Empty; var host = Dns.GetHostEntry(host_name); foreach (var ip_ in host.AddressList) { if (ip_.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork) { ip = ip_.ToString(); } } Console.WriteLine("\n -->my host name is {0} and my ip is {1} ", host_name, ip); return ip; } #endregion #region Execute command private void ExecuteCommand(ProcessStartInfo ps) { bool isExecuted = false; try { using (Process p = Process.Start(ps)) { message += p.StandardOutput.ReadToEnd() + "\n"; p.WaitForExit(); isExecuted = true; } } catch (Exception e) { message = "errorr -- >"; message += e.Message; isExecuted = false; } } #endregion } #endregion /// <summary> /// get the hotspot details eg connected clients /// </summary> #region Hotspot Details class HotSpotDetails { //mac address list List<String> mac_address_list = new List<string>(); #region GetMacAddr upto private List<string> GetMacAddr(string output) { //split_string.Substring(0, split_string.LastIndexOf(uptoword)); string mac = string.Empty; List<string> mac_ad = new List<string>(); string[] lines = output.Split(new[] { "\r\n", "\r", "\n" }, StringSplitOptions.RemoveEmptyEntries); foreach (string line in lines) { if (line.Contains("Authenticated")) //"Number of clients")) { mac = line.Substring(0, line.LastIndexOf("Authenticated")); mac_ad.Add(mac.Replace(" ", string.Empty)); } } return mac_ad; } #endregion #region get mac address of connected devices public List<String> Mac_connected_devices() { String output = Console_command("netsh", "wlan show hosted"); // Console.WriteLine("1------>{0}", output); mac_address_list = GetMacAddr(output); foreach (string item in mac_address_list) { Console.WriteLine("mac list item-number = {0}", item); } return mac_address_list; } #endregion #region command line func private string Console_command(string command, string args) { string output = string.Empty; ProcessStartInfo processStartInfo = new ProcessStartInfo(command, args); processStartInfo.RedirectStandardOutput = true; processStartInfo.UseShellExecute = false; processStartInfo.CreateNoWindow = true; Process proc = new Process { StartInfo = processStartInfo }; proc.Start(); output = proc.StandardOutput.ReadToEnd(); return output; } #endregion } #endregion /// <summary> /// start and stop the http server at port 1800. /// </summary> #region HttpServer class HttpServer { public static HttpListener listener = new HttpListener(); int port = 1800; String MyIp; Socket serverSocket = null; int backlog = 4; List<Socket> client = new List<Socket>(); byte[] Buffer = new byte[1024]; public HttpServer(String IpAddress) { this.MyIp = IpAddress; serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); } //start http server public void Start() { System.Console.WriteLine("http://localhost:{0}/", port); System.Console.WriteLine("http://{0}:{1}/", MyIp, port); // String Localformart = String.Format("http://localhost:{0}/", port); String Gloabalformart = String.Format("http://{0}:{1}/", MyIp, port); //add prefix // listener.Prefixes.Add(Localformart); listener.Prefixes.Add(Gloabalformart); if (listener.IsListening) { listener.Stop(); } listener.AuthenticationSchemes = AuthenticationSchemes.Anonymous; listener.Start(); if (listener.IsListening) { Console.WriteLine("Http serever listening"); } else { Console.WriteLine("Http serever not listening ?"); } int requestCounter = 0; while (listener.IsListening) { try { HttpListenerContext context = listener.GetContext(); HttpListenerResponse response = context.Response; requestCounter++; Console.WriteLine("Request counter {0}", requestCounter); //webpage requested by browser String WebPage = Directory.GetCurrentDirectory() + context.Request.Url.LocalPath; //+ "webpage\\"; // String.Empty; Console.WriteLine("Path to wbpage = {0} \n", WebPage); if (string.IsNullOrEmpty(WebPage)) { WebPage = "index.html"; } // TextReader tr = new StreamReader(WebPage); FileStream tr = new FileStream(WebPage, FileMode.Open, FileAccess.ReadWrite); using (BinaryReader rds = new BinaryReader(tr)) { var message = rds.ReadBytes(Convert.ToInt32(tr.Length)); //transform into byte array // byte[] buffer = Encoding.UTF8.GetBytes(message); //set up the message lent response.ContentLength64 = message.Length; //create a stream to send the message Stream st = response.OutputStream; st.Write(message, 0, message.Length); //close the connection context.Response.Close(); } } catch (Exception e) { Console.WriteLine("Error in Http server is listening"); } } } } #endregion }
Краткое изложение вышеприведенного кода:
Есть три класса
1)Горячая точка
2)Детали Точки Доступа
3)Http-сервер
Точка доступа создает запускает и останавливает точку доступа.
Hotspot details в первую очередь получает все IP-адреса подключенных устройств.
HTTP-сервер работает HTTP-сервер с двумя префиксами 127.0.0.1:1800 и {ИП}:1800.
Конечно, существует index.html страница в папке debug.
Когда я пингую Ip-адрес подключенного устройства, я получаю ответ, однако когда я пингую ip-адрес хоста с гостевого устройства, я не получаю ответа.
Кроме того, веб-страница отображается нормально с локального хоста, но с устройства, подключенного к точке доступа, я получаю ошибку тайм-аута от chrome.
Почему веб-страница не отображается на гостевом устройстве ?
Заранее спасибо.
Что я уже пробовал:
я пробовал пинговать ip-адрес,спрашивал дальше стек поверх поток не получил никакого ответа