sockets - Winsock 阻塞套接字,多线程死锁

标签 sockets tcp network-programming winsock

我使用这个复制器找到了我的一些代码中的死锁:

if( isClient )
{
    Sender sender;
    Receiver receiver;
    ConnectionPtr connection = Connection::create( description );
    TEST( connection->connect( ));

    receiver.start();
    Sleep( 100 );
    sender.start();

    sender.join();
}
else
{
    ConnectionPtr connection = Connection::create( description );
    TEST( connection->listen( ));

    Sender sender;
    Receiver receiver;
    ConnectionPtr reader = connection->accept();

    receiver.start();
    Sleep( 100 );
    sender.start();

    receiver.join();
}

我在同一台机器上启动服务器,然后在 127.0.0.1:1234 上启动客户端进程。在::recv 和::send 中都立即死锁。发送方和接收方是在循环中执行发送/接收的独立线程。套接字是阻塞的,BSD 风格的 TCP 套接字。

当我更改操作顺序以在接收者之前启动发送者时,它起作用了。

为什么?

最佳答案

在您的示例中,如果 peer1 未读取数据,则 peer2 将在套接字发送缓冲区已满后阻止发送。

如果您有某种协议(protocol)并且服务器在客户端等待响应时无法读取消息部分,通常会发生死锁。

通常为了调试这类问题,在客户端和服务器端都会引入详细的日志记录。当问题发生时,您可以分析日志并查看问题出在哪里。

关于sockets - Winsock 阻塞套接字,多线程死锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3296920/

相关文章:

android - Smack 4.1 Android 匿名注册到 Openfire

asp.net - 如何在 Windows 上篡改源 IP 地址

network-programming - 如何从 golang 程序中设置 ulimit -n?

Python - 使用密码通过终端连接到网络设备

java - 套接字异常 : Connection reset on server with ObjectInputStream

Java 服务器在 32 位工作,但在 64 位工作。为什么?

Windows 套接字 write() 意外被 read() 阻塞

c - gethostbyname 的第二次调用给出段错误

swift - 一个socket连接占用两个tcp端口正常吗?

c# - 如何在C#中通过wifi路由器接收数据