远程主机强迫关闭了一个现有的连接

时间:2022-02-16 23:49:29
我在做socket编程时 用客户端连续向服务器端发送数据时出现“远程主机强迫关闭了一个现有的连接” 请问该怎么解决?

10 个解决方案

#1


就是说本来客户端和服务器是连接的,但是服务器把当前这个连接给关了,而你的客户端还尝试使用这个连接,所以报错了。我估计是这样的。你检查下服务器的代码吧,看看哪里关掉了

#2


不好意思 我没说清楚  是服务器端抛出的这个异常 服务器端无法运行了

#3


可能是数据堵塞了,减少每次发送的字节量试试

#4


不应该啊 我就发送了几十byte的数据

#5


这种问题,只能贴代码了。

#6


public void newConn(object o)

    Socket socket = (Socket)o;
    byte[] rMsg = new byte[1000];
    while (true)
    {
        int i = socket.Receive(rMsg);
        if (i > 0)
        {
            //注册
            if (rMsg[0] == 0)
            {
                int result = uBLO.Register(rMsg);
                byte[] sMsg = new byte[1];
                sMsg[0] = Convert.ToByte(result);
                socket.Send(sMsg);
             }
             //登录
             else if (rMsg[0] == 1)
             {
                  int result = uBLO.Login(rMsg);
                  byte[] sMsg = new byte[1];
                  sMsg[0] = Convert.ToByte(result);
                  socket.Send(sMsg);
             }
         }
     }
}

#7


你send的时候重新建个socket。这又收又发的。。

#8



rMsg是byte[]类型
if (rMsg[0] == 0)
else if (rMsg[0] == 1)
猜测你收到的应该是字符"0"或者"1",这样的话两个条件判断为false,2个send都不会执行
然后你服务端代码结束,系统关闭socket。而你的客户端还在傻乎乎receive,,,所以报警socket关闭

如果收到字符进行判断,应该如下
if (rMsg[0] == '0')
else if (rMsg[0] == '1')

#9


出现“远程主机强迫关闭了一个现有的连接”(错误ID为10054),主要是由于一端(不管是客户端或者服务器)关闭Socket后,另外一端还在循环接收,一般就是这个错误,或者“主机软件关闭了一个现有连接之类”(错误ID为10053)。其实你应该把这个当做正常流程来考虑:你客户端是不是终将会关闭吧,那个时候一样报这个错误;所以在catch 上述错误后,进行正常的后续资源释放工作就行。当然,如果你客户端程序在某个异常流程也造成中断,那就仔细排查客户端程序就行。

#10


又发又收没问题的,关键是双方通讯时的游戏规则要定好。客户端那边应该是要等待(可异步)服务端的返回值再进行下一步操作的

#1


就是说本来客户端和服务器是连接的,但是服务器把当前这个连接给关了,而你的客户端还尝试使用这个连接,所以报错了。我估计是这样的。你检查下服务器的代码吧,看看哪里关掉了

#2


不好意思 我没说清楚  是服务器端抛出的这个异常 服务器端无法运行了

#3


可能是数据堵塞了,减少每次发送的字节量试试

#4


不应该啊 我就发送了几十byte的数据

#5


这种问题,只能贴代码了。

#6


public void newConn(object o)

    Socket socket = (Socket)o;
    byte[] rMsg = new byte[1000];
    while (true)
    {
        int i = socket.Receive(rMsg);
        if (i > 0)
        {
            //注册
            if (rMsg[0] == 0)
            {
                int result = uBLO.Register(rMsg);
                byte[] sMsg = new byte[1];
                sMsg[0] = Convert.ToByte(result);
                socket.Send(sMsg);
             }
             //登录
             else if (rMsg[0] == 1)
             {
                  int result = uBLO.Login(rMsg);
                  byte[] sMsg = new byte[1];
                  sMsg[0] = Convert.ToByte(result);
                  socket.Send(sMsg);
             }
         }
     }
}

#7


你send的时候重新建个socket。这又收又发的。。

#8



rMsg是byte[]类型
if (rMsg[0] == 0)
else if (rMsg[0] == 1)
猜测你收到的应该是字符"0"或者"1",这样的话两个条件判断为false,2个send都不会执行
然后你服务端代码结束,系统关闭socket。而你的客户端还在傻乎乎receive,,,所以报警socket关闭

如果收到字符进行判断,应该如下
if (rMsg[0] == '0')
else if (rMsg[0] == '1')

#9


出现“远程主机强迫关闭了一个现有的连接”(错误ID为10054),主要是由于一端(不管是客户端或者服务器)关闭Socket后,另外一端还在循环接收,一般就是这个错误,或者“主机软件关闭了一个现有连接之类”(错误ID为10053)。其实你应该把这个当做正常流程来考虑:你客户端是不是终将会关闭吧,那个时候一样报这个错误;所以在catch 上述错误后,进行正常的后续资源释放工作就行。当然,如果你客户端程序在某个异常流程也造成中断,那就仔细排查客户端程序就行。

#10


又发又收没问题的,关键是双方通讯时的游戏规则要定好。客户端那边应该是要等待(可异步)服务端的返回值再进行下一步操作的