我正在用 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/