gpt4 book ai didi

C# 客户端与 C++ 服务器通信 - 服务器可以从套接字读取但写入不成功

转载 作者:行者123 更新时间:2023-12-03 12:04:25 25 4
gpt4 key购买 nike

我的两个程序有问题 - C# 客户端可以使用套接字成功地将数据写入 C++ 客户端,但从服务器读取数据不成功。

这是我的 C++ 代码:

int sock = socket(PF_INET, SOCK_STREAM, 0);

sockaddr_in sockad;
// sin_family, port etc defined here

bind(sock, (sockaddr*)&sockad, sizeof(sockad));

listen(sock, 15);

char buf;
stringstream ss;

while(running) {

socklen_t sockl = sizeof(sockad);
int sockd = accept(sock, (sockaddr*)&sockad, &sockl);

while(recv(sockd, &buf, 1, 0) > 0) {
ss << buf;
}

// THIS is printed
cout << ss.str() << endl;

string response = "asdgfh";

// THIS never reaches the C# client
write(sockd, response.c_str(), strlen(response.c_str()));

close(sockd);
}

close(sock);

这是我的 C# 代码:
string message = "message";
Int32 port = 4345;
TcpClient client = new TcpClient("server.address.com", port);
NetworkStream stream = client.getStream();

Byte[] data = new Byte[256];
data = Encoding.ASCII.GetBytes(message);

// THIS SUCCEEDS
stream.Write(data, 0, data.Length);

// THIS FAILS, it also freezes the other program
Int32 bytes = stream.Read(data, 0, data.Length);

responseData = Encoding.ASCII.GetString(data, 0, bytes);

stream.Close();
client.Close();

那么我的代码有什么问题,或者这是服务器配置问题还是类似的问题?

最佳答案

问题是典型的死锁。

在 C++ 端,您一直从套接字读取,直到 TCP 连接(半)关闭。在 C# 端,您写入一些数据,然后等待 TCP 连接(半)关闭。双方都没有关闭连接,因此两个程序都必须阻止它们各自的读取/接收,直到有其他东西破坏了通信。这基本上意味着“拔掉网线”,因为 TCP 默认情况下不做任何心跳或任何事情。

您需要了解有关 TCP 的两件事。首先,TCP 是基于流的协议(protocol),而不是基于消息的协议(protocol)。这意味着如果你想通过 TCP 发送消息,你需要添加你自己的框架——在 TCP 的流之上构建你自己的消息协议(protocol)。您假设 C# 端的写入将神奇地对应于 C++ 端的读取,但这根本不是 TCP 的工作方式。

其次,读取/接收仅在流关闭时返回零。这与 TCP 作为基于流的协议(protocol)密切相关 - 如果您只是等待一点缓冲区被填充,它会假装有无限量的数据要读取。

这个问题主要有两种解决方案。首先是确保您在继续写入之前只阅读一条消息。做到这一点的简单方法是在你发送的“消息”前面加上它的长度,这样 C++ 端就知道当 N 个字节被读取时,它拥有它需要的所有数据并且可以继续。二是使用异步I/O同时读写。始终有一个未完成的读取请求,并对您阅读的内容使用react,而不是尝试执行读写顺序代码。

如果你只需要一个请求-响应模式,类似于 HTTP,你也可以只部分关闭套接字。您可以使用 TcpClient.Client.Shutdown(SocketShutdown.Send)在 C# 端执行此操作。然后两个应用程序都可以自由地继续处理响应。当然,当响应处理完成后,您又想关闭,这次是从 C++ 端。结果是双方的连接关闭,以及完整的请求-响应循环。

关于C# 客户端与 C++ 服务器通信 - 服务器可以从套接字读取但写入不成功,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35869633/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com