Avatar billede gulbaek Nybegynder
12. januar 2003 - 17:00 Der er 13 kommentarer og
1 løsning

Socket imellem C# og C++

Nogen som kan hjælpe mig med hvordan jeg sender data fra C++ igennem en Socket og modtager det i C#

Det er allerede lykkes mig at skabe forbindelsen, men jeg kan ikke få C# til at læse data'en korrekt, såvidt jeg kan finde udaf vil C# kun modtage string og C++ sender det afsted som Char.
Avatar billede arne_v Ekspert
12. januar 2003 - 17:08 #1
Hvis du vil sende data mellem 2 forskellige sprog
gennem sockets, så bør du generelt holde dig til primitive
data typer (typisk array af bytes/chars).

Eller så skal de 2 sprog have samme binære repræsentation af
objektet (det skulle også være muligt indenfor .NET frameworket).

Men prøv og send arrays af bytes/chars.
Avatar billede gulbaek Nybegynder
12. januar 2003 - 17:10 #2
Det skal lige siges at det er den almindelig udgave af C++ ikke .NET udgaven.

Data'en bliver sendt afsted som chars, men jeg kan ikke finde udaf hvordan jeg får C# til at modtage chars.
Avatar billede arne_v Ekspert
12. januar 2003 - 17:16 #3
byte[]
Avatar billede gulbaek Nybegynder
12. januar 2003 - 17:27 #4
C#

string modtagetTekst

modtagetTekst = streamReader.ReadLine();

Får følgende fejl:
Cannot implicitly convert type 'int' to 'string'


Nogen forslag til hvordan jeg skal læse det ind istedet for.

Er heller ikke sikker på om det er metoden .Read( ) jeg skal benytte.
Avatar billede lemon Nybegynder
12. januar 2003 - 17:42 #5
Hvis du bruger System.Net.Sockets.Socket så sender/modtager du byte arrays der kan konverteres til et char array med System.Text.ASCII.GetChars() metoden.

Hvis du bruger en stream der returnerer data af typen string, så er det, så vidt jeg umiddelbart kan se, lidt mere kryptisk - men ikke meget.
string rawData = "en streng"; // rawData bliver til et byte array med..
byte[] bytes = System.Text.ASCII.GetBytes(rawData); // ..denne metode og..
char[] chars = System.Text.ASCII.GetChars(bytes); // ..her laver vi det så til et char array.

Den fejl "Cannot implicitly convert type 'int' to 'string'" som du siger det melder betyder at streamReader.ReadLine() returnerer en int og ikke en string.

Jeg vil helt klart foreslå dig at benytte System.Net.Sockets.Socket objektets BeginReceive og EndReceive metoder når du skal modtage data. Dermed får du alle data i et byte array og kan let koncertere frem og tilbage - samtidigt kan dit program udføre andre handlinger, uafhængigt, mellem at du venter på at modtage data, til alle data er modtaget.
Avatar billede lemon Nybegynder
12. januar 2003 - 17:44 #6
Ups, det var ikke "System.Text.ASCII.GetBytes" men "System.Text.Encoding.ASCII.GetBytes" og ligeledes skulle "System.Text.ASCII.GetChars" være "System.Text.Encoding.ASCII.GetChars".
Avatar billede gulbaek Nybegynder
12. januar 2003 - 18:38 #7
lemon

Kan du ikke lige komme med et lille eksemple, det lyder nemlig rigtig fornuftigt.
Avatar billede lemon Nybegynder
12. januar 2003 - 19:29 #8
Her er et eksempel. Det er skrevet i notepad og jeg har ikke testet det - der mangler jo også bla. kode der bruger de modtagne chars til noget samt en lille detalje som eks. en server i den anden ende. ;)

Nedenstående forudsætter at du har en Socket der har forbindelse til dit C++ program.
Yderligere forudsætter det at du har et byte array i den klasse hvor du pladserer nedenstående kode.

class foo
{
    private byte[] byteBuffer;
    private Socket sck;
   
    public foo()
    {
        string server = "www.server.dk"; // Server du vil tilslutte til.
        int port = 2000; // Port på serveren.
       
        byteBuffer = new byte[1024]; // Buffer størrelse = 1 KB.
        sck = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
        // Hvis du skal connecte til en server så er koden her...
        IPAddress hostadd = Dns.Resolve(server).AddressList[0];
        IPEndPoint EPhost = new IPEndPoint(hostadd, port);
        sck.Connect(EPHost);
        if(!sck.Connected)
        {
            System.Windows.Forms.MessageBox.Show("Serveren ignorerer dig.. prøv liiige at checke om det er den rette server/port.");
            return;
        }
        // Ellers må du lige se efter BeginAccept og EndAccept metoderne i Doc'en.
    }

    public void ReceiveData()
    {
        sck.BeginReceive(byteBuffer, 0, byteBuffer.Length, SocketFlags.None, new AsyncCallback(ProcessData), sck);
    }

    private void ProcessData(IAsyncResult ar)
    {
        int bytesRead = sck.EndReceive(ar);
        if(bytesRead == 0)
            return; // Forbindelsen blev afbrudt.

        char[] chars = Encoding.ASCII.GetChars(byteBuffer, 0, bytesRead);
        // nu indeholder chars de chars som blev sendt fra dit C++ program.
        ReceiveData(); // Og hvis der skal modtages flere data,
                // så kører du bare ReceiveData(); her... ellers
                // kan du jo fjerne den sidste linje.
    }
}
Avatar billede gulbaek Nybegynder
12. januar 2003 - 20:20 #9
Takker Lemon

Det virker, har nu godt nok nogle problemer med at skifte ny linie i den textbox, hvor jeg viser det modtagne data.

Hvis du lige gider hjælpe med det så skal du nok få en masse points
Avatar billede gulbaek Nybegynder
12. januar 2003 - 20:24 #10
Lige meget, har selv fundet udaf det

Takker mange gange for hjælpen
Avatar billede lemon Nybegynder
12. januar 2003 - 20:26 #11
Eeeh, mener du... at indsætte et linjeskift i en textbox? Det kræver for det første at din textbox's MultiLine property er sat til true. Derefter er det bare at indsætte enten "\r\n" eller (((char)13) + ((char)10)).ToString() eller System.Text.Encoding.ASCII.GetString(new char[] { 13, 10 })
Avatar billede gulbaek Nybegynder
12. januar 2003 - 20:37 #12
jeg brugte bare "\r\n" så fungerede
Avatar billede lemon Nybegynder
12. januar 2003 - 20:49 #13
Det er vidst også det letteste... :)
Avatar billede simon.ulsnes Nybegynder
12. januar 2003 - 21:10 #14
Jeg ville nok sende/modtage data med byte, så har du nemlig mulighed for at sende alle former for data. I C# kan du konvertere et byte-array til ASCII-characters med:
System.Text.Encoding.ASCII.GetCharArray(bytearray);
eller
System.Text.Encoding.ASCII.GetString(bytearray);
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