【问题标题】:select() function in C#C#中的select()函数
【发布时间】:2011-09-23 13:53:26
【问题描述】:

我是 C# 新手,如有任何帮助/反馈,我们将不胜感激。我试图在 C# 中开发一个客户端-服务器程序,但是我确实有不同的客户端向服务器端发送信息。有没有类似c语言select()的函数,可以帮助C#中的每个客户端获取所有信息?

这是我的服务器端代码:

// Create the listening socket...
m_mainSocket = new Socket(AddressFamily.InterNetwork, 
                          SocketType.Stream, ProtocolType.Tcp);
IPEndPoint ipLocal = new IPEndPoint(IPAddress.Any, 9051);

// Bind to local IP Address...
m_mainSocket.Bind(ipLocal);

// Start listening...
m_mainSocket.Listen(10);
Socket clientSock = m_mainSocket.Accept();
byte[] clientData = new byte[1024];
int receivedBytesLen = clientSock.Receive(clientData);
string clientDataInString = 
           Encoding.ASCII.GetString(clientData, 0, receivedBytesLen);
string clientStr = "Client Data Received: " + clientDataInString;
byte[] sendData = new byte[1024];
sendData = Encoding.ASCII.GetBytes(clientStr);
clientSock.Send(sendData);
clientSock.Close();

【问题讨论】:

  • 你使用什么协议? TCP/UDP/...?你还试过什么?你能显示一些代码吗?
  • 我使用的是TCP协议。代码示例见上面

标签: c# network-programming client-server


【解决方案1】:

有更高级别的构造,但如果您想获得相当低的级别,您可能正在寻找 Socket.Accept:

http://msdn.microsoft.com/en-us/library/system.net.sockets.socket.accept.aspx

【讨论】:

    【解决方案2】:

    你想接受来自多个客户端的连接,所以你必须在接受一个连接后再次调用阻塞的Accept方法:

    while (true)
    {            
        var clientSocket = s.Accept();
        beginReceive(clientSocket);
    }
    

    接受后,您可能希望开始以异步方式接收数据:

    private static void beginReceive(Socket clientSocket)
    {
        byte[] buffer = new byte[1000];
        clientSocket.BeginReceive(
               buffer, 0, 1000, SocketFlags.None, OnReceiveData, clientSocket);
    }
    

    最后是数据到达时框架在另一个线程上调用的回调方法。您必须使用EndReceive 完成异步调用:

    private static void OnReceiveData(IAsyncResult ar)
    {
        int bytesReceived = ((Socket) ar.AsyncState).EndReceive(ar);
        // process data...
    }
    

    当然,您必须将缓冲区存储在其他地方并为每个客户端维护一个接收缓冲区。也许您应该编写一个自己的类来管理连接的客户端。

    【讨论】:

      【解决方案3】:

      这是一个带有一些漂亮图表和示例的代码项目。底层的“选择”由 .NET 框架处理,因此您必须在更高层次上思考/工作。

      在较高级别上,您 socket.accept 创建一个线程来处理连接。

      http://msdn.microsoft.com/en-us/library/system.net.sockets.socket.accept.aspx http://www.codeproject.com/KB/IP/dotnettcp.aspx

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-09-27
        • 2013-09-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-06-10
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多