2010-01-04 45 views
1

以下是我正在处理的套接字类的一部分。我坚持的是在serverEndAccept我想通过/返回一个字符串表明接受已成功。对于这些我是否使用代表?还通过声明委托人是否违反应用程序模型隔离?即我需要这是一个独立的班级,可供将来分开使用。我确定有一个理智的解决方案,但是作为编程的新手,目前超越了我,所以我在问。C#套接字模型视图控件

感谢。

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)); 

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

+0

非常好!我只是想到你说的话!在方法调用中添加/提供出界。 – iTEgg 2010-01-04 04:05:01

0

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

+0

行动仅仅是一个代表本身,尽管是一个通用的代码,不需要自己编写代码。如果您需要从委托执行中返回结果,那么还有Func通用委托。 – joshperry 2010-01-04 04:12:49