【问题标题】:C#-Server / C++ Client: Socket.Accept() never finishesC#-Server / C++ 客户端:Socket.Accept() 永远不会完成
【发布时间】:2024-01-20 07:12:01
【问题描述】:

我正在编写一个应该连接到 C# 服务器的简单 C++ 客户端。而且,虽然客户端运行良好,甚至表示它发送了一堆咬,但 C# 服务器永远不会超过listener.Acceppt()

Console.WriteLine("Waiting for a connection...");
// Program is suspended while waiting for an incoming connection.
Socket handler = listener.Accept();

我从这里获取服务器源:Microsoft MSDN: Synchronous Server Socket Example

我使用的客户端代码可以在这里找到:Microsoft MSDN: Complete Winsock Client Code

我还使用C# client 来检查服务器,它运行良好。我还检查了客户端的返回值,这看起来也很合理。所以我猜问题出在 C++ / C# 如何处理细节上。

我尝试 Wireshark 寻找一些提示,但奇怪的是,在使用的端口 (11000) 上绝对没有任何通信痕迹。

我应该从哪里着手解决这个问题?

更新:目前所有通信都只在本地进行。我为服务器和客户端尝试了我的 IPAddress(来自ipconfig)和127.0.0.1

我只安装了一个网络适配器,我使用那个 IP 地址。客户端检查getaddrinfo(argv[1], DEFAULT_PORT, &hints, &result) 并返回有效信息(例如 TCP 作为协议)。 connect() 返回0,应该没问题。

更新 2: 我尝试了 C++/C# Server-Client-Setups 的不同组合:

  • C++-服务器、C++ 客户端:工作
  • C++-服务器,C# 客户端:工作
  • C#-服务器,C# 客户端:工作
  • C#-服务器、C++ 客户端:不起作用
  • C#-服务器,putty:工作

更新 3: 我在其他服务器-客户端星座上尝试了 Wireshark,但它们都没有在 tcp.port == 11000 上显示任何流量,尽管它们确实有效(参见更新 2)。看起来 Wireshark 没有显示任何结果,因为一切都只是本地的(见 Wireshark localhost traffic capture

【问题讨论】:

  • 什...什么?只是为了确定 - 你是说客户端连接正常并发送数据,但服务器 accept() 从未返回?
  • ' 尝试 Wireshark 寻找一些提示,但奇怪的是,在使用的端口 (11000) 上绝对没有任何通信的痕迹' - 检查你的 IP 地址......你没有与你的服务器通信认为你是。
  • 我只安装了一个网络适配器,我使用那个 IP 地址。客户端检查getaddrinfo(argv[1], DEFAULT_PORT, &hints, &result) 并返回有效信息(例如 TCP 作为协议)。 connect() 返回0,应该没问题。
  • 如果客户端确实连接到您认为的服务器,我想不出任何方式可以在客户端成功连接并且 accept() 不会在服务器返回。
  • 我尝试更改一些小东西,例如更改服务器上的端口,但不更改客户端:连接失败。将客户端端口更改为与服务器相同的值:连接成功...

标签: c# c++ sockets tcp


【解决方案1】:

我遇到了同样的问题。 与winsock 的连接是异步的。您使用的 C# 示例是同步的。 您必须使用异步示例来与您的 C++ 代码进行通信。

我用了这两个例子!

C Sharp 服务器 https://msdn.microsoft.com/en-us/library/fx6588te(v=vs.110).aspx

C plus plus 客户端 https://msdn.microsoft.com/en-us/library/windows/desktop/ms737591(v=vs.85).aspx

【讨论】: