当客户端第二次连接时没有服务器OnAccept通知
No server OnAccept notification when doing client Connect a second time
我写了一个MFC c++应用程序,其中我的客户端进程向我的服务器进程执行TCP MyCAsyncSocket::Connect
。服务器进程用MyCAsyncSocket::OnAccept
响应,然后Detach
按照规定读取套接字,创建一个线程,Attach
读取套接字,然后读取正在发送的数据。MSDN规定m_hSocket在Detach
之后被设置为NULL。
它工作得很好,但只有一次。当客户端第二次尝试将Connect
发送到相同的套接字地址时,没有出现OnAccept
通知。以下是服务器代码:
void MyCAsyncSocket::OnAccept( int nErrorCode )
{
BOOL socketResult = FALSE;
CAsyncSocket syncSocket;
Accept( syncSocket );
AsyncSelect( FD_READ | FD_CLOSE );
SOCKET socket = syncSocket.Detach();
m_hSocket = NULL; // prescribed by msdn
... // go attach the socket in a worker thread, read the socket and do work
// try to re-establish listener.
...Create( // error: attempt 2: ASSERT(m_hSocket == INVALID_SOCKET)
endPoint.portNumber, // ok: same as client port number
SOCK_STREAM,
FD_READ | FD_WRITE | FD_ACCEPT | FD_CONNECT | FD_CLOSE,
endPoint.ipAddress // ok: same as client ip address
);
...Listen(); // error: attempt 1: no error case, but still doesn't work
CAsyncSocket::OnAccept( nErrorCode );
}
尝试1:在Detach
之后的OnAccept
中,我尝试使用Listen
,但我得到这个侦听错误:"WSAENOTSOCK:描述符不是套接字"。不知道这是什么意思
尝试2:然后我尝试在后续的Listen
之前执行Create
,但这会导致断言:ASSERT(m_hSocket == INVALID_SOCKET);
,定义为:
/*
* This is used instead of -1, since the
* SOCKET type is unsigned.
*/
#define INVALID_SOCKET (SOCKET)(~0)
在原型代码中,我只是销毁侦听器套接字并从头开始重新创建它,但对于生产代码,这是不可接受的,因为Detach
ing和re Attach
ing的整个思想是确保套接字线程的侦听能力永远不会中断超过微秒。
有人知道正确的语义应该是为后续Connect
离子准备套接字吗?
如果我的阅读是正确的,你调用AsyncSelect(FD_READ|FD_CLOSE)在监听套接字-我认为你实际上想要调用新接受的套接字(syncSocket)。
我希望调用AsyncSelect(FD_READ|FD_CLOSE)可以清除侦听套接字上的FD_ACCEPT通知-从而确保当将来连接到侦听套接字时不调用OnAccept。
进一步-当你在上面设置m_hSocket = NULL时,你将取消侦听套接字的句柄,而不是新接受的套接字(syncSocket)的句柄。
此外,如果我正确地阅读MSDN (https://msdn.microsoft.com/en-us/library/05sz8hz8.aspx), Detach()方法本身将相关句柄清空,并且您不需要自己这样做。[我希望你也不能-因为m_hSocket应该是syncSocket的私有成员]
我希望你的OnAccept代码看起来更像:void MyCAsyncSocket::OnAccept( int nErrorCode )
{
BOOL socketResult = FALSE;
CAsyncSocket syncSocket;
Accept( syncSocket );
SOCKET socket = syncSocket.Detach();
... // go attach the socket in a worker thread, which reads the socket and does work
}
- "unknown ca"自生成的 CA、证书和客户端/服务器
- 当我编译webrtc服务器时,Windows上只支持clang-cl
- 如何通过套接字将文本文件的内容从服务器发送到客户端
- 有没有办法知道Tracer是否成功地完全连接到了jaegerclientcpp中的jaeger后端服务器
- 从服务器传输到客户端的消息不会出现
- QTcpSocket在不阻塞GUI的情况下重新连接到服务器
- OpenSSL TLS服务器-使用客户端证书白名单
- 我正在开发服务器,ip作为参数传递不起作用
- 我可以与 python 服务器而不是 c++ 客户端建立 tcp/ip 套接字吗?
- 提升 Asio TCP 服务器 处理多个客户端
- 如何在 Minecraft 服务器上执行命令
- 调试编译的服务器在数据库打开时崩溃
- C++套接字客户端到 Python 服务器未创建连接
- 用于解析 win64 堆栈跟踪的命令行客户端(可以访问符号服务器)
- 将相机数据从服务器实时流式传输到客户端
- 为什么创建服务器后C++ httplib 库阻塞了我的主线程?
- 每个服务器请求的内存预算
- 如何将 Firebase 与基于 Linux 的客户端应用配合使用,以便与服务器进行双向消息通信
- 使用嵌入式猫鼬服务器托管应用程序
- 当客户端第二次连接时没有服务器OnAccept通知