一堆问题,先回答一个,建议用Overlapp方式

解决方案 »

  1.   

    如何在线程里使用socket:
        先开线程,然后线程函数里面根据自己的需要设置状态字来控制线程的结束。
        (WaitForSingleObject)服务端接到请求后开线程:
        既然先接到请求,那怎么能在线程里面Accept呢?:)除非你能预见到你开个线程就能接收到请求。建议先利用VBWinsock控件做个简单的chat,会有助于你加深Socket编程的理解。
      

  2.   

    vcbear(一只平凡无知@贫穷无钱¥的熊说的 对111没必要用多线程,用重叠端口就可以了!!!
    具体可以参考 机工社出版的  WINDOWS网络编程!!!原来是为软的!!!                  vcbear
    是CSDN上的元老,但是他关于完成端口的那篇文章是抄那本书上的,作为程序员,我为他脸红111
      

  3.   

    3215599() 
    注意,Overlapped方式并不等于重叠端口.
    我的关于完成端口的文章是MSDN里的,我只是翻译,并且有翻译说明。希望你说话注意一点。
    不要挑起争端。
      

  4.   

    如果你使用OnReceive,表示你是使用了winsock的消息模式,我想确实不用多线程了。建议使用
    CAsyncSocket类,不要直接用CSocket.
      

  5.   

    thatwind:
        如果我要对每一个连接请求,都开一个接收线程
    的话,应该怎么处理?麻烦你给出伪代码;
    bear:
        一个Socket可以在多个线程里使用吗?看来我必须用多线程
    方式,否则Waitfor...Object的话会导致UI暂时无法工作的。
      

  6.   

       如果你是采用window Msg的方式,那么,你不需要读等待。这个工作是由系统完成的。
    你只需要响应消息,进行Accept或read.你对消息应该了解吧,对UI是不会产生停止响应的。   需要等的是send操作,如果你的数据包比较大而且系统繁忙的话,同步的send操作不一定能
    立刻返回,那么UI可能暂时不响应。我想,至少我的做法是:recv之后,如果需要发送,则
    开一个线程执行send并等待操作完成。等待的方式可以是同步send,函数不成功不返回。要么是
    Overlapped的方式,send调用立刻返回,用waitfor...等待完成。一般来说,用同步的
    就可以了除非你的程序有什么别的考虑。
       
       socket跟线程本身没有什么联系,可以在多个线程里使用。不过要注意同步和互斥问题。3215599() :不明白先看书,不要出言不逊.谢谢。
      

  7.   

    谢谢bear,明白了,读等待应该不必了。
    不过可以给出一段接收后send的伪代码吗?
    具体就是线程里的同步/重叠send怎么设置,send后如何监视超时。
    就这样,也许这是我要的最后一个回答了。
      

  8.   

    同步send,用setsockopt设置SO_SNDTIMEO,如果send返回的值不对(比如跟你要发的数据量有差别),用WSAGetLastError,如果得到WSAETIMEDOUT,则是表示TimeOut异步Overlapped方式,定义一个Overlapped结构,waitforsingleobject(...TimeOut)或在一端时间里不停的 getOverlappedresult还有一种方式,把socket io定义成异步的,用ioctlsocket函数设置FIONBIO 命令为1,则是非堵塞读写。不过我不常用。不熟悉:P
      

  9.   

    bear,你做这一行多久了?
    我想大致的架构出来了(指发端):发送用异步Overlapped方式,
    用WSAWaitforXXXObject等待,结果是“接到”或“超时”;
    接收的话直接用消息模式OnReceive,接到收端的确认信息后
    将事件置为有信号状态。看来事件应该是一个全局变量或对话框类的
    public变量才合适。
    好了,我试试吧,似乎可以了。