Avatar billede dar86 Nybegynder
22. oktober 2008 - 16:17 Der er 20 kommentarer og
1 løsning

Kommunikation med CS-server

Hej Folkens

Jeg prøver vha. C# at få forbindelse med en Half-Life server der kører CS, kommunikationen mellem serveren burde foregå som der står i denne tråd: http://www.eksperten.dk/spm/406884
Men jeg kan dog ikke få det til at virke, når jeg kører mit program og skriver "ping" (uden ") står kommer der ikke noget svar. Er det mig der er helt galt i byen ?

På forhånd tak

Min kode er som følger:

using System;
using System.Text;
using System.Net;
using System.Net.Sockets;
using System.Threading;
class MainClass
{
    private static void Main()
    {
        string IP = "81.7.159.231";
        int port = 27020;
        IPEndPoint remoteEndPoint = new IPEndPoint(IPAddress.Parse(IP), port);
        Thread receiveThread = new Thread(ReceiveData);
        receiveThread.IsBackground = true;
        receiveThread.Start();
        UdpClient client = new UdpClient();
        try
        {
            string text;
            do
            {
                text = Console.ReadLine();

                if (text.Length != 0)
                {
                    byte[] start = { 0xFF, 0xFF, 0xFF, 0xFF };
                    byte[] data = Encoding.UTF8.GetBytes(text);
                    byte[] slut = { 0x00 };
                    byte[] send = new byte[start.Length + data.Length + slut.Length];
                    int i = 0;
                    foreach (byte b in start)
                    {
                        send[i] = b;
                        i++;
                    }
                    foreach (byte c in data)
                    {
                        send[i] = c;
                        i++;
                    }
                    foreach (byte d in slut)
                    {
                        send[i] = d;
                        i++;
                    }
                    client.Send(send, send.Length, remoteEndPoint);

                }
            } while (text.Length != 0);
        }
        catch (Exception err)
        {
            Console.WriteLine(err.ToString());
        }
        finally
        {
            client.Close();
        }
    }

    private static void ReceiveData()
    {
        UdpClient client = new UdpClient(999);
        while (true)
        {
            try
            {
                IPEndPoint anyIP = new IPEndPoint(IPAddress.Any, 0);
                byte[] data = client.Receive(ref anyIP);
                string text = Encoding.UTF8.GetString(data);
                Console.WriteLine(">> " + text);
            }
            catch (Exception err)
            {
                Console.WriteLine(err.ToString());
            }
        }
    }
}
Avatar billede srofhest Nybegynder
23. oktober 2008 - 18:09 #1
Efter hvad jeg kan se så sender du din kode korrekt. Problemet ligger i modtagelsen af svaret fra serveren.

Copy/pastede din kode og kørte den med EtherDetect packet sniffer, og i den kunne jeg se at din kode blev sendt korrekt og at du modtager svar fra serveren.

Jeg er selv nybegynder og ved ikke hvad der går galt eller hvordan det kan fikses.
Avatar billede arne_v Ekspert
25. oktober 2008 - 03:05 #2
string text = Encoding.UTF8.GetString(data);

giver ikke meget mening på svaret som skal være

0xFF 0xFF 0xFF 0xFF 'j' 0x00

ifølge dit link. Prøv og udskriv bytes enkeltvist.
Avatar billede arne_v Ekspert
25. oktober 2008 - 03:08 #3
Iøvrigt bør:

string s = "\u00FF\u00FF\u00FF\u00FFping\u0000";
byte[] b = Encoding.GetEncoding(1252).GetBytes(s);

virke til at konstruere request med.
Avatar billede dar86 Nybegynder
25. oktober 2008 - 14:35 #4
Nu har jeg prøvet at ændre string text = Encoding.UTF8.GetString(data);
Men den returnerer simpelthen ikke noget, så er det fordi der er en fejl i ReceiveData måske?

Og det ser da ud til at være en meget simplere måde at lave requesten med :) Tak
Avatar billede arne_v Ekspert
25. oktober 2008 - 15:43 #5
hvad har du ændret det til ?
Avatar billede dar86 Nybegynder
25. oktober 2008 - 16:31 #6
byte[] data = client.Receive(ref anyIP);
                foreach (byte b in data)
                {
                    Console.WriteLine(">> " + b.ToString());
                   
                }
Avatar billede arne_v Ekspert
25. oktober 2008 - 16:43 #7
Og den skriver ikke noget ud ?
Avatar billede dar86 Nybegynder
25. oktober 2008 - 22:59 #8
Nej, der kommer intet
Avatar billede arne_v Ekspert
25. oktober 2008 - 23:21 #9
Der er ikke en firewall som blokerer for den UDP port ?
Avatar billede dar86 Nybegynder
25. oktober 2008 - 23:50 #10
Nej, bruger kun Windows Firewall, og der sker intet selvom den er slået fra.
Avatar billede arne_v Ekspert
26. oktober 2008 - 00:24 #11
Er modtager adressen OK ?
Avatar billede dar86 Nybegynder
26. oktober 2008 - 10:47 #12
Ja, det er jeg helt sikker på :)
Avatar billede arne_v Ekspert
30. oktober 2008 - 02:20 #13
Og du ved at CS serveren sender til port 999 selvom den modtager på 27020 ?
Avatar billede dar86 Nybegynder
30. oktober 2008 - 07:52 #14
Nej, men kan jeg ikke få den til at lytte på alt UDP? Kan nemlig ikke finde noget i Half-Life's SDK om en specifik port den skulle sende tilbage på, og 27020 virker heller ikke.
Avatar billede arne_v Ekspert
31. oktober 2008 - 03:23 #15
Jeg mener ikke at du kan lytte på alle 65535 porte. Normalt ved man hvilken port man skal lytte på.
Avatar billede dar86 Nybegynder
31. oktober 2008 - 09:53 #16
Nej okay, har nu fundet ud af at den modtager på samme port som den sender til. Men hvordan får jeg så min receiveData til også at bruge port 27020 da det vel så kræver 2 clienter der bruger samme port?
Avatar billede arne_v Ekspert
31. oktober 2008 - 11:40 #17
Eller at du bruger samme UdpClient til at receive med som du sender !
Avatar billede dar86 Nybegynder
31. oktober 2008 - 19:55 #18
Har du en god måde at gøre det på? Har ikke lige pt selv nogle ideer :)
Avatar billede arne_v Ekspert
01. november 2008 - 02:35 #19
Du kunne lave UdpClient en static class member.

Det var nok bedre at lave ReceiveData non-static og sende UdpClient med over
i en constructor.
Avatar billede dar86 Nybegynder
01. november 2008 - 11:41 #20
1000 tak, nu får jeg svar fra serveren. Er desværre bare kun "ping" der virker, ved ikke lige hvorfor de andre ikke virker som de burde :(

Men smid et svar :)
Avatar billede arne_v Ekspert
01. november 2008 - 12:21 #21
svar
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester