- UID
- 3260
- 精华
- 积分
- 648
- 威望
- 点
- 宅币
- 个
- 贡献
- 次
- 宅之契约
- 份
- 最后登录
- 1970-1-1
- 在线时间
- 小时
|
此处为VisualFreeBasic编程教程(从零开始学或VB进阶)的子章节部分,全部目录点链接。网络,FB没有提供专门的函数,只有自己写。- if IsConnectedToInternet then print "有网" else print "无网"
复制代码 有个网络库供我们用,只是遗憾没有64位的GET方法获取网页- print Http_Get( "http://www.yfvb.com")URL:字符串,目标域名或者IP地址+,目标页面的路径
- ref:字符串,引用页面
- user:字符串,用户名,如不需要则填空
- pwd:字符串,密码,如不需要则填空
复制代码 Post方法获取网页- print Http_Post( "http://www.yfvb.com")
复制代码 Http_Get 和 Http_Post ,都写在VFB的函数库里,我们是需要简单的调用,很遗憾不支持64位软件。网络是一个大的学科,GET 与 Post 什么不同,请自行百度,自有解释,我只管VFB可以直接读到。
2台电脑网络通信(UDP方式),同样很遗憾不支持64位软件。- 例题:
- Dim Shared hSockas Any Ptr
- 创建
- hSock=network_UDP_Create(@xSock_UDP_Proc,6)
- 销毁
- UDP_Destroy(hSock)
- 发送
- network_UDP_Send Sock1,"内容","192.168.1.116",6
- 回调
- Sub xSock_UDP_Proc(Sock as Integer, nEvent as Integer, lpOverlapped as Any Ptr, Size as Integer, Custom as Integer)
- Sock 创建时返回的那个指针 nEvent 事件 lpOverlapped 数据指针 长度 自定
- Print Sock, nEvent , lpOverlapped , Size , Custom
- Select Case nEvent
- Case IOCP_UDP_RECV '数据到达
- Dim RecvPack as ZString Ptr
- Dim RecvIP as ZString Ptr
- Dim RecvPort as UShort
- RecvPack = UDP_Read(lpOverlapped, RecvIP, RecvPort)
- '取到达数据指针与地址 [重叠地址] [IP地址] [端口]
- Print "数据到达" & Hex(RecvPack),RecvIP,RecvPort
- If RecvPack Then
- FF_Control_SetText( HWND_FORM1_TEXT4, *RecvPack )
- EndIf
- Case IOCP_UDP_SEND '发送成功
- Print "发送成功"
- Case IOCP_UDP_ESEND '发送失败
- Print "发送失败"
- End Select
- End Sub
复制代码 我们可以直接调用API,操纵每个环节,实现自己想要的。而且支持32 64 软件- #include Once "win/winsock2.bi" 第一步要引用,放在 FF_AppStart 模块里
复制代码 初始化WinSock- aa=doInit()
- If aa Then print "初始化 WinSock 失败!!"
复制代码 分离网址与路径- URL_FenLiYuMinLuJing( "http://www.yfvb.com/soft188.html", hostname, path,port ) '已经在函数库里
- hostname="www.yfvb.com"
- path="/soft188.html"
- port =80
复制代码 网址转换成数字IP地址- ip = resolveHost( hostname )
- If ( ip = 0 ) Then print "网址不能转换成IP"
复制代码 打开Sock- Dim s As SOCKET = opensocket( AF_INET, SOCK_STREAM, IPPROTO_TCP )
- 'af为协议地址族,这里我们使用IPv4,必须为AF_INET
- 'type为socket类型,如果使用TCP/IP,type设为SOCK_STREAM,如果使用UDP,则为SOCK_DGRAM
- 'protocol在给定的地址族及socket类型有多个入口的情况下用来限定特定的传输,对于TCP其值为IPPROTO_TCP,而UDP则为IPPROTO_UDP
- If s = 0 Then 无法打开Sock
复制代码 连接到主机- Dim sa As sockaddr_in
- sa.sin_port = htons( duiko )
- sa.sin_family = AF_INET
- sa.sin_addr.S_addr = ip
- If ( connect( s, Cast( PSOCKADDR, @sa ), SizeOf( sa ) ) = SOCKET_ERROR ) Then
- reportError( "连接到主机connect()" )
- closesocket( s ) '关闭socket
- Return 1
- End If
复制代码 send HTTP 请求- sendBuffer = "GET /" + path + " HTTP/1.0" + Chr(13,10) + _
- "Host: " + hostname + Chr(13,10) + _
- "Connection: close" + Chr(13,10) + _
- "User-Agent: GetHTTP 0.0" + Chr(13,10) + _
- Chr(13,10)
- If ( send( s, sendBuffer, Len( sendBuffer ), 0 ) = SOCKET_ERROR ) Then
- print "HTTP 请求失败"
- closesocket( s )
- Return 1
- End If
复制代码 接收数据直到连接关闭- Dim by(4097) As Byte
- Do
- bytes = recv( s, @by(0), 4096, 0 )
- If( bytes <= 0 ) Then
- Exit Do
- End If
- recvbuffer=String(bytes,0)
- memcpy SAdd(recvbuffer),@by(0),bytes
- tob +=Left(recvbuffer,bytes)
- Loop
- print tob '接收完全部数据
复制代码 最后关闭- shutdown( s, 2 ) '关闭socket
- closesocket( s ) '关闭socket
- WSACleanup '释放
复制代码 基本步够就这些,更多只能买本书慢慢啃了,因为太多了。 |
|