我在服务端用一个Winsock控件,用TCP协议打开了一个端口监听接收数据,客户端也用Winsock控件、TCP协议连接服务端打开的端口。
如果在VB的调试状态下运行,客户端跟服务端的通讯是正常的。但是如果编译exe文件(编译过程没提示出错)运行之后,客户端则不能连上服务端。
以前我做同样的事情都没有出现过这种情况的,请问这是什么原因呢?谢谢!

解决方案 »

  1.   

    以下是服务端的代码:
    Public Sub InitWinSock() 
        Dim i As Long
        
        Winsock1(0).Protocol = sckTCPProtocol      '使用TCP协议
        Winsock1(0).LocalPort = 1234               '与客户端的连接使用1234端口
        Winsock1(0).Listen                         '开始监听
        
        For i = 1 To 100                           '设定最大连接为100
            Load Winsock1(i)
        Next   
    End SubPrivate Sub Winsock1_ConnectionRequest(Index As Integer, ByVal requestID As Long)
        Dim i As Long
        For i = 1 To 100
            If Winsock1(i).State = sckClosed Then
                Winsock1(i).Accept requestID
                Exit For
            End If
        Next
    End SubPrivate Sub Winsock1_DataArrival(Index As Integer, ByVal bytesTotal As Long)
        Dim strClient As String    Winsock1(Index).GetData strClient, vbString    '获得数据
        Debug.Print strClient
    End SubPrivate Sub Winsock1_Close(Index As Integer)
        Winsock1(Index).Close
    End Sub
      

  2.   

    但是如果编译exe文件(编译过程没提示出错)运行之后,客户端则不能连上服务端
    // 建议程序在winsock_close  winsock_error中把错误打印出来,根据错误找连不上服务器端的原因,看是强制拒绝连接,还是连接超时 又或者是其他原因
      

  3.   

    测试了以下代码, 没发现问题。Option ExplicitPrivate Sub Form_Load()
        InitWinSock
    End SubPublic Sub InitWinSock()
        Dim i As Long
        
        Winsock1(0).Protocol = sckTCPProtocol      '使用TCP协议
        Winsock1(0).LocalPort = 1234               '与客户端的连接使用1234端口
        Winsock1(0).Listen                         '开始监听
        
        For i = 1 To 100                           '设定最大连接为100
            Load Winsock1(i)
        Next
    End SubPrivate Sub Winsock1_ConnectionRequest(Index As Integer, ByVal requestID As Long)
        Dim i As Long
        For i = 1 To 100
            If Winsock1(i).State = sckClosed Then
                Winsock1(i).Accept requestID
                Exit For
            End If
        Next
    End SubPrivate Sub Winsock1_DataArrival(Index As Integer, ByVal bytesTotal As Long)
        Dim strClient As String    Winsock1(Index).GetData strClient, vbString    '获得数据
        Debug.Print strClient
    End SubPrivate Sub Winsock1_Close(Index As Integer)
        Winsock1(Index).Close
    End Sub编译生成EXE文件运行也正常。
      

  4.   

    客户端连接代码:
    Winsock1.RemoteHost = ServerIP
    Winsock1.RemotePort = 1234
    Winsock1.LocalPort = 0
    Winsock1.Connect服务端在调试状态下运行则客户端一切正常,运行exe则客户端出现以下错误
    Err.Number=40006
    Err.Description=Wrong protocol or connection state for the requested transaction or request
      

  5.   

    谢谢ZOU_SEAFARER
    真的是防火墙的问题,呵呵。