Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/273.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#Sockets:接受一个套接字,忽略它的消息,然后发回一个_C#_Sockets - Fatal编程技术网

C#Sockets:接受一个套接字,忽略它的消息,然后发回一个

C#Sockets:接受一个套接字,忽略它的消息,然后发回一个,c#,sockets,C#,Sockets,我们有一个C#服务器,它使用套接字接收TCP消息。正常的流程是调用socket.Accept(),使用socket.BeginReceive()和socket.EndReceive()接收消息,然后使用socket.Send()发送响应。这个很好用 然而,当一次有太多的请求进来时,我们希望立即拒绝溢出,这样就不会使服务器崩溃。在Accept()之后直接关闭套接字非常容易;但这不允许我们向客户发送有意义的“太忙”消息 我想做的只是调用Accept(),然后调用Send(),而不接收传入消息。我已经

我们有一个C#服务器,它使用套接字接收TCP消息。正常的流程是调用socket.Accept(),使用socket.BeginReceive()和socket.EndReceive()接收消息,然后使用socket.Send()发送响应。这个很好用

然而,当一次有太多的请求进来时,我们希望立即拒绝溢出,这样就不会使服务器崩溃。在Accept()之后直接关闭套接字非常容易;但这不允许我们向客户发送有意义的“太忙”消息

我想做的只是调用Accept(),然后调用Send(),而不接收传入消息。我已经尝试过了,服务器声称要发送我的数据,但我的客户端只收到一个空响应。我已经尝试使用同步发送()和异步BeginSend()/EndSend(),但都没有将消息返回到客户端

是否可以在不首先接收传入消息的情况下在接受的套接字上发送消息?如果是这样的话,我有没有遗漏一点来让它发挥作用

下面是一段代码片段,显示了我正在尝试执行的操作:

        while (!_Done)
        {
            Socket socket = null;
            try
            {
                socket = _ListeningSocket.Accept();
            }
            catch (Exception) { }

            if (socket != null)
            {
                if (TooBusy())
                {
                    // My new code
                    byte[] send = GetTooBusyResponse();
                    int ret = socket.Send(send);
                    Console.WriteLine("socket.Send() returned " + ret);
                    socket.Close();
                    socket = null;
                }
                else
                {
                    // Existing, working code (using custom objects)
                    ClientConnection connection = new ClientConnection(this, socket, !_RequireAuthentication);
                    lock (_ConnectionsToken)
                        _Connections.Add(connection);
                    connection.BeginReceive();
                }
            }
        }
根据,

Close方法关闭远程主机连接并释放所有 与套接字关联的托管和非托管资源。在上面 关闭时,已连接属性设置为false

对于面向连接的协议,建议您调用 在调用Close方法之前关闭。这确保了所有数据 在关闭之前,在连接的插座上发送和接收

如果需要在不首先调用Shutdown的情况下调用Close,可以 确保排队等待传出传输的数据将由 将DontLinger套接字选项设置为false并指定 非零超时间隔。Close随后将阻塞,直到该数据被删除 发送或直到指定的超时过期。如果您将DontLinger设置为 false并指定零超时间隔,Close将释放 连接并自动丢弃传出的排队数据


因此,要么先调用
Shutdown
,要么将
DontLinger
选项设置为false并设置非零超时。

您一直在谈论“消息”,但您使用的是TCP套接字。在套接字级别,TCP只是一个字节流。因此,如果您想要消息,就必须实现该概念。换句话说,不能保证一侧的
Send
调用会与另一侧的
Receive
调用1-1匹配。现在,对于您的实际问题—您正在调用:“对于面向连接的协议,建议您在调用Close方法之前调用Shutdown。这确保所有数据都已发送…”谢谢—这很有帮助。