C#Sockets:接受一个套接字,忽略它的消息,然后发回一个
我们有一个C#服务器,它使用套接字接收TCP消息。正常的流程是调用socket.Accept(),使用socket.BeginReceive()和socket.EndReceive()接收消息,然后使用socket.Send()发送响应。这个很好用 然而,当一次有太多的请求进来时,我们希望立即拒绝溢出,这样就不会使服务器崩溃。在Accept()之后直接关闭套接字非常容易;但这不允许我们向客户发送有意义的“太忙”消息 我想做的只是调用Accept(),然后调用Send(),而不接收传入消息。我已经尝试过了,服务器声称要发送我的数据,但我的客户端只收到一个空响应。我已经尝试使用同步发送()和异步BeginSend()/EndSend(),但都没有将消息返回到客户端 是否可以在不首先接收传入消息的情况下在接受的套接字上发送消息?如果是这样的话,我有没有遗漏一点来让它发挥作用 下面是一段代码片段,显示了我正在尝试执行的操作:C#Sockets:接受一个套接字,忽略它的消息,然后发回一个,c#,sockets,C#,Sockets,我们有一个C#服务器,它使用套接字接收TCP消息。正常的流程是调用socket.Accept(),使用socket.BeginReceive()和socket.EndReceive()接收消息,然后使用socket.Send()发送响应。这个很好用 然而,当一次有太多的请求进来时,我们希望立即拒绝溢出,这样就不会使服务器崩溃。在Accept()之后直接关闭套接字非常容易;但这不允许我们向客户发送有意义的“太忙”消息 我想做的只是调用Accept(),然后调用Send(),而不接收传入消息。我已经
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。这确保所有数据都已发送…”谢谢—这很有帮助。