【问题标题】:WinError: 10054 (0x2746) An existing connection was forcibly closed by the remote host. TCP ServerWinError: 10054 (0x2746) 现有连接被远程主机强行关闭。 TCP 服务器
【发布时间】:2021-05-25 17:48:11
【问题描述】:

我在 C# 中使用 Unity 运行客户端,仅此而已

byte[] buffer = { 1 };
Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
s.Connect(IP, PORT);
System.Int32 Result = s.Send(buffer);
Debug.Log(Result);

服务器端是用C写的,实在是太长了所以这里是我得到错误的地方

for(char i = 0; i < MAX_PLAYERS; ++i)
{
            if(ClientSockets[i] == INVALID_SOCKET) break;
            

            Result = recv(ClientSockets[i], Message, sizeof(Message), 0);
            
            if (Result == SOCKET_ERROR)
            {
                unsigned long LastError = GetLastError();
                if (LastError != 10035)
                {
                    Error("recv failed.\n");
                }
            }

在将它们放入 ClientSockets 数组之前,我已使用 ioctlsocket(ClientSocket, FIONBIO, &amp;iMode) 将套接字设为非阻塞。

【问题讨论】:

  • 什么是IP和PORT?您收到此错误消息的原因有几个。一个常见的原因是如果 IP 地址是环回 127.0.0.1 并且您使用 Send() 方法。为什么您的客户端和服务器在同一台机器上,您必须确保侦听器和发送者不使用相同的 IP。因此,您使用侦听器 IP.Any 和客户端使用机器的 IP 地址。
  • @jdweng ip 为“192.168.1.100”,端口为 7042
  • 这是否回答了您的问题:C socket: recv and send all data ? -> 接受的答案状态:The recv() and send() functions do not guarantee to send/recv all data (see man recv, man send)
  • 从 cmd.exe 中检查>Netstat -a 并查看端口是否已被使用。侦听器必须在客户端之前启动。如果在同一台机器上,监听器不能使用 IP 192.168.1.100。

标签: c# unity3d tcp winsock


【解决方案1】:

修复它。我的问题是客户端的套接字是在函数内部创建的,所以在函数执行完成后它就消失了。

【讨论】:

    猜你喜欢
    • 2020-04-20
    • 2018-01-02
    • 2016-10-20
    • 1970-01-01
    • 2015-02-28
    • 2015-05-24
    • 1970-01-01
    • 2020-10-09
    • 2012-02-07
    相关资源
    最近更新 更多