Dean Winchester
Dean Winchester

Reputation: 15

Winsock: Echo server replying twice, when I just programmed it to do one send() call

I am doing a simple TCP server in C++ for Windows to echo incoming data. I have a problem with it. Before I explain my problem, I have to say that Winsock is properly set up and this problem happens with any IP address as the source.

The general behaviour when a connection is established is this:

In the loop that runs while connection still alive, it must echo data, and precede it with REPLY word.

To do that, I'm currently using two send() calls:

But using Putty Client, I'm getting this: REPLY data_echoed REPLY.

Why REPLY is sent after the last send call if it was the first??? I'll post a little code where the problem happens:

//Reply to client
message = "HELLO CLIENT!! READY TO ECHO.\n";
send(new_socket, message, strlen(message), 0);

///Enter into a loop until connection is finished.
printf("%s \n\n", "Incoming data goes here: ");
do{

    ///Clear buffer and receive data.
    memset(buffer, 0, sizeof(buffer));
    ret = recv(new_socket, buffer, sizeof(buffer), 0);


    printf("%s", buffer);

    ///Send a REPLY WORD and the data echoed.
    send(new_socket, "REPLY\r\n", 7, 0);
    send(new_socket, buffer, sizeof(buffer), 0);

}while(ret != SOCKET_ERROR);

What is wrong with that? I'll remove the first call, and the double effect disappears. Why I can't do two send calls one after other?

Upvotes: 1

Views: 715

Answers (1)

David Schwartz
David Schwartz

Reputation: 182769

You ignore the return value of recv until after you send REPLY, so no matter what happens, you send REPLY followed by the contents of the buffer. After you echo the first time, something happens, and no matter what it is, you send REPLY.

Bluntly, it doesn't look like you understand the very basics of TCP. We used to have a rule that before anyone can do anything with TCP, they must memorize and completely understand the following statement: "TCP is a byte-stream protocol that does not preserve application message boundaries."

Your code pretends that it is receiving and echoing application-level messages. But there is no code to actually implement application-level messages. TCP has no support for application-level messages, so if you want them, you have to implement them. You clearly want them. You also have not implemented them.

Do newline characters delimit messages? If so, where's the code to find them in the data stream? If not, what does?

Upvotes: 3

Related Questions