【发布时间】:2026-01-30 14:10:02
【问题描述】:
我正在从事一个合作伙伴提供服务作为套接字服务器的项目。我编写客户端套接字来与之通信。通信有两种方式:我向服务器发送请求,然后从服务器接收响应。
问题是我将数据发送到服务器,但显然服务器无法接收数据。
就我而言,我只是使用非常简单的实现,就像 http://www.linuxhowtos.org/C_C++/socket.htm 中的示例一样
#include <sys/socket.h>
socket_connect();
construct_request_data();
send(socket, request_data, request_length, 0/*flag*/); // I set flag as 0
// now the server should receive my request and send response to me
recv(socket, response_data, response_length, 0);
socket_close();
似乎服务器套接字是通过对 std::iostream 的“绑定”实现的,并且它是缓冲流。 (即套接字发送/接收在 iostream::write/read 中完成。)
server_socket_io >> receive_data;
server_socket_io << response_data;
顺便说一句,我从我的合作伙伴那里得到了一个测试客户端,它也包含在一个 iostream 中。测试套接字客户端可以毫无问题地与服务器通信,但它必须在每次套接字发送后执行 iostream::flush() 。
但我想保持简单,不要将我的套接字客户端包装在 iostream 中。
我只是想知道缓冲的iostream是否会导致问题:数据没有被处理,因为客户端套接字发送的数据量非常小并且仍然被缓冲。
还是我的问题?我怎么知道我是否真的发送了数据?我的客户端套接字是否也缓冲数据?
我用TCP_NODELAY 尝试了一些“糟糕”的解决方法,但没有帮助!
我该如何解决这个问题?从客户端?还是服务器端? 我应该在发送请求后收到响应之前关闭套接字,以便“刷新”并处理数据吗?
还是应该将我的套接字包裹在 iostream 中并进行刷新?
或者服务器套接字应该使用“无缓冲”流?
感谢您的任何建议和建议!
【问题讨论】:
-
recv和send是低级函数,可以让您完全控制通过套接字流式传输的数据,因此没有什么是您无法实现的。在不知道server_socket_io、receive_data和response_data的类型的情况下,不可能确切地知道它们是如何格式化数据的,并且如果不查看使用send发送的缓冲区的内容,就不可能知道那里有什么实质性差异介于两种实现之间。你能发布一些显示差异的代码吗?
标签: c++ sockets iostream flush buffered