关于使用Winsock控件客户端LocalPort必须为0的问题
用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 Sub
Private Sub Winsock1_Close()
With Winsock1
If .State <> sckClosed Then .Close
.LocalPort = 4000
.Listen
End With
End Sub
Private Sub Winsock1_ConnectionRequest(ByVal requestID As Long)
If Me.Winsock1.State <> sckClosed Then Me.Winsock1.Close
Me.Winsock1.Accept requestID
End Sub
Private 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 Sub
Private Sub Winsock1_Close()
Me.Label1.Caption = "连接已关闭"
End Sub
Private Sub Winsock1_Connect()
Me.Label1.Caption = "已与服务器连接"
Me.Winsock1.SendData aaa '数据发送省略了,用变量aaa代替了
End Sub
Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
'处理接收到数据
End Sub
Private Sub Winsock1_SendComplete()
If gstrTransmissionStatus = "OK" Then
Me.Label1.Caption = "传输完成"
Me.Command1.Enabled = True
End If
End Sub
Private 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的都保留
问题点数:50、回复次数:9Top
1 楼Dickson(沧海冷心)回复于 2004-09-04 16:25:32 得分 10
这!~~~
不清楚~~~~
用API套结字。。。。。可能好点Top
2 楼zyg0(影子(被评为本年度最可爱流氓)回复于 2004-09-04 16:29:40 得分 15
Private Sub Winsock1_Close()
With Winsock1
If .State <> sckClosed Then .Close
‘.LocalPort = 4000'这里去掉就好了
.Listen
End With
End SubTop
3 楼zyg0(影子(被评为本年度最可爱流氓)回复于 2004-09-04 16:35:18 得分 0
Winsock控件编写一个TCP的程序,发现如果客户端的LocalPort不为0的话,下次再次连接,就会无法连接上服务器端。查阅了CSDN以前的帖子,发现是有好多人碰到过这个问题,设为0就解决了,可是为什么呢?还请大家指导
客户端的LocalPort不为0的话,就是不指定本地端口,好像tcp不能指定本地端口吧
Top
4 楼HtoFire(冬天里的一把火)回复于 2004-09-04 16:52:30 得分 0
to zyg0(影子(努力吃饭中)):
注释到此句还是不行Top
5 楼zyg0(影子(被评为本年度最可爱流氓)回复于 2004-09-04 17:18:43 得分 0
下次再次连接你 下次连接如果本地的另一个端口不关闭的话会出问题,必须关闭前一个,或者是设置另一个端口Top
6 楼zqfleaf(动力港湾)回复于 2004-09-06 16:09:28 得分 15
从你的描述应该是客户端的地址被占用了。
但是这种情况应该很少才对,因为按你的写法,应该是服务端的多,服务端应该用数组较好。
客户端:
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
Top
7 楼HtoFire(冬天里的一把火)回复于 2004-09-06 17:00:51 得分 0
现在我不是想解决这个程序,而是想知道为什么客户端的LocalPort得设为0,当然从现象上看是客户端的本地端口被占用了,但服务器端的LocalPort设为非0是不会产生这种现像的。这是为什么呢?为会么客户端的LocalPort会被占用?是不是要在程序中释放啊?Top
8 楼zyg0(影子(被评为本年度最可爱流氓)回复于 2004-09-06 17:11:17 得分 0
不知道为什么,一直这样写Top
9 楼thbird(蝌蚪甲)回复于 2004-10-25 13:41:25 得分 10
接分!Top




