none
關於Socket RRS feed

  • 問題

  • Server端 用於存放Client連線的Socket

    請問當Client斷線後,此Socket會無限接收到長度為0的資料是正常的嗎?

    2018年1月11日 上午 09:20

解答

  • 你 close 了就應該從 Sckss 這個陣列移除吧。另外, 建議你用 List<Socket> 替代 Socket[]


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。


    2018年1月19日 下午 04:33
    版主

所有回覆

  • 沒有程式碼猜不出來,理論上應該是不會才對。


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。

    2018年1月11日 上午 09:32
    版主
  • Client斷線後,不會無限接收到長度為0的資料。
    2018年1月11日 上午 09:51
  • 應該是沒斷線,只是沒通訊。

    你可以 google socket error 10035 ,裡面會有送 0 byte 來偵測網路是否斷線。

    https://www.google.com.tw/search?q=socket+error+10035


    不精確的問法,就會得到隨便猜的答案;自己都不肯花時間好好描述問題,又何必期望網友會認真回答?

    2018年1月11日 下午 02:49
  • 如果用TCP協定, Server端存放的會是Socket集合, 不是單一個Socket, 除非只有一個用戶端會連線到Server
    2018年1月12日 上午 12:36
  • 在 .Net 是一個 socket 建立一條連線,所以即使 server 端有很多 socket ,也不會是同一個物件收到 0 byte ,而且斷線後的 socket 事件也不會觸發。

    不精確的問法,就會得到隨便猜的答案;自己都不肯花時間好好描述問題,又何必期望網友會認真回答?

    2018年1月12日 下午 03:53
  • 沒有程式碼猜不出來,理論上應該是不會才對。


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。

    測試時,是以同一台電腦

    Server端

    開啟
    Sckss[0].Bind(ipss);
     Sckss[0].Listen(10);
    socketAccept();

    private void socketAccept()
            {
                bool FlagFinded = false;
                for (int i = 1; i < Sckss.Length; i++)
                {
                    if (Sckss[i] != null)
                    {
                        if (Sckss[i].Connected == false)
                        {
                            SckCIndex = i;
                            FlagFinded = true;
                            break;
                        }
                    }
                }
                if (FlagFinded == false)
                {
                    SckCIndex = Sckss.Length;
                    Array.Resize(ref Sckss, SckCIndex + 1);
                }
                Thread SckTd = new Thread(socketReceive);
                SckTd.Start();
            }
     private void socketReceive()
            {
                Sckss[SckCIndex] = Sckss[0].Accept();
                int Scki = SckCIndex;
                socketAccept();
                SetFormText("Client End Point"+Sckss[Scki].RemoteEndPoint);
                byte[] data = new byte[1024];
                while (true)                                 //當Client斷線後會不斷執行這個迴圈並且len會是0
                {
                    try
                    {
                        int len = Sckss[Scki].Receive(data);
                        //if (len == 0) break;
                        SetFormText(Encoding.UTF8.GetString(data, 0, len));
                        //System.Console.WriteLine(Encoding.UTF8.GetString(data, 0, len));
                    }
                    catch{}
                }
            }

    Client端 斷線時也就執行 Socket.Disconnect





    2018年1月19日 上午 08:00
  • 你 close 了就應該從 Sckss 這個陣列移除吧。另外, 建議你用 List<Socket> 替代 Socket[]


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。


    2018年1月19日 下午 04:33
    版主