我正在开发一个项目,其中合作伙伴提供服务作为套接字服务器。我编写客户端套接字与它进行通信。通信是双向的:我向服务器发送请求,然后从服务器接收响应。
问题是我将数据发送到服务器,但显然服务器无法接收数据。
在我身边,我只是使用非常简单的实现,就像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的“绑定”实现的,它是缓冲流。 (即套接字send / recv在iostream :: write / read中完成。)
server_socket_io >> receive_data;
server_socket_io << response_data;
顺便说一下,我从我的合作伙伴那里得到了一个测试客户端,它也包含在一个iostream中。测试套接字客户端可以毫无问题地与服务器通信,但它必须在每个套接字发送后执行iostream :: flush()。
但我想保持简单,不要将我的套接字客户端包装在iostream中。
我只是想知道缓冲的iostream是否会导致问题:数据未被处理,因为客户端套接字发送的数据量非常少且仍然是缓冲的。
或者这可能是我的问题?我怎么知道我是否真的发送了数据?我的客户端套接字是否还缓冲数据?
我已尝试使用TCP_NODELAY进行一些“不好”的解决方法,但它没有帮助!
我该如何解决这个问题?从客户端?还是服务器端? 我应该在发送请求之后和接收响应之前关闭套接字,以便数据被“刷新”并处理?
还是应该将我的套接字包装在iostream中并进行刷新?
或服务器套接字应该使用“无缓冲”流?
感谢您的任何建议和建议!
答案 0 :(得分:3)
根据Jay的回答,您可以尝试任何网络数据包嗅探器并检查您的数据包是否到达服务器。看看wireshark或tcpdump。
答案 1 :(得分:2)
让我们用“分而治之”来解决问题。
首先,服务器是否有效?
从您的代码中查找服务器正在侦听的端口号。
启动您的服务器程序。 运行以下命令行程序以查看服务器是否正在侦听:
netstat -an -p tcp
它将生成一个连接列表。当服务器运行时,您应该在所选端口上看到连接。停止服务器并再次运行命令以确保端口不再使用。
验证服务器正在侦听后,请尝试使用以下命令连接到该服务器:
telnet your-server-address-here your-port-number-here
telnet将打印服务器在屏幕上发送给您的内容,并将您键入的内容发送回服务器。
这应该会给你一些好的线索。
答案 2 :(得分:1)
之前我遇到过类似的问题。我的问题是我从未在服务器上“接受”连接(TCP)以便在服务器/客户端之间创建流。在服务器端接受连接后,一切都按设计工作。
答案 3 :(得分:0)
您应该检查两个系统的防火墙设置。他们可能没有传递您的数据。