偶在尝试做一个LAN内的类似QQ的东东,第一次在两台机器上试运行时,出现如下错误:
RUNTIME ERROR 40020    INVALID OPERATION AT CURRENT STATE
请指教:大概,也许,兴许,MAYBE什么情况下会如此,谢

解决方案 »

  1.   

    RUNTIME ERROR 40020
    INVALID OPERATION AT CURRENT STATEsckInvalidOp  40020  在目前状态下,操作失败检查你的代码一般是这样引起的,客户端已经使用winsock控件与服务端连接后,winsock控件都处于"使用中"的状态,如果你再次进行连接,会再次设置使用的协议,ip地址以及端口,接着再调用winsock控件的CONNECT方法与服务端进行连接。
    但是,在已经连接的情况下,并且winsock控件并非是以数组的方法加载,在一个已经连接的winsock控件上,重新设置使用的协议,当然是“不被允许的操作”连接后,比如是按钮,将他的enabled属性设为false,避免这种情况
      

  2.   

    如果正如online所说
    winsock控件并非是以数组的方法加载,在一个已经连接的winsock控件上,重新设置使用的协议,当然是“不被允许的操作”
    ------------------------------------------
    那么,我可以提供一段代码供楼主参考,关于服务器段用winsock以数组的方法加载。这样的话,无论怎么重新连接,都没有关系。创建Socket多客户服务器
     
    1.设定端口号、开始侦听 2.接收客户连接请求 
    3.接收、发送数据 4.响应客户关闭、主动关闭连接 
     
    设定端口号、开始侦听
     
    我们可以使用控件数组创建多客户服务器,达到多个客户同时连接到服务器。
    向窗体增加一个WinSock控件,修改其Name属性为SockServer,修改Index属性为0。
    在窗体的Load事件中增加如下代码:
    SockServer(0).LocalPort=2000
    SockServer(0).Listen
    数组控件0始终处于侦听状态。 
    接收客户连接请求
     
    在ConnectionRequest事件中首先加载一个Socket控件,再用它来接收连接。
    Dim SockNum As Integer
    SockNum=0
    Sub SockServer_ConnectionRequest(...)
    SockNum=SockNum+1
    Load SockServer(SockNum)
    SockServer(SockNum).Accept requestID
    End Sub 
    接收客户发送的数据 和 向客户发送的数据
     
    接收客户发送的数据
    在DataArrival事件中将多一个Index参数,用于表示哪一个控件接收到了数据。
    Sub SockServer_DataArrival(Index As Integer,ByVal bytesTotal As Long)
    Dim s As String
    SockServer(Index).GetData s
    End Sub 
    向客户发送的数据
    哪一个控件需要发送,只需加上数组下标。
    SockServer(n).SendData Text1.Text 
    响应客户关闭 和 主动关闭连接
     
    响应客户关闭
    同样在Close事件中也会增加Index参数表示哪一个连接关闭。
    Sub SockServer_Close(Index As Integer)
    SockServer(Index).Close
    End Sub 
    主动关闭连接
    哪一个连接需要主动关闭,只需增加数组下标。
    SockServer(n).Close