c++ - Winsock : Echo server replying twice,,当我刚刚将它编程为执行一个 send() 调用时

标签 c++ windows winsock2

我正在用 C++ 为 Windows 做一个简单的 TCP 服务器来回显传入的数据。我有问题。在我解释我的问题之前,我必须说 Winsock 设置正确并且任何 IP 地址作为源都会发生这个问题。

建立连接时的一般行为是这样的:

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

为此,我目前正在使用两个 send() 调用:

  • 一个电话单独发送“REPLY”。
  • 另一个调用只是发回接收到的数据。

但是使用 Putty Client,我得到了这个: 回复 data_echoed 回复。

如果是第一个,为什么在最后一个发送调用之后发送 REPLY???我会在出现问题的地方发布一些代码:

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

这有什么问题?我将删除第一个电话,双重效果消失。为什么我不能一个接一个地执行两个发送调用?

最佳答案

在发送REPLY之前忽略recv的返回值,所以无论发生什么,您发送REPLY后跟内容缓冲区。在您第一次回显后,发生了一些事情,无论是什么,您都发送 REPLY

坦率地说,您似乎并不了解 TCP 的基础知识。我们曾经有一个规则,任何人在使用 TCP 做任何事情之前,都必须记住并完全理解以下语句:“TCP 是一种不保留应用程序消息边界的字节流协议(protocol)。

您的代码假装它正在接收和回显应用程序级消息。但是没有代码可以实际实现应用程序级消息。 TCP 不支持应用层消息,所以如果你想要它们,你必须实现它们。你显然想要它们。您也没有实现它们。

换行符是否分隔消息?如果是这样,在数据流中找到它们的代码在哪里?如果不是,那是什么?

关于c++ - Winsock : Echo server replying twice,,当我刚刚将它编程为执行一个 send() 调用时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27642026/

相关文章:

要求 const 对象的 C++ 类

c++ - 在 64 位机器中无法使用 getsystemdirectory() 获取正确的路径

windows - 为什么 WaitForSingleObject 会返回 WAIT_FAILED

windows - 无法访问 Metro 应用程序中的 Assets 文件

c - 在 WinSock 中处理异步套接字?

c++ - 如何在没有监听器的情况下创建 TCP 连接?

c++ - 继承,如何在下面定义的另一个类中使用一个类

c++ - 从 txt 中获取大量数据并对其进行排序

c++ - 何时在 C++ 中返回指针、标量和引用?

c++ - 单缓冲区阻塞WSASend可以传递部分数据吗?