首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >套接字队列问题

套接字队列问题
EN

Stack Overflow用户
提问于 2013-08-02 18:27:17
回答 1查看 994关注 0票数 0

大家好,我有这个问题,我被它卡住了,所以任何帮助都将非常感谢

我必须构建一个socket chat (客户端服务器)模块,我已经完成了几乎80%的工作,但现在我卡住了,方案是我有一个服务器应用程序,客户端现在连接到它,假设有4个客户端连接到服务器,每个客户端都可以相互通信,一个客户端将发送消息,服务器将接收该消息并将其传递,这是非常好的工作,但当2个或更多的客户端同时发送消息到第三个客户端时,我无法获得一条消息,客户端断开连接我知道我必须建立一个队列结构,但我在这里没有成功这里是我的代码结构

代码语言:javascript
运行
复制
StartReceive(SocketAsyncEventArgs) ->

首先,我调用这个方法来开始监听传入的消息

当我收到一条消息时,我会检查它是同步完成还是异步完成

在此之后,有一个io完成的侦听器,每次完成一个接收操作时都会调用该侦听器,在该io完成的方法中,我调用了processReceive方法,该方法用于处理接收到的块,所以最后我的代码结构如下所示

代码语言:javascript
运行
复制
StartReceive-> IO Completed -> ProcessReceive

我设计了这样的结构,每个客户端在服务器端都有一个接收SOCKETASYNCEVENTAGRS对象和一个发送SOCKETASYNCEVENTAGRS,我为此维护了一个池

因此每个客户端都通过自己SOCKETASYNCEVENTAGRS对象接收和发送数据

我想要一个场景,如果两个或更多的客户端发送消息到第三个客户端,而不是第三个客户端应该同时接收所有消息,它应该有一个队列结构,它应该一次接收一个消息,发送操作相同

下面是我的一些代码

代码语言:javascript
运行
复制
  private void StartReceive(SocketAsyncEventArgs receiveSendEventArgs)
    {
        DataHoldingUserToken receiveSendToken = (DataHoldingUserToken)receiveSendEventArgs.UserToken;
        receiveSendEventArgs.SetBuffer(receiveSendToken.bufferOffsetReceive, this.socketListenerSettings.BufferSize);                    
        bool willRaiseEvent = receiveSendEventArgs.AcceptSocket.ReceiveAsync(receiveSendEventArgs);
        if (!willRaiseEvent)
        {

            ProcessReceive(receiveSendEventArgs);                
        }            
    }

这是IO完成

代码语言:javascript
运行
复制
 void IO_Completed(object sender, SocketAsyncEventArgs e)
    {
        DataHoldingUserToken receiveSendToken = (DataHoldingUserToken)e.UserToken;
        switch (e.LastOperation)
        {
            case SocketAsyncOperation.Receive:                
                ProcessReceive(e);
                break;

            default:
        }
    }

这是我的StartReceive,实现了队列,但它不工作

代码语言:javascript
运行
复制
 Queue rec = new Queue();
    bool IsExecuted = true;
    private void StartReceive(SocketAsyncEventArgs receiveSendEventArgs)
    {
        if (IsExecuted)
        {
            DataHoldingUserToken receiveSendToken = (DataHoldingUserToken)receiveSendEventArgs.UserToken;
            rec.Enqueue(receiveSendToken);
        }
        try
        {
            receiveSendEventArgs.SetBuffer(receiveSendToken.bufferOffsetReceive, this.socketListenerSettings.BufferSize);
            bool willRaiseEvent = receiveSendEventArgs.AcceptSocket.ReceiveAsync(receiveSendEventArgs);
            if (!willRaiseEvent)
            {

                ProcessReceive(receiveSendEventArgs);
            }
            rec.Dequeue();
            IsExecuted = true;
        }
        catch
        {
            IsExecuted = false;
            StartReceive(receiveSendEventArgs);
        }
    }

寻找一个像样的帮助或一些好的方向

EN

回答 1

Stack Overflow用户

发布于 2013-08-19 18:14:54

我不确定这是否是你的问题的根源,但在我看来,你似乎在某个时候耗尽了DataHoldingUserToken,因为你从来没有对你出列的对象做任何事情,所以你把它扔掉了。

另请注意,对于非平凡对象,建议使用Queue类的泛型形式。那应该是System.Collections.Generic.Queue<DataHoldingUserToken>

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18014685

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档