用Winsock控件编写一个TCP的程序,发现如果客户端的LocalPort不为0的话,下次再次连接,就会无法连接上服务器端。查阅了CSDN以前的帖子,发现是有好多人碰到过这个问题,设为0就解决了,可是为什么呢?还请大家指导。
    下面是我程序的代码:
服务器端:
Private Sub cmdStart_Click()
    If cmdStart.Caption = "开始侦听" Then
        cmdStart.Caption = "停止侦听"
        Me.Winsock1.LocalPort = 4000
        Me.Winsock1.Listen
        Me.Caption = "正在侦听,请稍后……"
    Else
        Me.Winsock1.Close
        cmdStart.Caption = "开始侦听"
    End If
End SubPrivate Sub Winsock1_Close()
    With Winsock1
        If .State <> sckClosed Then .Close
        .LocalPort = 4000
        .Listen
    End With
End SubPrivate Sub Winsock1_ConnectionRequest(ByVal requestID As Long)
    If Me.Winsock1.State <> sckClosed Then Me.Winsock1.Close
    Me.Winsock1.Accept requestID
End SubPrivate Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
   '处理数据略
End Sub客户端:
Private Sub Command1_Click()
    Me.Command1.Enabled = False
    Me.Winsock1.RemoteHost = "127.0.0.1"
    Me.Winsock1.RemotePort = 4000
    Me.Winsock1.Connect
        
    Me.Label1.Caption = "正在连接"
End SubPrivate Sub Winsock1_Close()
    Me.Label1.Caption = "连接已关闭"
End SubPrivate Sub Winsock1_Connect()
    Me.Label1.Caption = "已与服务器连接"
    Me.Winsock1.SendData  aaa     '数据发送省略了,用变量aaa代替了
End SubPrivate Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
   '处理接收到数据
End SubPrivate Sub Winsock1_SendComplete()
     If gstrTransmissionStatus = "OK" Then
        Me.Label1.Caption = "传输完成"
        Me.Command1.Enabled = True
     End If
End SubPrivate Sub Winsock1_SendProgress(ByVal bytesSent As Long, ByVal bytesRemaining As Long)
    If gstrTransmissionStatus = "OK" Then
        glngbytesToBeSend = glngbytesToBeSend + bytesSent
        Me.Label1.Caption = glngbytesToBeSend & "\" & UBound(gbytBuffer)
    End If
End Sub'以上有部分已经删掉了,但有关Winsock的都保留

解决方案 »

  1.   

    这!~~~
    不清楚~~~~
    用API套结字。。可能好点
      

  2.   


    Private Sub Winsock1_Close()
        With Winsock1
            If .State <> sckClosed Then .Close
            ‘.LocalPort = 4000'这里去掉就好了
            .Listen
        End With
    End Sub
      

  3.   

    Winsock控件编写一个TCP的程序,发现如果客户端的LocalPort不为0的话,下次再次连接,就会无法连接上服务器端。查阅了CSDN以前的帖子,发现是有好多人碰到过这个问题,设为0就解决了,可是为什么呢?还请大家指导
    客户端的LocalPort不为0的话,就是不指定本地端口,好像tcp不能指定本地端口吧
      

  4.   

    to  zyg0(影子(努力吃饭中)):
    注释到此句还是不行
      

  5.   

    从你的描述应该是客户端的地址被占用了。
    但是这种情况应该很少才对,因为按你的写法,应该是服务端的多,服务端应该用数组较好。客户端:
    Private Sub Command1_Click()
        if winsock1.state <>sckclosed then winsock1.close
        Me.Command1.Enabled = False
        Me.Winsock1.RemoteHost = "127.0.0.1"
        Me.Winsock1.RemotePort = 4000
        Me.Winsock1.Connect
            
        Me.Label1.Caption = "正在连接"
    End Sub
      

  6.   

    现在我不是想解决这个程序,而是想知道为什么客户端的LocalPort得设为0,当然从现象上看是客户端的本地端口被占用了,但服务器端的LocalPort设为非0是不会产生这种现像的。这是为什么呢?为会么客户端的LocalPort会被占用?是不是要在程序中释放啊?