English 中文(简体)
Client/Server: Integer always received as 1 (C-programming)
原标题:

I m building a client and a server program that exchanges data over TCP and I m having trouble sending an ACK-confirmation from the server back to the client when an operation is successfull. I ve managed to send a struct with various members from the client to the server, then the server should respond by sending an integer confirming the ID of the struct back to the client.

In server.c I have this function:

int sendACK(int socket, int ack_int){

    int com_result;
    int ACK = htonl(ack_int);

    printf("
	Sending ACK with value: %i", ack_int);

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

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

    return 1;

}

This function is called by another function in server.c like this:

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

So, if I have just recieved a struct with ID: 2, the output will be:
Sending ACK with value: 2

In client.c I recieve the ACK like this:

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

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

But the ACK is always recieved with a value of 1, so the output from client is:
Recieved 4 of 4 bytes
ERROR] Invalid ACK (1).

Why isn t the integer recieved with a value of 2, and how may I fix this?

最佳回答

This is most likely not the problem, but I believe that the 2nd line in your client.c snippet below should be sizeof(ACK).

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

Also, depending on your data flow, is it possible that you re actually reading correctly and the ACK is the response from a packet which you sent previously?

问题回答

You should never send whole values like this, you need to pay more attention to serialization. This might fail if, for instance, the sizeof (int) is different on the sending machine from the receiving one, in which case you will read the incorrect number of bytes.

It s better to take more care and serialize fields one byte at a time.

In order to debug it, you can use wireshark. Execute wireshark and set its options to listen to the required port. You will see what was actually sent inside the packet through the network. This will allow you to understand if the problem is with the server, the client or both.

I can t figure out anything wrong with the code you pasted above. I d suggest getting out Wireshark, or another socket tracing program, and looking at the bits on the wire.

I d check that your main sender/receiver code is handling the correct amount of data.

If your sender sends 20 bytes followed by a four byte ACK but the receiver only reads 16 before trying to read the ACK, you could have this sort of problem.

If you re sending variable length data (ie. with a bytecount prefix) a common confusion about whether the bytecount being transmitted actually includes the additional bytes required to send the byte count...





相关问题
Fastest method for running a binary search on a file in C?

For example, let s say I want to find a particular word or number in a file. The contents are in sorted order (obviously). Since I want to run a binary search on the file, it seems like a real waste ...

Print possible strings created from a Number

Given a 10 digit Telephone Number, we have to print all possible strings created from that. The mapping of the numbers is the one as exactly on a phone s keypad. i.e. for 1,0-> No Letter for 2->...

Tips for debugging a made-for-linux application on windows?

I m trying to find the source of a bug I have found in an open-source application. I have managed to get a build up and running on my Windows machine, but I m having trouble finding the spot in the ...

Trying to split by two delimiters and it doesn t work - C

I wrote below code to readin line by line from stdin ex. city=Boston;city=New York;city=Chicago and then split each line by ; delimiter and print each record. Then in yet another loop I try to ...

Good, free, easy-to-use C graphics libraries? [closed]

I was wondering if there were any good free graphics libraries for C that are easy to use? It s for plotting 2d and 3d graphs and then saving to a file. It s on a Linux system and there s no gnuplot ...

Encoding, decoding an integer to a char array

Please note that this is not homework and i did search before starting this new thread. I got Store an int in a char array? I was looking for an answer but didn t get any satisfactory answer in the ...

热门标签