我有两个简单的TCPConnection和TCPListener包装类。使用这些类的应用程序在Windows 10上运行,执行以下操作:
线程1 调用getaddrinfo、socket、bind、listen、accept并阻塞等待连接 当连接建立时,客户端套接字传递给第二个线程进行发送 开始阻塞recv()循环
线程2 等待排队发送数据 当队列中有可用数据时,调用send()
当使用socket()调用创建服务器套接字时,这完全正常。但是,当我切换到WSASocket()调用(非重叠)时,如果存在一个挂起的recv()或WSARecv()调用,则send调用(无论是send()还是WSASend())都会阻塞。
我不知道可能导致这种情况。我一直认为从不同线程的同一套接字上发送和接收是可以的。
在posix与WSA变体之间的实现是否有差异?有什么想法可以解释这种行为吗?
调用差异如下:
线程1 调用getaddrinfo、socket、bind、listen、accept并阻塞等待连接 当连接建立时,客户端套接字传递给第二个线程进行发送 开始阻塞recv()循环
线程2 等待排队发送数据 当队列中有可用数据时,调用send()
当使用socket()调用创建服务器套接字时,这完全正常。但是,当我切换到WSASocket()调用(非重叠)时,如果存在一个挂起的recv()或WSARecv()调用,则send调用(无论是send()还是WSASend())都会阻塞。
我不知道可能导致这种情况。我一直认为从不同线程的同一套接字上发送和接收是可以的。
在posix与WSA变体之间的实现是否有差异?有什么想法可以解释这种行为吗?
调用差异如下:
sock = socket(AF_INET, SOCK_STREAM, IPOROTO_TCP);
sock = WSASocketW(AF_INET, SOCK_STREAM, IPOROTO_TCP, nullptr, 0, 0);
连接的客户端来自Python 3.8.5。