C#套接字模型视图控件

时间:2010-01-04 03:17:45

标签: c# sockets model view controls

以下是我正在处理的套接字类的一部分。我坚持的是在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);
    }

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

2 个答案:

答案 0 :(得分: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));

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

答案 1 :(得分:0)

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