Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C# Portti auki

Jonne [27.08.2013 15:55:06]

#

Onko jollain konstilla mahdollista selvittää, salliiko joku tietty portti sisään tulevaa liikennettä?

feenix [27.08.2013 16:33:24]

#

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ä.

Jonne [27.08.2013 16:44:48]

#

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ä.

groovyb [27.08.2013 16:54:30]

#

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());
	}
}

Jonne [27.08.2013 20:55:18]

#

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". :)

groovyb [27.08.2013 23:54:25]

#

http://msdn.microsoft.com/en-us/library/system.net.sockets.udpclient.connect.aspx

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta