Winsock:回显服务器回复两次,当时我刚刚将其编程为执行一次send()调用
Winsock: Echo server replying twice, when I just programmed it to do one send() call
我正在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 不支持应用程序级消息,因此如果需要它们,则必须实现它们。你显然想要它们。您也没有实现它们。
换行符会分隔消息吗?如果是这样,在数据流中找到它们的代码在哪里?如果没有,怎么办?
相关文章:
- Fortran 和 C++ 的混合编程:Fortran 不能调用C++子程序
- 我可以使用功能指针在编程语言边界上调用函数
- 有没有办法在函数以编程方式返回的引用上多次调用函数? -元组动态访问
- 从其他编程语言调用 c++ dll 类函数
- Winsock:回显服务器回复两次,当时我刚刚将其编程为执行一次send()调用
- C++模板编程:如何调用type的函数?
- c++支持模板元编程中的最后调用优化
- 编程系统调用WDCI意外行为(提升的权限)
- 不同的编程语言和调用约定
- 调用第二个*函数时编程软锁定
- 如何以编程方式调用Windows 7中的Ctrl+Alt+Del窗口
- 如何在64位窗口中以编程方式模拟DllMain调用
- 拥有 HMENU,如何枚举菜单项并以编程方式调用菜单项
- 以编程方式调用"Save to PDF..."表
- 以编程方式调用正确的函数参数
- c++模板编程-延迟函数调用
- 如何使用编程方法拦截linux上运行进程中调用的系统调用
- 通过模板元编程用try包装任意函数调用.catch块在现代c++中
- 函数式编程-当调用不带参数的C++函数时,括号的重要性
- 测试是否可以使用元编程调用 f(x)