【问题标题】:client socket sends data but server socket does not receive them. c++ buffered stream?客户端套接字发送数据,但服务器套接字不接收它们。 c ++缓冲流?
【发布时间】: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 中并进行刷新?

或者服务器套接字应该使用“无缓冲”流?

感谢您的任何建议和建议!

【问题讨论】:

  • recvsend 是低级函数,可以让您完全控制通过套接字流式传输的数据,因此没有什么是您无法实现的。在不知道server_socket_ioreceive_dataresponse_data 的类型的情况下,不可能确切地知道它们是如何格式化数据的,并且如果不查看使用send 发送的缓冲区的内容,就不可能知道那里有什么实质性差异介于两种实现之间。你能发布一些显示差异的代码吗?

标签: c++ sockets iostream flush buffered


【解决方案1】:

我以前也遇到过类似的问题。我的问题是我从来没有“接受”服务器上的连接(TCP),以便在服务器/客户端之间创建流。在我接受服务器端的连接后,一切都按设计进行。

【讨论】:

    【解决方案2】:

    让我们用“分而治之”来解决问题。

    首先,服务器是否工作?

    从您的代码中查找您的服务器正在侦听的端口号。

    启动您的服务器程序。 运行以下命令行程序,看看服务器是否真的在监听:

    netstat -an -p tcp

    它将产生一个连接列表。当服务器运行时,您应该会在您选择的端口上看到一个连接。停止服务器并再次运行命令以确保端口不再使用。

    一旦您确认服务器正在侦听,请尝试使用以下命令连接到它:

    telnet your-server-address-here your-port-number-here

    telnet 将在屏幕上打印您的服务器发送给您的内容,并将您输入的内容发送回服务器。

    这应该会给你一些很好的线索。

    【讨论】:

      【解决方案3】:

      除了 Jay 的回答之外,您可以尝试任何网络数据包嗅探器并检查您的数据包是否到达服务器。看看wireshark或tcpdump。

      【讨论】:

      • 服务器端用 iostram 和 streambuf 包装套接字,一开始我担心 streambuf::underflow() 可能无法正确实现。然后我使用wireshark监控数据包流量,发现客户端确实发送了数据包,服务器也应该接收它们。突然我注意到客户端发送的数据包与它应该的不同(针对特定协议),然后我很容易确定问题是我只是发送了错误的数据包内容并且服务器无法识别它(因此没有处理它)。
      • 这真是一个简单的失败!甚至与套接字无关!但是使用wireshark 或tcpdump 来查看数据包始终是缩小问题范围的好主意。因此,我在我的情况下给出你的建议作为答案:P
      【解决方案4】:

      您应该检查两个系统的防火墙设置。他们可能不会传递您的数据。

      【讨论】:

      • 这不是问题所在。我已经检查过了。
      最近更新 更多