Socket Accept() 阻塞,直到我按下一个键
Posted
技术标签:
【中文标题】Socket Accept() 阻塞,直到我按下一个键【英文标题】:Socket Accept() blocking until I press a key 【发布时间】:2017-08-30 22:32:13 【问题描述】:我的程序将在 Accept()
处停止等待阻塞,它会启动一个新线程来处理接受的套接字。
但是,有时客户端成功连接到服务器并发送数据, 我使用数据包嗅探器工具检查服务器是否已收到数据, 但是我的服务器程序会停止,直到我按下 Enter 键;
在我按下回车键后,之前发送的所有数据都会被处理。
但我的程序中没有任何Console.Read()
。
这是我的代码:
static Socket listener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
public static int Main(String[] args)
listener.ReceiveTimeout = 10000;
listener.SendTimeout = 10000;
listener.Bind(localEndPoint);
listener.ReceiveBufferSize = 51200;
listener.SendBufferSize = 1283;
listener.Listen(30);
while(true)
Socket clientSocket = listener.Accept();
Console.WriteLine("Connection Success");
var thread = new Thread(() => StartListening(clientSocket))
IsBackground = true
;
thread.Start();
return 0;
【问题讨论】:
此代码不显示您描述的行为。同时显示StartListening()
方法。
我不想问聪明,但你为什么还要使用Accept
? BeginAccept
会更好。
@CodeCaster 你好,我的程序在卡住的时候甚至没有显示“连接成功”字样,我认为这不是问题点,所以我没有在 StartListening() 中发布代码,我如果您认为确实有必要,可以发布它
@Joshua Bakker 谢谢你的建议,我会试试的。
请贴出您用来处理客户端连接的所有代码,这些代码还不够。
【参考方案1】:
我发现当我点击控制台时,控制台会变成这样的选择模式:
Select mode
所有功能都会停止,所以我关闭了推荐窗口设置中的“快速编辑模式”,问题似乎解决了。
setting page
【讨论】:
以上是关于Socket Accept() 阻塞,直到我按下一个键的主要内容,如果未能解决你的问题,请参考以下文章
网络I/O模型--03非阻塞模式(ServerSocket与Socket的超时处理)--解除accept() read()方法阻塞
socket执行accept函数时没有进入阻塞状态,而是陷入了无限循环