Domanda

Sto costruendo una un programma server che gli scambi di dati su TCP cliente ed e sto avendo problemi con l'invio di un ACK-conferma dal server al client quando un'operazione è successo. Sono riuscito a inviare uno struct con vari membri dal client al server, il server dovrebbe rispondere con l'invio di un numero intero che conferma l'ID del struct al client.

In server.c ho questa funzione:

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;

}

Questa funzione viene chiamata da un'altra funzione in server.c in questo modo:

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

Quindi, se ho appena ricevuto una struct con ID: 2, l'uscita sarà:
Invio di ACK con il valore: 2

In client.c ricevo l'ACK in questo modo:

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);
    }
}

Ma l'ACK è sempre ha ricevuto con un valore di 1, quindi l'uscita dal client è:
ha ricevuto 4 su 4 byte
ERRORE] non valido ACK (1).

Perché non l'intero ricevuto con un valore di 2 , e come posso risolvere questo problema?

È stato utile?

Soluzione

Questa è la maggior parte non probabile il problema, ma credo che il 2 ° riga del client.c frammento di seguito dovrebbe essere sizeof (ACK).

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

Inoltre, a seconda del flusso di dati, è possibile che si sta effettivamente leggendo correttamente e l'ACK è la risposta da un pacchetto che hai inviato in precedenza?

Altri suggerimenti

Non si dovrebbe mai inviare valori interi come questo, è necessario prestare maggiore attenzione alla serializzazione. Questo potrebbe fallire se, per esempio, il sizeof (int) è diverso sulla macchina di invio da ricevere uno, nel qual caso potrete leggere il numero errato di byte.

E 'meglio fare più attenzione e serializzare i campi un byte alla volta.

Al fine di eseguire il debug di esso, è possibile utilizzare Wireshark . Esegui Wireshark e impostare le opzioni per ascoltare la porta richiesta. Vedrete cosa è stato effettivamente inviato all'interno del pacchetto attraverso la rete. Questo vi permetterà di capire se il problema è con il server, il client o entrambi.

Non riesco a capire qualcosa di sbagliato con il codice incollato sopra. Mi piacerebbe suggerire uscire Wireshark, o un'altra presa programma di rintracciamento, e guardando i bit sul filo.

Mi piacerebbe verificare che il codice mittente / destinatario principale sta gestendo la giusta quantità di dati.

Se il mittente invia 20 byte seguito da un ACK quattro byte ma il ricevitore legge solo 16 prima di provare a leggere l'ACK, si potrebbe avere questo tipo di problema.

Se si invia i dati di lunghezza variabile (cioè. Con un prefisso ByteCount) una confusione comune sul fatto che il ByteCount viene trasmesso in realtà comprende i byte aggiuntivi necessari per inviare il numero di byte ...

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top