Ⅰ 400分求vb.net,求一個socket的編程實例,詳細見問題補充:
至少需要
ImportsSystem
ImportsSystem.Net
ImportsSystem.Net.Sockets
ImportsSystem.Threading
ImportsSystem.Text
還要了解非同步與委託
簡單點的話
subtcplisten()'監聽過程
ConstLPortAsInteger=6850'本地監聽埠
DimIPaddAsIPAddress=Dns.GetHostEntry(Dns.GetHostName()).AddressList(1)』本地IP
'addresslist裡麵包括IPV6和IPV4
DimIPEPAsNewIPEndPoint(IPadd,LPort)'結點
TCPL=NewTcpListener(IPEP)』建立監聽實例
TCPL.Start()'開始監聽
IfTCPL.Pending=TrueThen'如果有連接接入
DimTCPLXAsNewSocket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp)'建立一個新的SOCKET
TCPLX=TCPL.Accept()』將第一個接入掛起的連接傳給新建SOCKET,因為監聽的SOCKET還要繼續監聽
dimRipepasnewipendpoint=TCPLX.RemoteEndPoint'此時獲得遠程的ip與埠號
listbox.add(ripep.ip)
dimbuffasbyte()
buff=TCPLX.Receive()'listen>accept>recieve這時候可以接受數據了
dimsasstring=Encoding.Default.GetString(buff)'轉換成文本
msg"s"
TCPLX.send(buff)'這個是發送
endif
EndSub
長時間沒寫,可能有點小錯誤,你自己調試調試,大概步驟就是listen>accept>recieve,最好看看msdn,那個學起來才系統
Ⅱ VB Winsock最簡單的;聊天程序源代碼
這個是我以前學習的一個實例。希望對你有幫助!!!
用VB實現客戶——伺服器(TCP/IP)編程實例
-
現在大多數語言都支持客戶-伺服器模式編程,其中VB給我們提供了很好的客戶-伺服器編程方式。下面我們用VB來實現TCP/IP網路編程。
TCP/IP協議是Internet最重要的協議。VB提供了WinSock控制項,用於在TCP/IP的基礎上進行網路通信。當兩個應用程序使用Socket進行網路通信時,其中一個必須創建Socket伺服器偵聽,而另一個必須創建Socket客戶去連接伺服器。這樣兩個程序就可以進行通信了。
1.創建伺服器,首先創建一個服務埠號。並開始偵聽是否有客戶請求連接。
建立一窗體,並向其增加一個Winsock控制項(可在工程菜單中的部件項來添加此控制項)
添加兩文本框Text1,Text2,和一按鈕Command1
Private Sub Form_Load()
SockServer.LocalPort = 2000 ′伺服器埠號,最好大於1000
SockServer.Listen ′開始偵聽
End Sub
Private Sub Form_Unload(Cancel As Integer)
SockServer.Close
End Sub
Private Sub SockServer_Close()
SockServer.Close
End Sub
Private Sub SockServer_ConnectionRequest(ByVal requestID As Long)
SockServer.Close
SockServer.Accept requestID ′表示客戶請求連接的ID號
End Sub
′當客戶向伺服器發送數據到達後,產生DataArrival事件,在事件中接收數據,GetData方法接收數據。
Private Sub SockServer_Data
Arrival(ByVal bytesTotal As Long)
Dim s As String
SockServer.GetData s
Text1.Text = s
End Sub
當我需要向客戶發送數據時,只需調用SendData方法。
Private Sub Command1_Click()
SockServer .SendData Text2.Text
text1.text = text2.text
text2.text = ""
End Sub
2.創建客戶。要創建客戶連接伺服器,首先設置伺服器主機名,如IP地址、域名或計算機名,然後設置伺服器埠,最後連接伺服器。
建立一窗體,並向其增加一個Winsock控制項(可在工程菜單中的部件項來添加此控制項),取名為:SockC1。添加兩文本框Text1,Text2,和一按鈕Command1
Private Sub Form_Load()
dim my as string
my = SockCl.RemoteHostIP
SockCl.RemoteHost = my
′表示伺服器主機名
SockCl.RemotePort = 2000
′表示伺服器埠名
SockCl.Connect
′連接到伺服器
End Sub
Private Sub Form_Unload(Cancel As Integer)
SockCl.Close
End Sub
Private Sub SockCl_Close()
SockCl.Close
End Sub
Private Sub SockCl_DataArrival(ByVal bytesTotal As Long)
Dim s As String
SockCl.GetData s ′接收數據到文本框中
Text1.Text = s
End Sub
Private Sub Command1_Click()
SockCl.SendData Text2.Text ′向伺服器發送數據
text1.text = text2.text
text2.text = ""
End Sub
3.進行通信。把這兩個窗體分別編譯成兩個EXE文件,伺服器Server.exe和客戶Client.exe程序,並把它們分別安裝在伺服器端和客戶端,這樣就可以實現兩者通信了。
------------------------------------整理後的代碼如下-------------------------------
Private Sub Form_Load()
Dim my As String
my = SockCl.RemoteHostIP
SockCl.RemoteHost = my
SockCl.RemotePort = 2000
SockCl.Connect
End Sub
Private Sub Form_Unload(Cancel As Integer)
SockCl.Close
End Sub
Private Sub SockCl_Close()
SockCl.Close
End Sub
Private Sub SockCl_DataArrival(ByVal bytesTotal As Long)
Dim s As String
SockCl.GetData s
Text1.Text = s
End Sub
Private Sub Command1_Click()
SockCl.SendData Text2.Text
Text1.Text = Text2.Text
Text2.Text = ""
End Sub
Private Sub Form_Load()
SockServer.LocalPort = 2000
SockServer.Listen
End Sub
Private Sub Form_Unload(Cancel As Integer)
SockServer.Close
End Sub
Private Sub SockServer_Close()
SockServer.Close
End Sub
Private Sub SockServer_ConnectionRequest(ByVal requestID As Long)
SockServer.Close
SockServer.Accept requestID
End Sub
Private Sub Command1_Click()
SockServer.SendData Text2.Text
Text1.Text = Text2.Text
Text2.Text = ""
End Sub
Private Sub SockServer_DataArrival(ByVal bytesTotal As Long)
Dim s As String
SockServer.GetData s
Text1.Text = s
End Sub
Ⅲ 高分VB6.0的問題 遠程高手進
VB網路編程--WinSock控制項及WinSockAPI
WinSock簡介
Socket(套接字)最初是由加利福尼亞大學Berkeley(伯克利)分校為UNIX操作系統開發的網路通信介面,隨著UNIX的廣泛使用,Socket成為當前最流行的網路通信應用程序介面之一。20世紀90年代晌前初,由Sun Microsystems,JSB,FTP software,Microdyne和Microsoft等幾家公司共同定製了一套標准,即Windows Socket規范,簡稱WinSock。
VB編寫網路程序主要有兩種方式:1.winsock控制項 2.winsockAPI
二,WinSock控制項的使用
1.WinSock控制項的主要屬性
a.Protocol屬性
通過Protocol屬性可以設置WinSock控制項連接遠程計算機使用的協議。可選的協議是TCP和UDP對應的VB的常量分別是sckTCPProtocol和sckUDPProtocol,Winsock控制項默認協議是TCP。注意:雖然可以在運行時設置協議,但必須在連接未建立或斷開連接後。
b.SocketHandle屬性
SocketHandle返回當前socket連接的句柄,這是只讀屬性。
c.RemoteHostIP屬性
RemoteHostIP屬性返回遠程計算機的IP地址。在客戶端,當使用了控制項的Connect方法後,遠程計算機的IP地址就賦給了RemoteHostIP屬性,而在伺服器端,當ConnectRequest事件後,遠程計算機(客戶端)的IP地址就賦給了這個屬性。如果使用的是UDP協議那麼當DataArrival事件後,發送UDP報文的計算機的IP才賦給了這個屬性。
d.ByteReceived屬性
返回當前接收緩沖區中的位元組數
e.State屬性
返回WinSock控制項當前的狀態
常數 值 描述
sckClosed 0 預設值,關閉。
SckOpen 1 打開。
SckListening 2 偵聽
sckConnectionPending 3 連接掛起
sckResolvingHost 4 識別主機。
sckHostResolved 5 已識別主機
sckConnecting 6 正在連接。
sckConnected 7 已連接。
sckClosing 8 同級人員正在關閉連接。
sckError 9 錯誤
2.WinSock主要方法
a.Bind方法
用Bind方法可以把一個埠號固定為本控制項使用,使乎謹帶得別的應用程序不能再使用這個埠。
b.Listen方法
Listen方法只在使用TCP協議時有用。它將應用程序置於監聽檢測狀態。
c.Connect方法
當本地計算機希望和遠程計算機建立連接時,就可以調用Connect方法。
Connect方法調用的規范為:
Connect RemoteHost,RemotePort
d.Accept方法
當伺服器接收到客戶端的連接請求後,伺服器有權決定是否接受客戶端的請求。
e.SendData方法
當連接建立後,要發送數據就可以調用SendData方法,該方法只有一個參數,就是要發送的數據。
f.GetData方法
當本地計算機接收到遠程計算機的數據時,數據存放在緩沖區中,要從緩沖區中取出數據,可以使用GetData方法。GetData方法調用規范如下:
GetData data,[type,][maxLen]
它從緩沖區中取得最長為maxLen的數歲蘆據,並以type類型存放在data中,GetData取得數據後,就把相應的緩沖區清空。
g.PeekData方法
和GetData方法類似,但PeekData在取得數據後並不把緩沖區清空。
3.Winsock控制項主要事件
a.ConnectRequest事件
當本地計算機接收到遠程計算機發送的連接請求時,控制項的ConnectRequest事件將會被觸發。
b.SendProgress事件
當一端的計算機正在向另一端的計算機發送數據時,SendProgress事件將被觸發。SendProgress事件記錄了當前狀態下已發送的位元組數和剩餘位元組數。
c.SendComplete事件
當所有數據發送完成時,被觸發。
d.DataArrival事件
當建立連接後,接受到了新數據就會觸發這個事件。注意:如果在接受到新數據前,緩沖區中非空,就不會觸發這個事件。
e.Error事件
當在工作中發生任何錯誤都會觸發這個事件。
例子見附件
三,WinSockAPI的使用
1.WSAStartup 函數
為了在你的應用程序當中調用任何一個Winsock API 函數,首先第一件事情你就是必須通過WSAStartup函數完成對Winsock 服務的初始化,因此需要調用WSAStartup函數。
Declare Function WSAStartup Lib "ws2_32.dll" _
(ByVal wVersionRequired As Long, lpWSAData As WSAData) As Long
這個函數有兩個參數: wVersionRequired 和 lpWSAData。wVersionRequired 參數定義Windows Sockets 提供能使用的最高版本,它的高位位元組定義的是次版本號,低位位元組定義的是主版本號。下面的2個Winsock版本在VB中使用的例子:
初始化1.1版本
lngRetVal = WSAStartup(&H101, udtWinsockData)
初始化2.2版本
lngRetVal = WSAStartup(&H202, udtWinsockData)
第二個參數是WSADATA 的數據結構 ,它是接收Windows Sockets 執行時的數據。
Type WSAData
wVersion As Integer
wHighVersion As Integer
szDescription As String * WSADESCRIPTION_LEN
szSystemStatus As String * WSASYS_STATUS_LEN
iMaxSockets As Integer
iMaxUdpDg As Integer
lpVendorInfo As Long
End Type
數據成員的描述在下表中:
Field 描述
wVersion Windows Sockets 版本信息。
wHighVersion 通過載入庫文件得到的最高的支持Winsock 的版本,
它通常和wVersion值相同。
szDescription Windows Sockets 執行時的詳細描述
szSystemStatus 包含了相關的狀態和配置的信息
iMaxSockets 表示同時打開的socket最大數,為0表示沒有限制。
iMaxUdpDg 表示同時打開的數據報最大數,為0表示沒有限制。
lpVendorInfo 廠商指定信息預留
在Winsock的1.1和2.2版本中沒有lpVendorInfo的返回值。因為winsock 2支持多個傳輸協議,所以iMaxSockets 和iMaxUdpDg只能在僅支持TCP/TP的winsock1.1中使用。為了在Winsock 2中獲得這些值,你可以使用WSAEnumProtocols 函數。
如果成功或者返回一個錯誤代碼,則函數返回 0。
錯誤代碼 含義
WSASYSNOTREADY 指出網路沒有為傳輸准備好。
WSAVERNOTSUPPORTED 當前的WinSock實現不支持應用程序指定的Windows Sockets規范版本
WSAEINPROGRESS 一個阻塞WinSock調用正在進行
WSAEPROCLIM 請求的協議沒有在系統中配置或沒有支持它的實現存在。
WSAEFAULT lpWSAData 不是有效的指針
2.WSACleanup 函數
每次調用了WSAStartup函數,你都需要調用WSACleanup函數,通知系統來卸載庫文件及清除已分配的資源,這個函數十分簡單,沒有任何參數:
Declare Function WSACleanup Lib "ws2_32.dll" () As Long
3.建立Socket函數
Declare Function socket Lib "ws2_32.dll" (ByVal af As Long, _
ByVal s_type As Long,
ByVal Protocol As Long) As Long
函數有3個參數定義建立何種socket,三個參數分別是:
Argument Description Enum Type
af Address family specification. AddressFamily
s_type Type specification for the new socket. SocketType
Protocol Protocol to be used with the socket SocketProtocol
that is specific to the indicated address
family.
AddressFamily:
AF_UNSPEC = 0 '/* unspecified */
AF_UNIX = 1 '/* local to host (pipes, portals) */
AF_INET = 2 '/* internetwork: UDP, TCP, etc. */
AF_IMPLINK = 3 '/* arpanet imp addresses */
AF_PUP = 4 '/* pup protocols: e.g. BSP */
AF_CHAOS = 5 '/* mit CHAOS protocols */
AF_NS = 6 '/* XEROX NS protocols */
AF_IPX = AF_NS '/* IPX protocols: IPX, SPX, etc. */
AF_ISO = 7 '/* ISO protocols */
AF_OSI = AF_ISO '/* OSI is ISO */
AF_ECMA = 8 '/* european computer manufacturers */
AF_DATAKIT = 9 '/* datakit protocols */
AF_CCITT = 10 '/* CCITT protocols, X.25 etc */
AF_SNA = 11 '/* IBM SNA */
AF_DECnet = 12 '/* DECnet */
AF_DLI = 13 '/* Direct data link interface */
AF_LAT = 14 '/* LAT */
AF_HYLINK = 15 '/* NSC Hyperchannel */
AF_APPLETALK = 16 '/* AppleTalk */
AF_NETBIOS = 17 '/* NetBios-style addresses */
AF_VOICEVIEW = 18 '/* VoiceView */
AF_FIREFOX = 19 '/* Protocols from Firefox */
AF_UNKNOWN1 = 20 '/* Somebody is using this! */
AF_BAN = 21 '/* Banyan */
AF_ATM = 22 '/* Native ATM Services */
AF_INET6 = 23 '/* Internetwork Version 6 */
AF_CLUSTER = 24 '/* Microsoft Wolfpack */
AF_12844 = 25 '/* IEEE 1284.4 WG AF */
AF_MAX = 26
Socket types:
SOCK_STREAM = 1 ' /* stream socket */
SOCK_DGRAM = 2 ' /* datagram socket */
SOCK_RAW = 3 ' /* raw-protocol interface */
SOCK_RDM = 4 ' /* reliably-delivered message */
SOCK_SEQPACKET = 5 ' /* sequenced packet stream */
Protocols:
IPPROTO_IP = 0 '/* mmy for IP */
IPPROTO_ICMP = 1 '/* control message protocol */
IPPROTO_IGMP = 2 '/* internet group management protocol */
IPPROTO_GGP = 3 '/* gateway^2 (deprecated) */
IPPROTO_TCP = 6 '/* tcp */
IPPROTO_PUP = 12 '/* pup */
IPPROTO_UDP = 17 '/* user datagram protocol */
IPPROTO_IDP = 22 '/* xns idp */
IPPROTO_ND = 77 '/* UNOFFICIAL net disk proto */
IPPROTO_RAW = 255 '/* raw IP packet */
IPPROTO_MAX = 256
該函數可以建立使用特定協議的網路套接字,例如對於UDP協議可以這樣寫:
s=socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)
s=socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)
4.關閉Socket函數
Declare Function closesocket Lib "ws2_32.dll" (ByVal s As Long) As Long
函數有一個參數為建立socket時的Handle
5.連接函數
Declare Function connect Lib "ws2_32.dll" (ByVal s As Long, _
ByRef name As sockaddr_in, _
ByVal namelen As Long) As Long
參數
s 連接的socket句柄。
name 建立連接的地址。
namelen 連接地址的長度。
返回值
成功時返回0。否則返回SOCKET_ERROR以及一個對應的錯誤號 Err.LastDllError。
顯然在調用這個函數時我們需要知道socket句柄,將連接的電腦的埠號和主機名稱(或主機IP地址)。我們知道Winsock 控制項的Connect方法依靠兩個變數:RemoteHost 和RemotePort。此方法不需要socket句柄,因其已經被封裝在COM對象中。你也許認為connect函數應該也接受相同的變數設置,然而,事實並非如此。connect函數的主機地址和埠號的傳送是依靠 sockaddr_in 結構。
Public Type sockaddr_in
sin_family As Integer
sin_port As Integer
sin_addr As Long
sin_zero(1 To 8) As Byte
End Type
6.套接字幫定函數
Declare Function bind Lib "ws2_32.dll" (ByVal s As Long, _
ByRef name As sockaddr_in, _
ByRef namelen As Long) As Long
s是使用Socket函數創建好的套接字,name指向描述通信對象的結構體的指針,namelen是該結構的長度。該結
構體中的分量包括:
IP地址:對應name.sin_addr.s_addr
埠號:對應name.sin_port
埠號用於表示同一台計算機上不同的進程(即應用程序),其分配方法有兩種:
第一種分配方法是,進程讓系統為套接字自動分配一埠號,這只要在調用bind前將埠號指定為0即可。由系統自動分配的埠號位於1024~5000之間,而1~1023之間的任一TCP或UDP埠都是保留的,系統不允許任一進程使用保留埠,除非其有效用戶ID是零(即超級用戶)。
第二種分配方法是,進程為套接字指定一特定埠。這對於需要給套接字分配一眾所周知的埠的伺服器是很有用的。指定范圍在1024~65536之間。
地址類型:對應name.sin_family,一般都賦成AF_INET,表示是internet地址(即IP 地址)。IP地址通常使用點分表示法表示,但它事實上一個32位的長整數,這兩者之間可通過inet_addr()函數轉換。
7.套接字監聽函數
Declare Function listen Lib "ws2_32.dll" (ByVal s As Long, ByVal backlog As Long) As Long
listen函數用來設定Socket為監聽狀態,這種狀態表明Socket准備被連接了。注意,此函數一般在服務程序上使用,其中s是使用Socket函數創建好的套接字,backlog參數用於設定等待連接的客戶端數。
8.接受連接請求
Declare Function accept Lib "ws2_32.dll" (ByVal s As Long, ByRef addr As sockaddr_in, _
ByRef addrlen As Long) As Long
服務端應用程序調用此函數來接受客戶端Socket連接請求,accept()函數的返回值為一新的Socket,新Socket就可用來完成服務端和客戶端之間的信息傳遞與接收,而原來Socket仍可以接受其他可戶端的連接請求。
9.接收信息
Declare Function recv Lib "ws2_32.dll" (ByVal s As Long, _
ByRef buf As Any, _
ByVal buflen As Long, _
ByVal flags As Long) As Long
s 一個已連接的socket的識別符
buf 接受到的數據的緩沖區
len 緩沖區長度
flags 指定從哪調用的標識
第一個參數是socket的句柄-為socket函數返回值。那就是說:我們需要告訴recv函數,哪一個socket正訪問函數。
第二個參數是:函數執行之後能裝載一些數據的緩沖區。但它不是必須要有足夠的長度接收Winsock緩沖區的所有數據,緩沖區的大小限制為8192 位元組 (8 Kbytes)。因此如果Winsock緩沖區的數據的大小大於recv函數的緩沖區,你必需多次調用此函數,直到獲取所有的數據。
如果應用程序定義緩沖區的長度,則recv函數必須知道緩沖區可以存放多少位元組。第三個參數就是為了這個目的。
最後一個參數是可選的,今天我們不使用。該參數有兩個選擇標志: MSG_PEEK 和 MSG_OOB,用於改變函數的行為。
MSG_PEEK 從輸入數據中取數。數據拷入緩沖區,但不從輸入隊列中移走。函數返回當前准備接收的位元組數。
MSG_OOB 處理OOB(Out-of-band帶外)數據。在網路上有兩種類型的數據包,正常包和帶外包。帶外包可以通過檢驗一個TCP/IP包頭的一個特定標志來決定。
10.發送信息
Declare Function send Lib "ws2_32.dll" (ByVal s As Long, _
ByRef buf As Any, _
ByVal buflen As Long, _
ByVal flags As Long) As Long
參數參看接收信息
四,伺服器與客戶機交互
目前最常用的方法是:服務程序在一個眾所周知的地址(其中包括埠信息)監聽對服務的請求,也就是說,服務進程一直處於休眠狀態,直到一個客戶對這個服務的地址提出了連接請求。這個時刻,服務程序被喚醒並對客戶的請求作出適當的反應。注意,伺服器與客戶機之間的交互可以是面向連接的(基於流套接字),也可以是無連接的(基於數據報套接字)。
伺服器
socket()
|
bind()
|
listen() 客戶機
|
| socket()
| 建立連接 |
accept() <------------------------- connect()
| 請求數據 |
recv() <----------------------------- send()
| |
處理服務請求 |
| 應答數據 |
send() ------------------------------> recv()
| |
close() close()
五,其他
比較:WinSock控制項
優點:使用簡單,工作量小。
缺點:功能少僅支持TCP,UDP協議,需要WinSock控制項(系統默認安裝不帶MSWINSCK.OCX文件)
適合於初學者
WinSockAPI
優點:功能強大,支持多種協議,使用靈活,WinSockAPI調用的wsock32.dll(28K)或ws2_32.dll(69K)為Windows系統自帶函數庫不必擔心缺少文件。
缺點:使用復雜,編程量大,需要一定基礎
適合於要求較高的網路程序
http://www.newasp.net/tech/program/22649.html
Ⅳ VB.net中創建的socket類怎麼連接詳情見問題補充,大家幫幫忙,我只有這么多分了
1.綁定的IP是伺服器的IP地址,伺服器是固定的,客戶端連接的是一個已知的伺服器端。
2.客戶端的話,連接到伺服器時,伺服器accept後,就可以獲得客戶端的連接信息,包括IP地址和埠。
我是學C的,在C語言中,socket->bind->listen->accept->....,在accept函數中有選項,如下caddr結構體中就存有accept後客戶端的IP地址 連接埠和傳輸方式等信息,clientsock[1]則為accept新的描述符,如你程序中soc2一樣 。
clientsock[1] = accept(sfd,(struct sockaddr*)&caddr,&len);
VB中應該也有類時的函數,你網上好好找一下,或者看看相關書籍.
Ⅳ VB 如何用:socket 發送數據
1、首先看控制項區有無串口控制項,表明串口控制項並未被啟用,選擇工程→部件→Micosoft comm Control6.0選項,點擊應用,即可添加串口控制項。
Ⅵ vb 關於socket編程
bytesTotal 接收到的總位元組數
vbArray + vbByte 用位元組數組接收數據