【问题标题】:C# sockets server unable to receive data from same client connection more than onceC# 套接字服务器无法多次从同一客户端连接接收数据
【发布时间】:2011-02-21 22:33:13
【问题描述】:

我最近问了一个相关问题In C# how do I have a socket continue to stay open and accept new data? 并在一定程度上解决了这个问题,但现在我无法让我的服务器多次从同一个客户端接收数据。

我在 VS 中使用 windows 窗体编写了一个简单的套接字服务器,它有一个调用接收函数的按钮

public void Receive()
    {
        try
        {
            byte[] bytes = new byte[256];
            received = s1.Accept().Receive(bytes);
            receivedText.Text += System.Text.ASCIIEncoding.ASCII.GetString(bytes);
        }
        catch (SocketException e)
        {
            Console.WriteLine("{0} Error code: {1}.", e.Message, e.ErrorCode);
            return;
        }
    }

如果我第一次从我的客户端发送它可以工作,但是如果我尝试发送任何其他内容并单击接收,我的服务器只会循环并且永远不会接收新数据。但是,如果我从其他地方发送,或者从我的客户端重新启动连接,我就可以发送数据。

我希望我的服务器能够一次从同一个客户端接收任意数量的数据。请询问您是否需要更多代码/详细信息。不确定什么是相关的,因为我对套接字编程很陌生。

【问题讨论】:

    标签: c# sockets client


    【解决方案1】:

    您必须为每个客户端调用一次 Accept(),而不是每次要接收新数据时。 Accept() 基本上等待客户端连接到您的服务器套接字 s1 (并返回一个新套接字以与该客户端发送/接收数据),因此每次调用 Receive() 函数时,您的套接字都会等待另一个客户端连接,这就是它只工作一次的原因。

    这是一个例子(代码来自你之前的问题):

    s1.Bind(endP);
    s1.Listen(10);
    Socket s2 = s1.Accept(); // Waits for a client to connect and return a socket, s2, to communicate with him
    while (true) {
        Receive(s2);
    }
    ...
    

    接收()函数:

    public void Receive(Socket s)
    {
        try
        {
            byte[] bytes = new byte[256];
            received = s.Receive(bytes);
            receivedText.Text += System.Text.ASCIIEncoding.ASCII.GetString(bytes);
        }
        catch (SocketException e)
        {
            Console.WriteLine("{0} Error code: {1}.", e.Message, e.ErrorCode);
            return;
        }
    }
    

    【讨论】:

    • 谢谢!我已经设置了我的程序,所以按下接收按钮会在我从 Accept() 获得的第二个套接字上调用 Receive(),但只有一次 Accept()。
    猜你喜欢
    • 1970-01-01
    • 2017-04-30
    • 2016-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多