我写了一个C/S 结构的 程序 ,程序同时 是一个独立的服务器和客户端 ,在ListenSock 中为其注册 FD_ACCEPT 和 FD_CLOSE ,并且WSAAyncselect 调用成功 (返回值非 SOCKET_ERROR)
然后在MM_SOCKET (注册消息) 中 处理 FD_ACCEPT (有错误处理语句)
如果有事件到达,就弹出对话框询问是否接受连接.
如果允许就调用 Accept 接受连接
然后 在同一个电脑上运行两个实例,一个监视1023,一个监视 1024 端口,在其中一个,连接本地另一个实例,
没想到的事另一个实例没有弹出对话框这个程序就报告连接成功 .
而且netstat -ano 也显示出双向的连接 !! 太难以置信了.
Active Connections
Proto Local Address Foreign Address State PID
TCP 0.0.0.0:1023 0.0.0.0:0 LISTENING 1492
TCP 0.0.0.0:1024 0.0.0.0:0 LISTENING 3208
TCP 127.0.0.1:1023 127.0.0.1:3211 ESTABLISHED 1492
TCP 127.0.0.1:3211 127.0.0.1:1023 ESTABLISHED 3208
没有弹出对话框就意味着没有调用Accept 函数 ,怎么可能连接成功!!
( 两个 套接字 都是 SOCK_STREAM , 不是UDP !!)
另外我用两台机子测试时,也是同样的问题,在A上连接B,A提示连接成功 ,并启动两个线程。
而B无任何提示,并且也不启动线程 (我在程序中设置,每当接受一个连接时和连接远程电脑成功时,都启动两个线程)
但用netstat -ano 同样显示出双向的连接!! (两台机子上都是)
暂不说异步时, 所有尝试的连接一般都会返回SOCKET_ERROR (WSAGetLastError 返回WSAEWOULDBLOCK), 就服务器不调用accept 这一点连接也不可能建立呀!