gpt4 book ai didi

c# - 监听 socket

转载 作者:行者123 更新时间:2023-11-30 18:09:01 27 4
gpt4 key购买 nike

我遇到了一个奇怪的问题,我以前从未真正体验过这个,这是服务器的代码(在这种情况下客户端是 firefox),我创建它的方式:

_Socket = new Socket( AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp );
_Socket.Bind( new IPEndPoint( Settings.IP, Settings.Port ) );
_Socket.Listen( 1000 );
_Socket.Blocking = false;

我接受连接的方式:

while( _IsWorking )
{
if( listener.Socket.Poll( -1, SelectMode.SelectRead ) )
{
Socket clientSocket = listener.Socket.Accept();
clientSocket.Blocking = false;
clientSocket.SetSocketOption( SocketOptionLevel.Tcp, SocketOptionName.NoDelay, true );
}
}

所以我希望它卡在 listener.Socket.Poll 上直到新连接到来,但在第一个连接到来后它永远卡在 poll 上。我试图以更小的延迟不断地轮询它,比方说 10 微秒,然后它永远不会进入 SelectMode.SelectRead。我想这可能与客户端的套接字重用有某种关系?也许我没有正确关闭客户端套接字并且客户端(firefox)决定使用旧套接字?

我以这种方式断开客户端套接字:

Context.Socket.Shutdown( SocketShutdown.Both ); // context is just a wrapper around socket
Context.Socket.Close();

什么可能导致该问题?

最佳答案

您是否考虑过异步接受远程客户端?我 answered a similar question最近在 TCPListener 上使用,但相同的模式可用于 Socket 类。

我以前从未见过用它来检查客户端是否可以连接:

listener.Socket.Poll( -1, SelectMode.SelectRead ) )

我使用 .NET 反射器查看了 Sockets.TCPListener.Pending() 方法,他们有这个,也许你可以试试:

public bool Pending()
{
if (!this.m_Active)
{
throw new InvalidOperationException(SR.GetString("net_stopped"));
}
return this.m_ServerSocket.Poll(0, SelectMode.SelectRead);
}

请记住,根据 MSDN TCPListener.Pending()方法是非阻塞的,所以不确定它是否对您有 100% 的帮助?

关于c# - 监听 socket ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2771315/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com