Winsock:回显服务器回复两次,当时我刚刚将其编程为执行一次send()调用

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

本文关键字:调用 编程 一次 执行 send 服务器 回复 当时 Winsock 两次      更新时间:2023-10-16

我正在C++做一个简单的TCP服务器,以便Windows回显传入的数据。我有问题。在我解释我的问题之前,我不得不说Winsock设置正确,并且此问题发生在任何IP地址作为源的情况下。

建立连接时的一般行为如下:

在连接仍处于活动状态时运行的循环中,它必须回显数据,并在它前面加上 REPLY 字。

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

  • 一个电话单独发送"回复"。
  • 另一个呼叫只是发回接收到的数据。

但是使用腻子客户端,我得到这个: 回复data_echoed回复。

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

//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 nn", "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, "REPLYrn", 7, 0);
    send(new_socket, buffer, sizeof(buffer), 0);
}while(ret != SOCKET_ERROR);

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

在发送REPLY之前,您忽略 recv 的返回值,因此无论发生什么情况,您都会发送REPLY后跟缓冲区的内容。第一次回声后,发生了一些事情,不管是什么,你发REPLY.

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

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

换行符会分隔消息吗?如果是这样,在数据流中找到它们的代码在哪里?如果没有,怎么办?