2016-12-02 2 views
-2

Ich versuche, eine Client-Server-Anwendung mit Multi-Clients mithilfe von Threads zu implementieren. Nur zu versuchen, möchte ich die Nachrichten von jedem Client drucken, aber wenn ich Nachrichten von einem Client sende, druckt der Server nichts.Multiclient-Server-Socket druckt die Client-Nachrichten nicht

Server (Thread-Code)

void comunicationHandler(void *socket) 
{ 
    int sock = *(int*) socket; 
    char msg[2000]; 

    while ((strcmp(msg, "!quit")) != 0) { 
     if (recv(sock, msg, 2000, 0) < 0) 
      puts("Error recv"); 
     printf("%s", msg); 
    } 
    puts("Client Disconnected\n"); 
} 

wenn ich sende! "Beenden", geht der Server in einer Endlosschleife Druck die Nachrichten

Kunde

for(;;) { 
    printf("\nInserisci il msg: "); 
    scanf("%s", msg); 
    if (strcmp(msg, "!quit") == 0) 
     break; 
    write(sd, msg, 2000); 
} 
+2

Probieren Sie printf ("% s \ n", msg); Stattdessen ... stdout wird seinen Puffer nicht löschen, bis er auf eine neue Zeile trifft. –

+0

Sie sollten in [richtige C-Formatierung] (// prohackr112.tk/r/proper-c-formatting) schauen. Oder lerne, wie du deinen Code gründlich verschleiern kannst (// prohackr112.tk/r/proper-c-obfuscation). –

+1

"* wenn ich sende"! Quit ", *" nicht ", sondern" aus der 'for'-Schleife ausbrechen. – alk

Antwort

3

es mehrere Probleme mit Ihrem Code sind:

  1. TCP-Stream basiert, gibt es keine Garantie, dass alle Bytes, die Sie in einem Schuss auf der anderen Seite empfangen werden senden. Sie müssen den Code ändern, um zu überprüfen, wie viele Bytes empfangen wurden, und mindestens gleich der Größe von "! Quit", bevor Sie den Vergleich "strcmp" durchführen.
  2. besser auf null die Puffer beenden, sobald Sie den Puffer gleich die Größe von „! Quit“
  3. Es ist klar, nicht, warum, wie Sie senden einen 2000 Byte Puffer vom Client erhalten, wenn Sie nur zu senden beabsichtigen " !Verlassen". Ändern und senden Sie nur die passende Größe nach Bedarf
  4. Überprüfen Sie recv Rückgabewert gegen 0 auch
  5. Break aus der Schleife in Server und Client, sobald der Job erledigt ist.
1

Server geht in einer Endlosschleife

Sie möchten recv() das Ergebnis gegen 0 testen und in diesem Fall beenden. 0 zeigt an, dass der Client die Verbindung ordnungsgemäß geschlossen hat.