我做的是类似QQ的聊天代码,我的服务器端数据库保存的用户信息中包括SOCKET(数据库中的定义是INT),该SOCKET的存入时机不是在accept时,是用的WPARAM参数(不解释了,大虾一定知道的),但与客户端联系时,从数据库中取出该socket,用其向客户端发消息时,客户端却怎么也收不到消息,怎么回事呢?
还有在connect后调用send服务器端收不到消息,必须在connect和send之间使用Sleep(100),不知为什么?
模型是WSAAsyncSelect模型。

解决方案 »

  1.   

    下断点 看你取出来send的时候 那个socket的值是否和存入时一样?
      

  2.   

    1.实在不明白为什么Socket也存入数据库。有特殊功能还是嫌网络的效率很高了?
    2.“connect和send之间使用Sleep(100)”如果我的理解没错的话,你的意思是你connect之后靠sleep来等网络建立成功?你挂公网上试试看你还能不能成功。WSAAsyncSelect模型看名字就是异步的,你没收到FD_CONNECT的时候,根本谈不上发送,并且看来你也没有检查Send的返回值,不是你说Send多少它就能马上发出并且发出多少的,异步的你要检测Send返回值是不是EWOULDBLOCK等等情况进行相应的操作,详见MSDN
      

  3.   

    还使用数据库???那不是浪费,毕竟你的程序结束后,socket就是没有用的数据了.....................socket值的生存期不会比程序的生存期长(进程关闭会导致所有的socket被关闭和删除),不需要数据库..................用列表就行了.1.你的socket很可能过期了.需要重新connect
    2.你的socket是异步的吧,这样connect后需要等连接成立,在没有建立前发送当然就收不到了.
      

  4.   

    你的网络编程也太麻烦了吧!connect后send服务器收不到数据是因为connect还没来得及建立就发送数据;
    accept返回一个socket直接加入一个objectList中就可以了。
      

  5.   

    socket编程,一个重要的就是要检查返回值!
      

  6.   


    3L的建议非常好,同时我认为你要检查connect send的返回值,可能是connect or send 就没有成功,这样肯定收不到数据,debug调试一下吧
      

  7.   

    1.发送前判断一下这个socket是否有效
    2.你是不是非阻塞模式,马上返回,还没有连接成功
      

  8.   

    每一次send或sendto返回SOCKET_ERROR都要等待FD_WRITE事件的到来吗? 
      

  9.   

    socket放到内存里保存吧,用链表。其它问题,要看代码,用VC调度下。
      

  10.   

    由于你采用 的异步选择模式,connect的连接速度没那么快,所以你send的话 就没那么容易成功,之前我也采用这种模式在局域网建立了客户端与服务端的连接,你只要把connect连接 和send分开就ok了,  其中还有会遇到一个问题,连接的时候会返回值是-1的 connect!!这个怎么处理 ,应该知道了你。
      

  11.   

    在connect后调用send服务器端下断点调试
    看socket的值是否有效
      

  12.   

    非常感谢各位大侠,但疑问又来了..每一次send或sendto返回SOCKET_ERROR都要等待FD_WRITE事件的到来吗?