0

我正在从事一个合作伙伴提供服务作为套接字服务器的项目。我编写客户端套接字来与之通信。通信有两种方式:我向服务器发送请求,然后从服务器接收响应。

问题是我将数据发送到服务器,但显然服务器无法接收数据。

就我而言,我只是使用非常简单的实现,就像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 中并进行刷新?

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

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

4

4 回答 4

3

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

于 2010-10-29T20:18:00.260 回答
2

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

首先,服务器是否工作?

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

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

netstat -an -p tcp

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

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

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

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

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

于 2010-11-01T17:01:58.417 回答
1

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

于 2010-11-04T12:05:04.333 回答
0

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

于 2010-10-29T20:11:05.123 回答