嘿,我與C#異步套接字編程做惡夢。你能指點我一本指南或教程,或者一本深入解釋異步編程的書。如果可能包含如何在開始發送/接收函數中使用狀態參數來處理多個客戶端。C#套接字編程
Q
C#套接字編程
2
A
回答
9
您可以閱讀
Asynchronous Socket Programming in C# Part 1
和
Asynchronous Socket Programming in C#: Part II
這是一個快速谷歌搜索的結果。
4
服務器可以通過這樣的場景進行組織:客戶端連接的分離線程偵聽端口。
/// Async server
public class AsyncServer
{
/// Server socket
private Socket _serverSocket;
/// Element for sync wait
private static ManualResetEvent _connectionMutex =
new ManualResetEvent(false);
/// Client handler
private ClientManager _clientManager;
public AsyncServer(string ipAddrees, int port)
{
try
{
this._serverSocket = new Socket(AddressFamily.InterNetwork,
SocketType.Stream, ProtocolType.Tcp);
this._serverSocket.Bind(
new IPEndPoint(IPAddress.Parse(ipAddrees), port));
}
catch (Exception ex)
{
throw new Exception("Server Init Error.", ex);
}
}
private BackgroundWorker _listenThread = new BackgroundWorker();
public void Start()
{
this._clientManager = new ClientManager(this._clientConnections);
this._listenThread.WorkerReportsProgress = true;
this._listenThread.WorkerSupportsCancellation = true;
this._listenThread.DoWork +=
new DoWorkEventHandler(ListenThread_DoWork);
this._listenThread.RunWorkerAsync(this._serverSocket);
}
/// Thread for listening port
private void ListenThread_DoWork(object sender, DoWorkEventArgs e)
{
Socket serverSocket = (Socket)e.Argument;
serverSocket.Listen(100);
while (true)
{
// reset mutex
_connectionMutex.Reset();
serverSocket.BeginAccept(
new AsyncCallback(this.AcceptCallback), this._serverSocket);
// waiting for the next connection
_connectionMutex.WaitOne();
}
}
/// List of client connections
private List _clientConnections = new List();
public int ConnectionsCount
{
get { return this._clientConnections.Count; }
}
/// Callback method for handling connections
private void AcceptCallback(IAsyncResult asyncResult)
{
_connectionMutex.Set();
Socket serverSocket = (Socket)asyncResult.AsyncState;
Socket clientSocket = (Socket)serverSocket.EndAccept(asyncResult);
this._clientConnections.Add(clientSocket);
this._clientManager.HandleClient(clientSocket);
}
}
方法AcceptCallback(IAsyncResult的asyncResult)手柄所有新的客戶端連接並轉移到ClientManager,其創建爲每個客戶端單獨的線程。
public class ClientManager
{
private List _clientProcessors = new List();
private List _connections;
public ClientManager(List connections)
{
this._connections = connections;
}
/// Handling of client connection
public void HandleClient(Socket clientSocket)
{
BackgroundWorker clientProcessor = new BackgroundWorker();
clientProcessor.DoWork += new DoWorkEventHandler(ClientProcessing);
this._clientProcessors.Add(clientProcessor);
List args = new List();
//
// args.Add(...);
clientProcessor.RunWorkerAsync(args);
}
private void ClientProcessing(object sender, DoWorkEventArgs e)
{
// reading args
List args = (List)e.Argument;
ProtocolSerializer serializer = new ProtocolSerializer();
try
{
while (socket.Connected)
{
// ...
}
}
catch (SocketException)
{
// ...
}
catch (Exception)
{
// ...
}
}
}
0
以下鏈接給出了關於C#異步套接字編程的分步教程。
http://csharp.net-informations.com/communications/csharp-socket-programming.htm
阿爾多。
相關問題
- 1. 套接字編程,C-java
- 2. 套接字編程。 c#.net
- 3. 在c編程的套接字編程
- 4. 套接字編程 - C - 選擇連接
- 5. 套接字編程
- 6. 套接字編程
- 7. 套接字編程
- 8. C++中的套接字編程
- 9. 新來的C#套接字編程
- 10. C++中的UDP套接字編程
- 11. 選擇套接字編程
- 12. PHP套接字編程
- 13. CPP套接字編程
- 14. 套接字編程UDP GetSocketOpt
- 15. 在ipad套接字編程
- 16. Java套接字編程
- 17. Python套接字編程
- 18. 黑莓套接字編程
- 19. Android套接字編程?
- 20. 套接字編程Java
- 21. 套接字編程學習
- 22. 異步套接字編程
- 23. C:UDP套接字編程
- 24. 異步套接字編程
- 25. Windows Phone套接字編程
- 26. Linux上的C編程套接字編程
- 27. 在ASP.net中使用C#編程的套接字編程
- 28. ioctl()用於C編程的套接字編程
- 29. C#套接字程序
- 30. Java套接字/服務器編程:套接字未連接
而不是針對套接字編程,你有沒有考慮過WCF?有了WCF中可用的功能,您只需要在非常特殊的情況下針對套接字進行編碼。 – 2009-09-08 07:38:41
從最近的經驗來看,如果你想做微乎其微的MSDN預留,.net中的套接字編程會令人難以置信的令人沮喪。強烈建議你看看任何其他可以爲你做的事情。 – annakata 2009-09-08 07:54:08
檢查[this](http://www.codeguru.com/csharp/csharp/cs_network/sockets/article.php/c7695) – 2009-09-08 07:39:40