用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的都保留
下面是我程序的代码:
服务器端:
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的都保留
解决方案 »
- 提个若问题:DAO怎样与DATAGRID相连?谢谢!
- 貌似是自动回复?
- 工程1如何引用工程2里的表单
- 如何得到文件(例:"C:\aa.txt")的若干信息:1.名称2.所在文件夹3.大小4.类型5.修改时间???
- 我在VB中用下面的语句恢复数据时,提示数据库正在用着,怎么办?
- 怎样用sendmessage向后台运行程序发送回车键?
- vb中如何实现metafile(图元文件)的旋转显示?
- LiuSam在吗?请直接和我联系。帮我解决问题。多谢了。
- 为什么在Win2k下开发的程序,到了Win98下,字体变得怪怪的!
- 怎么取得某窗口的位置及宽度和长度,有没有某个API。
- 求各种图像转换为JPG格式的方法或控件!
- 请问如何更新及增加一个可执行文件中的图标资源?
不清楚~~~~
用API套结字。。可能好点
Private Sub Winsock1_Close()
With Winsock1
If .State <> sckClosed Then .Close
‘.LocalPort = 4000'这里去掉就好了
.Listen
End With
End Sub
客户端的LocalPort不为0的话,就是不指定本地端口,好像tcp不能指定本地端口吧
注释到此句还是不行
但是这种情况应该很少才对,因为按你的写法,应该是服务端的多,服务端应该用数组较好。客户端:
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