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# 套接字模型视图控件的主要内容,如果未能解决你的问题,请参考以下文章