是这样的,我以前用了WSAAsyncSelect写过一个服务器/客户机,发送和接收都是用Send /Recv,最近在学完成端口,服务器写完了,想调试一下(主要是懒得写客户端),所以用回之前的客户端做测试,但是却收不到数据。我完成端口的服务器是用WSASend 发送的,Winsock的全部内容我都是收集大量乱七八糟的资料而来,所以有些概念很模糊的。
检查过应该没什么问题,不知道有没这个可能?那就是用WSASend 发送的要用WSARecv接收?
多谢帮忙!!!
检查过应该没什么问题,不知道有没这个可能?那就是用WSASend 发送的要用WSARecv接收?
多谢帮忙!!!
对呀,最后发现,原来发送出错,但不知原因。
主要表现:编译无错,运行也无错,
设置了IError=WSASend(lpContext->m_nSocket,&lpContext->m_wsaOutBuffer,1,&lpContext->m_wsaOutBuffer.len,MSG_PARTIAL,&pOverlap->ol,NULL);
发现IError == SOCKET_ERROR的。晕死!!
其中pOverlap->ol就是WSAOVERLAPPED结构。
其中lpContext->m_wsaOutBuffer是WSABUF结构。
描述一下吧:
我主程序时开了M个线程,让他们都在GetQueuedCompletionStatus那里阻塞着。
然后另开一条Accept线程接收客户连接申请,并让其在accept函数那儿。
然后如果有客户端要求连接,accept接受请求,处理后就用PostQueuedCompletionStatus激活其中一条线程。问题就出在这里,以上都检查过,完成端口/套接字等在这以前都非常正常,直到进入了GetQueuedCompletionStatus的线程后,套接字就丢失了。奇怪!!!