【问题标题】:Detecting and writing when client side disconnects客户端断开连接时检测并写入
【发布时间】:2012-07-27 00:52:33
【问题描述】:

我正在用 C# 编写一个简单的客户端/服务器应用程序。 如您所见,代码中有 if(cSocket.Connected) 标记,我想要类似的东西... 如果 cSocket 断开连接... 我会给出代码,你可以从标题和我的解释中理解我的问题......

这里是代码;

服务器;

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
using System.Net.Sockets;
using System.IO;

namespace ConsoleApplication1
{
class Program
{
    static void Main(string[] args)
    {
        TcpListener sSocket = new TcpListener(System.Net.IPAddress.Any, 3162);
        int Counter = 0;
        Console.ForegroundColor = ConsoleColor.Green;
        Console.WriteLine("\n >> Server Started!");
        sSocket.Start();
        while (true)
        {
            Socket cSocket = sSocket.AcceptSocket();
            NetworkStream NetworkStr = new NetworkStream(cSocket);
            BinaryReader bReader = new BinaryReader(NetworkStr);
            BinaryWriter bWriter = new BinaryWriter(NetworkStr);
            IPEndPoint remoteIpEndPoint = cSocket.RemoteEndPoint as IPEndPoint;

            if (cSocket.Connected)
            {
                Counter = Counter + 1;
                Console.ForegroundColor = ConsoleColor.Yellow;
                Console.WriteLine("\n >> Client Connected! ~ Total: " + Counter + " ~ [" + remoteIpEndPoint + "]");
                bWriter.Write("\n >> Server Says: You Connected to Me!");
            }
        }
    }
 }

感谢您的帮助:)

【问题讨论】:

  • 您所说的已连接是什么意思?您只能从连接的套接字初始化 NetworkStream。(我的意思是当 AcceptSocket 返回时它已经是连接的套接字)

标签: c# sockets client-server disconnect


【解决方案1】:

我对 .NET 的东西不太熟悉,但理论上应用程序和协议(包括 TCP/IP)需要等待某种超时。就像在 TCP/IP 协议家族中一样,一方在发送包后等待另一方一段时间,如果他没有得到答案,他会再次尝试和/或在一段时间后关闭连接。

简而言之,您可以定期发送一个小请求并检查客户端是否响应。

【讨论】:

    【解决方案2】:

    正如 Opi 所说的那样(它来自 StackOverFlow 中的另一个答案):

     public static bool SocketConnected(Socket s)
            {
                if (!s.Connected) return false;
                bool part1 = s.Poll(1000, SelectMode.SelectRead);
                bool part2 = (s.Available == 0);
                if (part1 & part2)
                    return false;
                return true;
            }
    

    【讨论】:

    • 我的意思是在vb中有winsock控件并且它有“关闭”事件,但是在c#中没有类似的事件,我会使用你的代码:)谢谢你的帮助......跨度>
    猜你喜欢
    • 2014-04-14
    • 2012-05-17
    • 2020-01-15
    • 1970-01-01
    • 2021-02-21
    • 2020-08-27
    • 2013-04-17
    • 2015-11-21
    • 2014-01-24
    相关资源
    最近更新 更多