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() 方法。 我不想问聪明,但你为什么还要使用AcceptBeginAccept 会更好。 @CodeCaster 你好,我的程序在卡住的时候甚至没有显示“连接成功”字样,我认为这不是问题点,所以我没有在 StartListening() 中发布代码,我如果您认为确实有必要,可以发布它 @Joshua Bakker 谢谢你的建议,我会试试的。 请贴出您用来处理客户端连接的所有代码,这些代码还不够。 【参考方案1】:

我发现当我点击控制台时,控制台会变成这样的选择模式:

Select mode

所有功能都会停止,所以我关闭了推荐窗口设置中的“快速编辑模式”,问题似乎解决了。

setting page

【讨论】:

以上是关于Socket Accept() 阻塞,直到我按下一个键的主要内容,如果未能解决你的问题,请参考以下文章

什么是socket网络编程

网络I/O模型--03非阻塞模式(ServerSocket与Socket的超时处理)--解除accept() read()方法阻塞

socket执行accept函数时没有进入阻塞状态,而是陷入了无限循环

Endles循环(while循环)运行,直到我按下一个键。编程C

java socket知识点

网络I/O模型--04非阻塞模式(解除accept() read()方法阻塞)的基础上加入多线程技术