2010-01-04 19 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