以下是我正在处理的套接字类的一部分。我坚持的是在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);
}
我想我可以让这些方法返回一个字符串!也许这是最好的选择。
答案 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的方法非常出色,但我认为对于那些不熟悉行动的人来说,代表是一个很好的方法。当然,你必须定义委托,将其设置在某处,然后调用它。