相关疑难解决方法(0)

20使用SocketAsyncEventArgs每秒接收

使用SocketAsyncEventArgs开发TCP服务器,它是Windows服务的异步方法.我在Main的开头有这两行代码:

ThreadPool.SetMaxThreads(15000, 30000);
ThreadPool.SetMinThreads(10000, 20000);
Run Code Online (Sandbox Code Playgroud)

并且都返回true(记录返回值).现在2000到3000个客户端开始向此服务器发送消息,它开始接受连接(我计算连接数,它是预期的 - 有一个连接池).服务器进程的线程数将增长到~2050到~3050.到现在为止还挺好!

现在有一个Received方法,在ReceiveAsync返回true或SocketAsyncEventArgs的Completed事件后调用.

问题就此开始了:无论客户端连接多少以及发送的消息数量多少,接收的消息最多只能在一秒钟内调用20次!随着客户数量的增加,这个数字(20)下降到~10.

环境:TCP服务器和客户端正在同一台计算机上进行模拟.我在两台机器上测试了代码,一台有2核CPU和4GB RAM,另一台有8核CPU和12GB RAM.(还没有)数据丢失,有时我在每次接收操作中都会收到多条消息.没关系.但是如何才能增加接收操作的数量?

关于实现的附加说明:代码很大,包含许多不同的逻辑.总体描述如下:我有一个SocketAsyncEventArgs用于接受新连接.它很棒.现在,对于每个新接受的连接,我创建一个新的SocketAsyncEventArgs来接收数据.我把这个(为接收创建的SocketAsyncEventArgs)放在一个池中.它不会被重用,但它的UserToken被用于跟踪连接; 例如那些断开连接的连接或那些7分钟内没有发送任何数据的连接将被关闭和处理(SocketAsyncEventArgs的AcceptSocket将被关闭(两者),关闭和处理,SocketAsyncEventArgs对象本身也是如此).这是一个执行这些任务的Sudo类,但所有其他逻辑和日志记录以及错误检查和其他任何内容都被删除,以使其简单明了(也许更容易发现有问题的代码):

class Sudo
{
    Socket _listener;
    int _port = 8797;

    public Sudo()
    {
        var ipEndPoint = new IPEndPoint(IPAddress.Any, _port);
        _listener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
        _listener.Bind(ipEndPoint);

        _listener.Listen(100);

        Accept(null);
    }

    void Accept(SocketAsyncEventArgs acceptEventArg)
    {
        if (acceptEventArg == null)
        {
            acceptEventArg = new SocketAsyncEventArgs();
            acceptEventArg.Completed += AcceptCompleted;
        }
        else acceptEventArg.AcceptSocket = null;

        bool willRaiseEvent = _listener.AcceptAsync(acceptEventArg); ;

        if (!willRaiseEvent) Accepted(acceptEventArg);
    }

    void AcceptCompleted(object sender, SocketAsyncEventArgs e)
    {
        Accepted(e); …
Run Code Online (Sandbox Code Playgroud)

c# sockets windows asynchronous socketasynceventargs

9
推荐指数
1
解决办法
6660
查看次数

套接字缓冲它接收的数据

我有一个客户端.NET应用程序和一个服务器.NET应用程序,通过套接字连接.

客户端每500毫秒发送一个包含20个左右字符的字符串.

在我的本地开发机器上,这很好用,但是一旦客户端和服务器在两个不同的服务器上,服务器在发送时不会立即收到字符串.客户端仍然发送完美,我已经通过Wireshark证实了这一点.我还确认服务器确实每500毫秒收到一次字符串.

问题是,我等待消息的服务器应用程序实际上每20秒左右才会收到一条消息 - 然后它会从这20秒内收到所有内容.

我使用异步套接字,由于某种原因,回调不会每20秒调用一次.

AcceptCallback它建立连接和呼叫BeginReceive

handler.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0, new AsyncCallback(ReadCallback), state);
Run Code Online (Sandbox Code Playgroud)

这适用于我的本地计算机,但在我的生产服务器上,ReadCallback不会立即发生.

BufferSize设置为1024.我也尝试将其设置为10.一旦调用ReadCallback,它会一次从套接字读取多少数据,但这不是真正的问题.一旦它调用ReadCallback,其余的工作正常.

我正在使用微软异步服务器套接字示例,所以你可以看到我的ReadCallback方法是什么样的.

当数据到达服务器时,如何立即获得BeginReceive回调?

-

UPDATE

这已经解决了.这是因为服务器有一个单处理器和一个单核.添加另一个核心后,问题立即得到解决.现在,当呼叫进入服务器时,立即调用ReadCallback.

谢谢大家的建议!!

c# sockets

7
推荐指数
3
解决办法
2058
查看次数