C# 套接字模型视图控件

Posted

技术标签:

【中文标题】C# 套接字模型视图控件【英文标题】:C# sockets model view control 【发布时间】:2010-01-04 03:17:45 【问题描述】:

以下是我正在处理的套接字类的一部分。我坚持的是在 serverEndAccept 我想传递/返回一个字符串,表明接受已经成功。这些我要使用代表吗?也通过声明代表它不会违反应用程序模型隔离吗?即我需要这是一个独立的类,将来可以单独使用。我确信有一个理智的解决方案,但作为一个编程新手,目前它超出了我的范围,所以我在问。

谢谢。

    public void serverBeginAceept(int serverPort)
    
        mainSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

        IPEndPoint ipEndPoint = new IPEndPoint(IPAddress.Any, serverPort);

        mainSocket.Bind(ipEndPoint);
        mainSocket.Listen(MAX_CONNECTIONS);
        mainSocket.BeginAccept(new AsyncCallback(serverEndAccept), mainSocket);
    

    public void serverEndAccept(IAsyncResult iar)
    
        Socket oldServer = (Socket)iar.AsyncState;
        mainSocket = oldServer.EndAccept(iar);
    

我想我可以让这些方法返回一个字符串!也许这是最好的选择。

【问题讨论】:

【参考方案1】:

您可以创建一个状态类来将异步操作的状态保持在开始和结束之间,如下所示:

class AcceptState

    public Socket Socket get; set; 
    public string IdString  get; set; 
    public Action<string> Accepted  get; set; 


public void serverBeginAceept(int serverPort, string id, Action<string> accepted)

    mainSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

    IPEndPoint ipEndPoint = new IPEndPoint(IPAddress.Any, serverPort);

    var state = new AcceptState() 
        Socket = mainSocket,
        IdString = id,
        Accepted = accepted,
    ;

    mainSocket.Bind(ipEndPoint);
    mainSocket.Listen(MAX_CONNECTIONS);
    mainSocket.BeginAccept(new AsyncCallback(serverEndAccept), );


public void serverEndAccept(IAsyncResult iar)

    var state = (AcceptState)iar.AsyncState;
    mainSocket = state.Socket.EndAccept(iar);
    state.Accepted(state.IdString);

你可以用 lambda 来这样称呼它:

serverBeginAccept(1234, "My ID", s => MessageBox.Show(s));

这将弹出一个消息框,其中包含您在接受连接时传入的任何字符串。

【讨论】:

非常好!我刚想到你说的!在方法调用上添加/提供外围。【参考方案2】:

虽然 joshperry 的方法非常出色,但我认为对于那些不熟悉动作的人来说,委托是一个不错的选择。当然,你必须定义委托,将其设置在某处,然后调用它。

【讨论】:

Action 本身只是一个委托,尽管它是一个通用的委托,让您不必自己编写。如果您需要从委托执行中返回结果,还有 Func 通用委托。

以上是关于C# 套接字模型视图控件的主要内容,如果未能解决你的问题,请参考以下文章

使用套接字的 C# 线程

多线程套接字连接挂起 c#。套接字超时/挂起

C# 异步套接字概念

C#检查套接字是不是断开连接?

C# Socket初探

没有 while(true) 循环的 C# 非阻塞套接字