两个界面,C联接S,成功后相互通讯.
当C界面执行Close 方法成功后再次向S取得联接时
出现错误信息,错误代码:40020,错误文字:当前状态的操作无效.请问这是为什么?应该如何做才可以再次取得联接?
谢谢!

解决方案 »

  1.   

    m_sock.Close
            m_sock.Connect IP, Port
      

  2.   

    Option ExplicitPrivate SmsCommFlag As Boolean '到短消息服务器的通讯状态标志,TRUE--通讯正常,FALSE--通讯失败
    Private SmsCenterIP As String, SmsCenterPort As String  '短消息发送服务器IP地址及端口号
    Private SmsString As String
    Dim rs As New ADODB.Recordset
    Dim conn As New ADODB.Connection
    Dim MaxID As IntegerPrivate Sub CmdChange_Click()
        
        Dim SmsFile As Integer
        
        SmsCenter.RemoteHost = SmsCenterIPText.Text
        SmsCenter.RemotePort = SmsCenterPortText.Text
        TestSmsComm.Close
        
        TestSmsComm.RemoteHost = SmsCenterIPText.Text
        TestSmsComm.RemotePort = SmsCenterPortText.Text
        
        SmsFile = FreeFile
        
        Open App.Path + "\SMS.INI" For Output As SmsFile    Print #SmsFile, "SmsCenterIP=" + Trim(Me.SmsCenterIPText.Text)
        Print #SmsFile, "SmsCenterPort=" + Trim(Me.SmsCenterPortText.Text)    Close SmsFile
        
        Label14.ForeColor = vbRed
        Label14.Caption = "失败!"
        
        TestSmsComm.Connect
        
    End SubPrivate Function isNumber(ByVal rText As String)On Error GoTo NotNumber    Dim tmp As Double
        
        tmp = CDbl(rText) / 10000
        isNumber = True
        
        Exit Function
        
    NotNumber:
        isNumber = False
        
    End FunctionPrivate Sub MakeSmsString(ByRef rSmsString As String)'生成发送到短消息服务器的消息串,格式为:'包的总长度             4                   不包括本域,不足4位左补0,有中文字符时每个中文字符长度为2个
    '保留                   5                   FFFFF
    '手机长度               2
    '手机号                 不定长
    '短信的长度             3                   左补0,有中文字符时每个中文字符长度为2
    '短信内容               不定长
    '分配给各个客户ID       3
    '短信的区别ID           12                  YYMMDD+6位流水号,这里以时间为流水号
    '收费标志位             1                   0
    '收费代码的长度         4                   04
    '收费代码               4                   01:对"计费用户号码"免费
    '                                           02:对"计费用户号码"按条计信息费
    '                                           03:对"计费用户号码"按包月收取信息费
    '                                           固定为HYMF    Dim SmsLen As Integer, TotalLen As Integer, SmsID As String, SmsStr As String
        
        SmsLen = LenB(StrConv("ly", vbFromUnicode))
        SmsID = Format(MaxID, "000000000000")
        SmsStr = "FFFFF" + "11" + "8613611111111" + Format(SmsLen, "000") + "ly" + "123" + SmsID + "0" + "04" + "HYMF"
        TotalLen = LenB(StrConv(SmsStr, vbFromUnicode))
        rSmsString = Format(TotalLen, "0000") + SmsStrEnd SubPrivate Sub Form_Load()
        Dim str As String
        str = "select max(lyid) from ly_archives"
        conn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + VB.App.Path + "\zhly.mdb;Persist Security Info=False"
        conn.Open
        
        rs.Open str, conn, adOpenKeyset
        If rs.RecordCount = 0 Then
            MaxID = 0
        Else
            MaxID = rs.Fields(0)
        End If
        rs.Close
        
        If App.PrevInstance Then
            MsgBox App.EXEName & "程序已经运行!", 48 '给出程序已运行的提示和一惊叹号以示警告
            End
        End If    Me.Show
        
        '从SMS.INI中取短消息服务器IP地址及端口号
        GetSmsCenterPara SmsCenterIP, SmsCenterPort
        
        SmsCenter.RemoteHost = SmsCenterIP
        SmsCenter.RemotePort = SmsCenterPort
        TestSmsComm.RemoteHost = SmsCenterIP
        TestSmsComm.RemotePort = SmsCenterPort
        
        Label14.ForeColor = vbRed
        Label14.Caption = "失败!"
        
        SmsCommFlag = False
        
        TestSmsComm.Connect    '循环等待连接短消息发送服务器成功
        Do While Not SmsCommFlag
            DoEvents
        Loop
        
        If SmsCommFlag Then
            Me.Label14.ForeColor = vbGreen
            Me.Label14.Caption = "成功!"
        End IfEnd SubPrivate Sub GetSmsCenterPara(ByRef rSmsCenterIp As String, _
                                 ByRef rSmsCenterPort As String)
                                 
    '从SMS.INI中取短消息服务器IP及端口号,如文件不存在,返回空    Dim Fso, SmsFile As Integer, tmpStr As String, pos As Integer
        
        rSmsCenterIp = "": rSmsCenterPort = ""
        
        Set Fso = CreateObject("Scripting.FileSystemObject")
        If Fso.FileExists(App.Path + "\SMS.INI") Then
            SmsFile = FreeFile
            
            Open App.Path + "\SMS.INI" For Input As SmsFile
            
            Do While Not EOF(SmsFile)
                Line Input #SmsFile, tmpStr
                
                If InStr(UCase(tmpStr), "SMSCENTERIP=") Then
                    pos = InStr(UCase(tmpStr), "=")
                    rSmsCenterIp = Mid(tmpStr, pos + 1)
                End If
                
                If InStr(UCase(tmpStr), "SMSCENTERPORT=") Then
                    pos = InStr(UCase(tmpStr), "=")
                    rSmsCenterPort = Mid(tmpStr, pos + 1)
                End If
               
                DoEvents
            Loop
        
            Close SmsFile
        End If
        
        Set Fso = Nothing
        
        SmsCenterIPText.Text = rSmsCenterIp
        SmsCenterPortText.Text = rSmsCenterPort
        
    End SubPrivate Sub PhoneNo_GotFocus()
        Label4.Caption = ""
    End SubPrivate Sub SmsCenter_Connect()
    '连接短消息发送服务器成功后发送数据    SmsCenter.SendData SmsString
    '   SendContent.Text = SmsString
    End SubPrivate Sub SmsCenter_DataArrival(ByVal bytesTotal As Long)
        Dim str As String
        Dim sql As String
        Dim msg() As String
        SmsCenter.GetData str
        'SendResult.Text = PhoneNo.Text + str
        If str = "***" Then
            SmsCenter.Close
        Else
            msg = Split(str, "#*#")
            sql = "select * from ly_archives"
            rs.Open sql, conn, 3, 2
            rs.AddNew
            rs("LyID") = msg(0)
            rs("Content") = msg(2)
            rs("holdset") = msg(1)
            rs("b_time") = msg(3)
            rs("Status") = 0
            rs.Update
            rs.Close
            MaxID = msg(0)
        End If
    End SubPrivate Sub SmsCenter_Error(ByVal Number As Integer, Description As String, ByVal Scode As Long, ByVal Source As String, ByVal HelpFile As String, ByVal HelpContext As Long, CancelDisplay As Boolean)
    '连接短消息发送服务器失败时禁止弹出式提示信息,启动尝试连接程序    CancelDisplay = True
        SmsCommFlag = False
        
        Err.Clear
        
      '  SendResult.Text = PhoneNo.Text + "  发送失败!"
        TestSmsTimer.Enabled = TrueEnd SubPrivate Sub TestSmsComm_Connect()
        
    '成功连接到短消息发送服务器    SmsCommFlag = True
        TestSmsComm.Close
    '   TestSmsTimer.Enabled = False
        
        Me.Label14.ForeColor = vbGreen
        Me.Label14.Caption = "成功!"
    '   TestSmsComm.SendData SmsString
    End SubPrivate Sub TestSmsComm_Error(ByVal Number As Integer, Description As String, ByVal Scode As Long, ByVal Source As String, ByVal HelpFile As String, ByVal HelpContext As Long, CancelDisplay As Boolean)'在连接短消息服务器时出现错误    CancelDisplay = True
        TestSmsComm.Close
        SmsCommFlag = False
        TestSmsTimer.Enabled = True
        
    End SubPrivate Sub TestSmsTimer_Timer()
    '当到短消息服务器的连接中断时,尝试重新连接
        
        If TestSmsComm.RemoteHost <> "" And TestSmsComm.RemotePort > 0 Then
            TestSmsComm.Close
            
            Me.Label14.ForeColor = vbRed
            Me.Label14.Caption = "失败!尝试连接中..."
        
            If Not SmsCommFlag And TestSmsComm.State = sckClosed Then
                TestSmsComm.Connect
            Else
                MakeSmsString SmsString
                SmsCenter.Connect
            End If
        End If
        
    End Sub
    Private Sub Form_Terminate()
        Unload Me
        End
    End SubPrivate Sub Form_Unload(Cancel As Integer)
        Unload Me
        End
    End Sub