我正在从事一个合作伙伴提供服务作为套接字服务器的项目。我编写客户端套接字来与之通信。通信有两种方式:我向服务器发送请求,然后从服务器接收响应。
问题是我将数据发送到服务器,但显然服务器无法接收数据。
就我而言,我只是使用非常简单的实现,就像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 中并进行刷新?
或者服务器套接字应该使用“无缓冲”流?
感谢您的任何建议和建议!