Winsock控件如何使用

几罗星人 2011-02-27 11:12:29
本人在这方面是初手,望大家多多指教。是这样的,我写了个Winsock控件的程序,主要代码如下:
下面是文件发送端的主要代码,内含按钮3个(链接,发送,断开),还有两个List,一个winsock,一个公用对话框

Private Sub Command1_Click()'文件发送端的链接按钮
Winsock1.Close
Winsock1.Connect "PC-201007241830", 5000
'PC-201007241830是我的一位朋友的电脑的计算机名称
End Sub
Private Sub Winsock1_Connect()
List1.AddItem "Connect"
End Sub

下面是文件接收端的代码(下面就是接收端的所有代码),内含一个List,一个winsock,一个Timer


Private Sub Timer1_Timer()
If Winsock1.State = sckClosed Then
Winsock1.LocalPort = 5000
Winsock1.Listen
List1.AddItem "监听5000端口"
ElseIf Winsock1.State = sckConnected Then
End If
End Sub

Private Sub Winsock1_Close()
List1.AddItem "对方断开连接"
Winsock1.Close
End Sub

Private Sub Winsock1_ConnectionRequest(ByVal requestID As Long)
On Error Resume Next
Winsock1.Close
Winsock1.Accept requestID
List1.AddItem "连接请求,requestID :" & requestID
End Sub

Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
On Error Resume Next
DoEvents
Dim a() As Byte
Accept_FileName = "D:\我的电脑.BMP"

Open Accept_FileName For Binary As #1
If LOF(1) = 0 Then
List1.AddItem "数据达到Lof(1)= 0 :" & bytesTotal
ReDim a(bytesTotal - 1)
Winsock1.GetData a
Put #1, 1, a
Else
List1.AddItem "数据达到Lof(1)<> 0 :" & bytesTotal
ReDim a(bytesTotal - 1)
Winsock1.GetData a
Put #1, LOF(1) + 1, a
End If
Close
End Sub

接收端在我朋友的电脑里,发送端在我的电脑里,两人同时运行,但为什么无法建立连接,这是我从一本书上弄下来的,书上的

Winsock1.Connect "PC-201007241830", 5000

这个代码原来是

Winsock1.Connect "127.0.0.1", 5000'连接的是自己的电脑

在自己的电脑里用原来的代码生成两个EXE,也在自己的电脑里运行,没问题,可以实现功能,但为什么127.0.0.1改成朋友的电脑的计算机名称PC-201007241830,接收端的运行环境由我的电脑改为朋友的电脑(发送端还在我这)就不行了呢?请高手指路
...全文
1087 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
chinaboyzyq 2011-03-08
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 jiluoxingren 的回复:]

谢谢大家,那我想问QQ哪些是怎样运作的,能说个原理看看吗?
[/Quote]
QQ是通过QQ服务器使用UDP协议中转的,你和他都是发往QQ服务,然后由它转给对方。
几罗星人 2011-03-08
  • 打赏
  • 举报
回复
谢谢大家,那我想问QQ哪些是怎样运作的,能说个原理看看吗?
王二.麻子 2011-03-05
  • 打赏
  • 举报
回复
你都没说你们2个计算机的网络环境。
你让这些人怎么说那。
局域网里面好弄多了。要是再internet,要穿过路由器,防火墙,那有多了很多东西。。。

要是你们2个都是adsl,至少得,2个机子在防火墙里面设置,在路由器里面做设置。路由器默认是不能从外边发起连接的。
局域网就看看防火墙有没有阻止,直接用内网ip连接试试
dbcontrols 2011-02-28
  • 打赏
  • 举报
回复
球代码球真相
[Quote=引用 5 楼 yiguangqiang88 的回复:]
反正是个麻烦,现在许多网络上头都有多级路由,要跨网访问需要做nat穿透。我的电信光纤居然死都不给我开放一个端口的映射……倒是电话拨号的ADSL获得真正的公网ip,做个映射就可以了,但是它们都要使用动态域名解析。
局域网内就简单多了,程序在启动和退出的时候用udp发个签到或者注销广播包给某个端口,自身同时监听该端口,就能获得所有在线机器的ip了……
[/Quote]
  • 打赏
  • 举报
回复
反正是个麻烦,现在许多网络上头都有多级路由,要跨网访问需要做nat穿透。我的电信光纤居然死都不给我开放一个端口的映射……倒是电话拨号的ADSL获得真正的公网ip,做个映射就可以了,但是它们都要使用动态域名解析。
局域网内就简单多了,程序在启动和退出的时候用udp发个签到或者注销广播包给某个端口,自身同时监听该端口,就能获得所有在线机器的ip了……
dbcontrols 2011-02-28
  • 打赏
  • 举报
回复
朋友的电脑的计算机名称PC-201007241830
在网上算啥?
要有独立的IP,那很贵,或者你使用花生壳
king06 2011-02-28
  • 打赏
  • 举报
回复
看看防火墙
  • 打赏
  • 举报
回复
    Combo1.AddItem Replace(Replace(sTrr, "又回来啦", ""), "我", "")
Debug.Print Winsock2.RemoteHostIP
对方的ip可以通过这句取得。
  • 打赏
  • 举报
回复
Option Explicit

Private Sub Form_Load()
Dim i As Byte, l As Byte, Sip As String
Winsock1.Protocol = sckUDPProtocol 'UDP模式
Winsock1.LocalPort = 23233
Winsock1.RemotePort = 23232
Winsock2.Protocol = sckUDPProtocol 'UDP模式
Winsock2.LocalPort = 23232 '监听23232端口
Winsock2.Bind
'Winsock1.SendData "我胡汉三又回来啦"
Sip = Left(Winsock1.LocalIP, InStrRev(Winsock1.LocalIP, "."))
l = Mid(Winsock1.LocalIP, InStrRev(Winsock1.LocalIP, ".") + 1)
For i = 2 To 254
' If l <> i Then
Winsock1.RemoteHost = Sip & Trim(i)
Winsock1.SendData "我胡汉三又回来啦"
Winsock1.Close
' End If
Next
End Sub

Private Sub Winsock2_DataArrival(ByVal bytesTotal As Long)
Dim sTrr As String
On Error Resume Next
Winsock2.GetData sTrr, vbString
Combo1.AddItem Replace(Replace(sTrr, "又回来啦", ""), "我", "")
End Sub
以上是签到udp发送代码,本机自身能收到并把姓名添加到combo1中。
添加2个winsock,一个combo
当然,收到签到后收到的机器需要回送相同信息,让对方也知悉您在线(聊天程序已经运行)
lihaidomain 2011-02-28
  • 打赏
  • 举报
回复
如果你朋友和你是同一子网的,那就用你朋友的本地IP就可以通行。如果是不在一个局域网里得,那就要获取他的外网IP进行通行。获取外网IP后,还要进行转发才能通行。以为外网的终端不知你朋友在局域网里得位置,所以要经过路由转发才行。
  • 打赏
  • 举报
回复
尝试下对方ip地址试试?

1,502

社区成员

发帖
与我相关
我的任务
社区描述
VB 网络编程
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧