Frage

Ich baue ein Client und ein Server-Programm, dass der Austausch von Daten über TCP und ich haben Probleme mit einer ACK-Bestätigung vom Server zurück an den Client gesendet, wenn eine Operation erfolgreich ist. Ich habe es geschafft, eine Struktur mit verschiedenen Mitgliedern von dem Client an den Server zu senden, dann wird der Server, indem Sie eine ganze Zahl bestätigt die ID der Struktur zurück an den Client reagieren soll.

In server.c Ich habe diese Funktion:

int sendACK(int socket, int ack_int){

    int com_result;
    int ACK = htonl(ack_int);

    printf("\n\tSending ACK with value: %i", ack_int);

    com_result = send(socket, &ACK, sizeof(ACK), 0);

    if (com_result == -1) {
        perror("\n\t[ERROR] Send ACK");
        return 0;
    }

    return 1;

}

Diese Funktion durch eine andere Funktion in server.c wie folgt aufgerufen wird:

int ACK = myStruct->ID;
sendACK(socket, ACK);

Also, wenn ich nur eine Struktur mit ID erhalten haben: 2, so wird der Ausgang sein:
Senden von ACK mit Wert: 2

In client.c erhalte ich die ACK wie folgt aus:

int ACK = 0;
data_size  = sizeof(myStruct.ID);
com_result = read(client_socket, &ACK, data_size);
ACK = ntohl(ACK);

if (com_result == -1) {
    perror("\n\t[ERROR] Read");
} else {
    printf("\n\tRecieved %i of %i bytes", com_result, data_size);
    if (ACK != myStruct.ID) {
        printf("\n\t[ERROR] Invalid ACK (%i).", ACK);
    }
}

Aber die ACK ist immer mit einem Wert von 1 empfangen, so dass der Ausgang von Client ist:
Recieved 4 von 4 Bytes
ERROR] Ungültige ACK (1).

Warum ist nicht die ganze Zahl mit einem Wert von erhielt 2 , und wie kann ich dieses Problem beheben?

War es hilfreich?

Lösung

Dies ist wahrscheinlich nicht das Problem, aber ich glaube, dass die zweite Zeile in der client.c unten Snippet sollte sizeof (ACK) sein.

int ACK = 0;
data_size  = sizeof(ACK); // was: sizeof(myStruct.ID);
com_result = read(client_socket, &ACK, data_size);
ACK = ntohl(ACK);

Auch auf Ihre Daten in Abhängigkeit fließen, ist es möglich, dass Sie tatsächlich gerade lesen richtig und die ACK ist die Antwort von einem Paket, das Sie zuvor gesendet?

Andere Tipps

Sie sollten niemals ganze Werte wie diese senden, müssen Sie mehr Aufmerksamkeit auf die Serialisierung zahlen. Dies könnte fehlschlagen, wenn zum Beispiel der sizeof (int) auf der Sende Maschine von dem Empfang anders ist, in dem Fall, dass Sie die falsche Anzahl von Bytes gelesen werden.

Es ist besser, mehr Pflege und serialize Felder ein Byte zu einer Zeit.

Um es zu debuggen, können Sie verwenden wireshark . Führen Sie wireshark und legen Sie die Optionen auf den gewünschten Port zu hören. Sie werden sehen, was tatsächlich wurde innerhalb des Pakets durch das Netzwerk gesendet. Dies ermöglicht es Ihnen zu verstehen, wenn das Problem mit dem Server, der Client oder beides.

Ich kann nichts falsch mit dem Code, den Sie oben eingefügt herauszufinden. Ich würde vorschlagen, Wireshark raus oder eine andere Steckdose Programmablaufverfolgung, und Blick auf den Bits auf dem Draht.

Ich würde überprüfen, ob Ihr Haupt Sender / Empfänger-Code, um die richtige Menge an Daten verarbeitet.

Wenn Ihr Sender durch ein Vier-Byte-ACK 20 Byte gefolgt sendet aber der Empfänger liest nur 16, bevor Sie die ACK zu lesen, können Sie diese Art von Problem haben.

Wenn Sie Daten mit variabler Länge sind zu senden (dh. Mit einem bytecount Präfix) eine gemeinsame Verwirrung darüber, ob die bytecount übertragen werden enthalten tatsächlich die zusätzlichen Bytes benötigt, um die Byte-Anzahl ...

senden
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top