www.mikrocontroller.net

Forum: PC-Programmierung TCP zwischen C und C#


Autor: Regelmeister (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
habe folgenden Code in C# als Server:
private void listen_tcp()
        {
            IPAddress ipAddress = IPAddress.Any;
            TcpListener listener = new TcpListener(ipAddress, 12345);
            listener.Start();
            Console.WriteLine("Server is running");
            Console.WriteLine("Listening on port " + 12345);
            Console.WriteLine("Waiting for connections...");
            label15.Text = "test";
            while (true)
            {
                Socket s = listener.AcceptSocket();
                Console.WriteLine("Connection accepted from " + s.RemoteEndPoint);
                byte[] b = new byte[20];
                int k = s.Receive(b);
                Console.WriteLine("Received:");
                for (int i = 0; i < k; i++)
                    Console.Write(Convert.ToChar(b[i]));
                ASCIIEncoding enc = new ASCIIEncoding();
                s.Send(enc.GetBytes("Server responded"));
                Console.WriteLine("\nSent Response");
                s.Close();
            }
            }
Und den Client in C:
WSADATA wsa;
  SOCKET mysocket;
  SOCKADDR_IN addr;
  long rc;
  char mystring[20] = "Hallo\n";

  if(WSAStartup(MAKEWORD(2,0),&wsa)!=0) 
    printf("Winsock konnte nicht gestartet werden\n");
  else
    printf("Winsock gestartet\n");

  mysocket=socket(AF_INET,SOCK_STREAM,0);

  if(mysocket==INVALID_SOCKET)
  {
    printf("Fehler: Der Socket konnte nicht erstellt werden, fehler code: %d\n",WSAGetLastError());
    return 1;
  }
  else
  {
    printf("Socket erstellt!\n");
  }
  memset(&addr,0,sizeof(SOCKADDR_IN));
  addr.sin_family=AF_INET;
  addr.sin_port=htons(12345); // wir verwenden mal port 12345
  addr.sin_addr.s_addr=inet_addr("127.0.0.1"); // zielrechner ist unser eigener
  rc=connect(mysocket,(SOCKADDR*)&addr,sizeof(SOCKADDR));
  if(rc==SOCKET_ERROR)
  {
    printf("Fehler: connect gescheitert, fehler code: %d\n",WSAGetLastError());
    return 1;
  }
  else
  {
    printf("Verbunden mit 127.0.0.1..\n");
  }
  send(mysocket,mystring,sizeof(mystring),0);

  strcpy(mystring,"Welt");
  send(mysocket,mystring,9,0);
Das Hallo kommt auch an, nur das Welt nicht. Sieht jemand den Fehler?
Grüße

Autor: Läubi .. (laeubi) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sende mal einen Zeilenumbruch ("\r\n") nach dem Welt.
Und ich empfehle dir mal die ganzen "Magic-Numbers" in deinem Code auf 
Konstanten/Variablen mit passendem Namen abzubilden..

Autor: Niklas Gürtler (erlkoenig)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielleicht wartet die Receive-Routine nicht darauf, dass 20 Zeichen 
empfangen wurden, sondern kehrt nach ein paar Datenpaketen - dem "Hallo" 
- zurück? (So ist es zumindest mit recv in C, ob das in C# auch so ist 
weiß ich nicht) Vermutlich solltest du Receive öfters aufrufen, am 
besten in einer Schleife, denn im worst case könnte jedes Zeichen 
einzeln ankommen.

Autor: Regelmeister (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Läubi,
das \r\n hat leider nichts gebracht, das mit den magic-numbers.. ist ja 
erstmal nur zum testen ;)

Autor: Arc Net (arc)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die Frage ist: Was soll überhaupt gesendet werden?
char mystring[20] = "Hallo\n";

// sizeof oder strlen
send(mysocket,mystring,sizeof(mystring),0);

// strcpy oder strncat
strcpy(mystring,"Welt");

// strlen("Hallo Welt") == 10, strlen("Welt") == 4, aber warum hier 9
send(mysocket,mystring,9,0);

Autor: Regelmeister (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
es soll erst Hallo und dann Welt gesendet werden, bzw. Mein Problem ist 
dass ich nicht mehrere Wörter senden kann, wenn ich den Client neu 
starte kommt halt wieder Hallo an.

Autor: Mark .. (mork)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Regelmeister

In Deinem C#-Code wird der Socket wieder geschlossen, nachdem ein Wort 
empfangen und ausgegeben wurde. Ändere die Scheife so ab, dass der neue 
Socket vor der while(true) "accepted" wird, und mach das s.Close() weg.

MFG Mark

Autor: Regelmeister (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke das wars Mark!

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.