是这样的,我以前用了WSAAsyncSelect写过一个服务器/客户机,发送和接收都是用Send /Recv,最近在学完成端口,服务器写完了,想调试一下(主要是懒得写客户端),所以用回之前的客户端做测试,但是却收不到数据。我完成端口的服务器是用WSASend 发送的,Winsock的全部内容我都是收集大量乱七八糟的资料而来,所以有些概念很模糊的。
检查过应该没什么问题,不知道有没这个可能?那就是用WSASend 发送的要用WSARecv接收?
多谢帮忙!!!

解决方案 »

  1.   

    先多谢 nuaawenlin(飘人)
    对呀,最后发现,原来发送出错,但不知原因。
    主要表现:编译无错,运行也无错,
    设置了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结构。
      

  2.   

    自己顶,最后发现,无论怎样都会报10038错误。查了一下,听说对OVERLAPPED结构清零可以,但实际试过还是不行。有没高手指教指教?先多谢了。
      

  3.   

    再顶一下,希望有人帮忙。昨晚到现在翻来覆去检查每一步,最后发现我在接收线程中用PostQueuedCompletionStatus通知线程池,并激活一个线程的时候,完成键中的socket竟然丢失了。
    描述一下吧:
    我主程序时开了M个线程,让他们都在GetQueuedCompletionStatus那里阻塞着。
    然后另开一条Accept线程接收客户连接申请,并让其在accept函数那儿。
    然后如果有客户端要求连接,accept接受请求,处理后就用PostQueuedCompletionStatus激活其中一条线程。问题就出在这里,以上都检查过,完成端口/套接字等在这以前都非常正常,直到进入了GetQueuedCompletionStatus的线程后,套接字就丢失了。奇怪!!!