Forum: PC-Programmierung TCP zwischen C und C#


von Regelmeister (Gast)


Lesenswert?

Hallo,
habe folgenden Code in C# als Server:
1
private void listen_tcp()
2
        {
3
            IPAddress ipAddress = IPAddress.Any;
4
            TcpListener listener = new TcpListener(ipAddress, 12345);
5
            listener.Start();
6
            Console.WriteLine("Server is running");
7
            Console.WriteLine("Listening on port " + 12345);
8
            Console.WriteLine("Waiting for connections...");
9
            label15.Text = "test";
10
            while (true)
11
            {
12
                Socket s = listener.AcceptSocket();
13
                Console.WriteLine("Connection accepted from " + s.RemoteEndPoint);
14
                byte[] b = new byte[20];
15
                int k = s.Receive(b);
16
                Console.WriteLine("Received:");
17
                for (int i = 0; i < k; i++)
18
                    Console.Write(Convert.ToChar(b[i]));
19
                ASCIIEncoding enc = new ASCIIEncoding();
20
                s.Send(enc.GetBytes("Server responded"));
21
                Console.WriteLine("\nSent Response");
22
                s.Close();
23
            }
24
            }
Und den Client in C:
1
WSADATA wsa;
2
  SOCKET mysocket;
3
  SOCKADDR_IN addr;
4
  long rc;
5
  char mystring[20] = "Hallo\n";
6
7
  if(WSAStartup(MAKEWORD(2,0),&wsa)!=0) 
8
    printf("Winsock konnte nicht gestartet werden\n");
9
  else
10
    printf("Winsock gestartet\n");
11
12
  mysocket=socket(AF_INET,SOCK_STREAM,0);
13
14
  if(mysocket==INVALID_SOCKET)
15
  {
16
    printf("Fehler: Der Socket konnte nicht erstellt werden, fehler code: %d\n",WSAGetLastError());
17
    return 1;
18
  }
19
  else
20
  {
21
    printf("Socket erstellt!\n");
22
  }
23
  memset(&addr,0,sizeof(SOCKADDR_IN));
24
  addr.sin_family=AF_INET;
25
  addr.sin_port=htons(12345); // wir verwenden mal port 12345
26
  addr.sin_addr.s_addr=inet_addr("127.0.0.1"); // zielrechner ist unser eigener
27
  rc=connect(mysocket,(SOCKADDR*)&addr,sizeof(SOCKADDR));
28
  if(rc==SOCKET_ERROR)
29
  {
30
    printf("Fehler: connect gescheitert, fehler code: %d\n",WSAGetLastError());
31
    return 1;
32
  }
33
  else
34
  {
35
    printf("Verbunden mit 127.0.0.1..\n");
36
  }
37
  send(mysocket,mystring,sizeof(mystring),0);
38
39
  strcpy(mystring,"Welt");
40
  send(mysocket,mystring,9,0);
Das Hallo kommt auch an, nur das Welt nicht. Sieht jemand den Fehler?
Grüße

von Läubi .. (laeubi) Benutzerseite


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

von Niklas G. (erlkoenig) Benutzerseite


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.

von Regelmeister (Gast)


Lesenswert?

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

von Arc N. (arc)


Lesenswert?

Die Frage ist: Was soll überhaupt gesendet werden?
1
char mystring[20] = "Hallo\n";
2
3
// sizeof oder strlen
4
send(mysocket,mystring,sizeof(mystring),0);
5
6
// strcpy oder strncat
7
strcpy(mystring,"Welt");
8
9
// strlen("Hallo Welt") == 10, strlen("Welt") == 4, aber warum hier 9
10
send(mysocket,mystring,9,0);

von Regelmeister (Gast)


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.

von Mark .. (mork)


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

von Regelmeister (Gast)


Lesenswert?

Danke das wars Mark!

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.