Onko jollain konstilla mahdollista selvittää, salliiko joku tietty portti sisään tulevaa liikennettä?
Omassa C#-ohjelmassasi? Yrittämällä ottaa siihen yhteyttä tai kysymällä käyttikseltä onko portti avoinna.
http://msdn.microsoft.com/en-us/library/bb408406(v=vs.85).aspx saattaa auttaa jälkimmäisessä, mutta vaatinee vähän virittelyä.
Joo, kyseessä on masterserver-gameserver-client ohjelmat, ja gameserveriä jaetaan käyttäjille, jotka voivat sitten hostailla.
Yksi viritys, joka kävi mielessä, on kun gameserver yhdistää masterserverille, masterserver testaa lähettää viestejä gameserverin porttiin, mihin clientit yhdistävät.
Mutta jos gameserver tosiaan pystyisi testaamaan suoraan, onko joku tietty portti avoinna sisääntulevalle liikenteelle, ei tarvitsisi moista viritystä tehdä.
En jaksanut testata notepadviritystä, mutta tonneppäin.
//Check port string server = "192.168.1.1"; int port = 900; try { if(CheckPort(server,port)) MessageBox.Show("Ready to connect."); else MessageBox.Show("Port already in use, cannot connect."); } catch(Exception ex) { MessageBox.Show(ex.Message); } //..somewhere public bool CheckPort(string host, int port) { string hostname = host; int portno = port; IPAddress ipa = (IPAddress) Dns.GetHostAddresses(hostname)[0]; Bool isReady = false; try { System.Net.Sockets.Socket sock = new System.Net.Sockets.Socket(System.Net.Sockets.AddressFamily.InterNetwork, System.Net.Sockets.SocketType.Stream, System.Net.Sockets.ProtocolType.Tcp); sock.Connect(ipa, portno); if (sock.Connected == true) isReady = true; sock.Close(); return isReady; } catch (System.Net.Sockets.SocketException ex) { if (ex.ErrorCode == 10061) { isReady = false; return isReady; } else throw new ArgumentException("Something happened: " + ex.ToString()); } }
Kiitän, toimi mainiosti TCP:n suhteen.
Mitenkähän tämän saisi toimimaan myös UDP:n kanssa vai pitääkö olla toisenlainen tapa?
Koitin muuttaa tuon yhden rivin muotoon
Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
tosin nyt funktio palauttaa aina true, laittoipa IP:ksi tai portiksi mitä tahansa.
Joskin UDP toisaalta on yhteydetön, joten tämä saattaa sinällään "toimia oikein". :)
Aihe on jo aika vanha, joten et voi enää vastata siihen.