本帖最后由 gam2046 于 2009-12-20 09:13:28 编辑

解决方案 »

  1.   

    针对你的的第一问题本人有如下理解:你的客户端请求连接代码和发送数据代码为顺序结构,单执行完成连接请求代码以后立即执行发送代码 由于客户端发送连接请求到服务器端接受连接请求时间叫长,也就是说客户端在执行发送数据时候,客户端和服务器端连接还没有建立成功。改进意见思路:将客户端请求连接和发送数据代码分开写或者延时执行。确定客户端的winsock状态属性=7的时候才进行数据发送。
    针对你的第二个问题可以在服务器端建立winsock控件数组。不同的客户端对不同的winsock进行独立连接和数据传输。
    至于你的第三个问题我理解为你为了防止重复发送连接请求,如果你第二个问题解决了第三个问题就很好解决。你在客户端请求连接的前面加上winsock的状态属性作为条件。如果winsock.satae<>7 则执行连接请求
    第四个问题不了解不好意思。
      

  2.   

    To gz284596265
    首先很感谢你的答复关于第一点,我觉得你的想法应该是正确的,ActiveX控件的线程与VB本身并不同步,也许是执行好连接动作之后,VB则开始发送数据,此时连接并未建立成功。所以我在connect之后加入了sleep,可我发现结果是一样的(我最长测试的休眠20秒,还是这个结果),既然ActiveX控件不与VB同步执行,那么VB程序休眠长达20连接依旧失败,这是什么原因?(还是我理解上有错误?)
    第二点:我查找过一些资料,大致含义是建立一个index=0的winsock数组控件作为种子,当有连接请求到winsock(index=0)时,通过load得到一个winsock(n)的数组控件再与请求的连接沟通,当有下一个请求时,相同的方法load一个winsock(n)(n=n+1),如果上面的我没理解错的话,我也有些问题:
    1.当客户1(client1)连接到server(服务端)的winsock(0),winsock(0)收到请求,并且load一个winsock(1),那么此时client1请求的信息假如为:RemoteHost = "127.0.0.1",RemotePort = 2046
    那么载入的winsock(1)应该怎么设置属性?(若同样使用LocalPort = 2046,会冲突)并且client1的请求已经被server端的winsock(0)收到,又怎么让client1连接到我载入的winsock(1)上呢?
      

  3.   

    至于你第一点失败的原因我只是猜测,不能给你明确的而正确的解释。但是这里我可以建议你使用一个计时器来获取你客户端winsock的状态。你先检查你执行连接请求以后看看winsock状态是否已经表示连接成功。如果你确认状态返回是值是7在看看发送语句能否执行。
    至于第二个问题我想知道你的客户端数量是不是有限的。或者你可以自己先做个实验。比如自己假设客户端就只有10个 ,你就采用最笨的办法 直接在服务器端放一个winsock1的控件数组 然后为他们设置不同的端口号。记住一定要不同的端口号。然后客户端再根据端口号进行不同的连接请求,这样肯定不会冲突。这时你就会发现每个客户端连接的winsokc(i)都是独立的 他们之间没有联系。连接和断开都是独立的,这样做是很好操作的,但是有个缺点就是必须是客户端是有限的。
      

  4.   

    To gz284596265
    关于第一点我首先尝试了如下代码:Winsock1.connect
    do until winsock1.State=7
        sleep(1000)'之前已经API声明
    loop结果是一直程序在等待,后来尝试使用timer则成功,具体原因我不明。关于第二点....
    这个方法显然是不行,我不能预知会有多少连接请求,并且按照这种方法,显然对于资源是比较浪费的。而且要使用这个方法不仅需要能够预见客户数量,还需要客户数量比较少。例如已知会有200个客户机,那么这种方法也是不现实去操作的。(一旦需要修改的话,那么工程量也是巨大的)
      

  5.   


    显然第一点你没有懂我的意思
    我的意思你用timer去监控客户端winsock的状态, 你看看你执行连接请求以后看看winsock是否连接成功  而不是连接成功以后再去延时 ,timer主要功能是给出winsokc的状态,让你知道他是否连接成功
    如果连接成功以后再执行数据发送代码肯定是不会错的。
    第二点你按照你的方法也可以 因为我以前做的都是局域网里面的 能预知用户数量的的 按照你的方法是否需要将服务器端的端口设置成一致我没有研究过。但是我敢肯定的的是设置成不同的端口肯定可以。设置成同一个端口行不行我就没有深究。
      

  6.   

    第一个我已经OK了,实现方法和你的一样,timer里面大致代码如下if winsock.state=7 then
    timer.enable=false
    '传输数据
    elseif winsock.state=6 then
    exit sub
    else
    '连接服务端
    end if第二个么....我百度了很久,也找到一些例子,不过水平有限,实在看不懂..
      

  7.   


    这是因为这个代码把CPU都耗在了循环上,没有时间处理Window消息,而VB的Winsock是基于Window消息通知的,所以,要把处理权交给Window的消息机制,简单来说就是加上DoEvents.
    Winsock1.connect
    do until winsock1.State=7
        DoEvents
    loop