• Vui lòng đọc nội qui diễn đàn để tránh bị xóa bài viết
  • Tìm kiếm trước khi đặt câu hỏi

Hướng dẫn chat mạng bằng winsock từ A-Z

Các bài viết hướng dẫn, giúp các bạn hiểu và tiếp cận với Visual Basic nhanh hơn
giongto35
Thành viên danh dự
Thành viên danh dự
Bài viết: 194
Ngày tham gia: T.Năm 19/04/2007 10:17 am
Đến từ: Đà Nẵng City
Been thanked: 1 time
Liên hệ:

Hướng dẫn chat mạng bằng winsock từ A-Z

Gửi bàigửi bởi giongto35 » T.Bảy 24/05/2008 5:43 pm

Tên bài viết: Hướng dẫn chat mạng bằng winsock từ A-Z
Tác giả: GiongTo35
Cấp độ bài viết: Trung Bình
Tóm tắt: tất cả để viết được chương trình chat mạng , gồm nhìu bài viết rởi rạc 3 phần


Cấp độ bài viết: Dễ
Tóm tắt: Phần 1 : Cài đặt

download : http://www.ocxdump.com/cgi-bin/testwrap ... WINSCK.OCX
sau khi down load ocx về copy vào C:\windows\system32
Mở Run và điền : regsvr32 "C:\windows\system32\mswinsck.ocx"
RegWinsock.PNG
RegWinsock.PNG (9.93 KiB) Đã xem 14382 lần

ấn ok nếu thấy cái message box : DLLRegisterServer in C:\windows\system32\mswinsck.ocx succeeded thì bạn đã thành công
mở vb 6 , trên menu chọn project -> components hoặc ấn Ctr-T , sẽ hiện ra một bảng , bấm browse chọn mswinsck.Ocx vừa mới down về , bấm OK , bạn đã có MsWinsock trong chương trình
AddWinsock.PNG

tiếp đến bạn sẽ thấy icon của winsock , kéo nó vào form , thế là bạn đã có thể dùng
UseMsWinsck.PNG


________________________________________________________________________________________________
. . . . . . . . . . . . .. .

giongto35
Thành viên danh dự
Thành viên danh dự
Bài viết: 194
Ngày tham gia: T.Năm 19/04/2007 10:17 am
Đến từ: Đà Nẵng City
Been thanked: 1 time
Liên hệ:

Gửi bàigửi bởi giongto35 » T.Bảy 24/05/2008 5:50 pm

Tác giả: sưu tầm
Cấp độ bài viết: Trung Bình
Tóm tắt: Phần 2 : Cách sử dụng Winsock để tạo ứng dụng Client & Server



Winsock control đi kèm với bộ Visual basic 6.0 (VB6) được dùng để phát triển các ứng dụng cho phép truy xuất các chức năng cấp thấp của TCP/IP.

Winsock là một chuẩn được triển khai bởi Microsoft dựa trên một tập các thủ tục truyền dữ liệu trên TCP/IP. Các thủ tục này nằm trong các thư viện liên kết động (DLL) và chạy trên Windows.

Trong bài này chúng tôi sẽ giới thiệu với bạn cách dùng Winsock trong môi trường client/server. Chúng ta sẽ tạo ra hai chương trình: một ở client và một ở server, hai chương trình này sẽ tương tác với nhau để truyền dữ liệu qua lại. Client gởi yêu cầu lên server, Server sẽ lấy dữ liệu từ Database và trả dữ liệu về cho Client. Giả sử như Database chứa Mã hàng hoá và giá tương ứng. Trên những ứng dụng thực tế thì Database có thể được cài trên một máy khác với máy chạy Application server.

Khái niệm về Port

Trước hết chúng ta cần hiểu qua khái niệm về port. Một port là một vùng nhớ được xác định khi hai máy tính liên lạc với nhau qua TCP/IP. Các ứng dụng dùng một chỉ số port để xác định ứng dụng đối với các máy tính khác. Cả máy gởi lẫn máy nhận đều dùng port này để trao đổi dữ liệu.

Có một vài port được quy định dành sẵn cho các ứng dụng phổ biến như:






Ứng dụng : Port
HTTP : 80

FTP : 20, 21

Gopher : 70

SMTP : 25

POP3 : 110

Telnet : 23

Finger :79

Local : loops/callbacks 0

Sử dụng Winsock

Winsock dựa trên giao thức TCP/IP và mô hình ISO/OSI. TCP/IP là một giao thức truyền thông chuẩn, trong đó xác định các phương thức đóng gói dữ liệu cho phép chuyển vận dữ liệu giữa các thiết bị trên môi trướng mạng không đồng nhất. TCP khởi tạo kết nối cho việc chuyển vận dữ liệu và IP định nghĩa phương thức truyền các gói dữ liệu.

Thông qua các đối tượng Winsock của Microsoft việc sử dụng TCP/IP trở nên dễ dàng hơn. Microsoft đóng gói các thủ tục Winsock và NETAPI trong các gói mà bạn có thể dễ dàng sử dụng trong các ứng dụng Visual basic của mình.

Cách Winsock chạy

Lớp Transport chịu trách nhiệm cung cấp cho lớp Application những phiên (session) và gói dữ liệu.Giao thức cốt lõi của lớp Transport là TCP và UDP. Winsock control hỗ trợ 2 cách:

+ sckTCPProtocol

+ sckUDPProtocol

Thuộc tính của Winsock

Winsock cung cấp khả năng cho bạn tạo Client & Server sử dụng chung một control.Chức năng đôi. Chức năng kép này được định rõ thông qua cài đặt thuộc tính trong ứng dụng bạn xây dựng. Winsock control sử dụng một số các thuộc tính giống nhau, cho dù bạn tạo Client hay Server.Có một số thuộc tính quang trọng sau dây:

BytesReceived Property

Thuộc tính sẽ trả về số byte hiện thời trong buffer nhận.Đây là tính chất read-only và không có giá trị trong thời gian thiết kế.Giá trị trả về là một số long interger

LocalHostName Property

Thuộc tính này sẽ trả về tên của máy local.Đây là thuộc tính read-only và không có giá trị ở thời gian thiết kế.Giá trị trả về là một chuỗi.

LocalIP Property

Thuộc tính này sẽ trả về địa chỉ IP của máy localin một dạng chuỗi, ví dụ 11.0.0.127. Đây là thuộc tính chỉ đọc và không có giá trị tại thời gian thiết kế.

LocalPort Property

Thuộc tính này sẽ trả về hoặc đặt port cục bộ.Thuộc tính này bao gồm cả 2 thuộc tính “read from” và “written to” và có giá trị cả trong thòi gian thiết kế và runtime .Giá trị trả về là một số long interger

Protocol Property

Thuộc tính này sẽ trả về hoặc đặt giao thức cả TCP và UDP đựơc sử dụng bởi Winsock

RemoteHost Property

Thuộc tính này sẽ trả về hoặc đặt tên máy ở xa (remote host) .Thuộc tính này bao gồm cả 2 thuộc tính “read from” và “written to” và có giá trị cả trong thòi gian thiết kế và runtime .Giá trị trả về là một chuỗi và có thể được xác định như địa chỉ IP hoặc tên DNS

RemotePort Property

Thuộc tính này sẽ trả về hoặc đặt port của máy ở xa(remote port number).

State Property

Thuộc tính này trả về tình trạng của điều khiển một danh sách liệt kê.Đây là thuộc tính chỉ đọc và không có giá trị tại thời gian thiết kế.



Phương thức Winsock

Có một số phương thức quan trọng sau đây:

Accept Method

Cho phép yêu cầu kết nối từ hệ thống client. Để phương thức được dùng, điều khiển cần được set ở chế độ listening

Close Method

Cắt một kết nối a kết nối TCP từ client hoặc server .

GetData Method

Nhận khối dữ liệu hiện tại từ buffer và lưu trữ giá trị trong biến kiểu variant.

PeekData Method

Có tác vụ giống như GetData.Mặc dù vậy nó không xoá dự liệu từ hàng đợi.

Listen Method

Được cài đạt trên ứng dụng Server cho phép server chờ đợi một yêu cầu kết nối TCP từ client .

SendData Method

Gửi dữ liệu đến máy ở xa (remote computer).Được sử dung ở cả Server và client

Connect Method

Yêu cầu một kết nối đến máy ở xa.

Tạo client

Làm theo các bước sau:

1.Tạo một mới dự án exe
2.Thêm một Winsock control vào chương trình của bạn
3. Thêm các control khác vào form(xem chương trình để biết thêm chi tiết)
Đây là đoạn code hoàn chỉnh:

Mã: Chọn hết

  1. Option Explicit
  2.  
  3.  
  4. Private Sub cmdClose_Click()
  5.  
  6.      Winsock1.Close
  7.      shpGo.Visible = False
  8.      shpWait.Visible = False
  9.      shpError.Visible = True
  10.  
  11. End Sub
  12.  
  13. Private Sub cmdConnect_Click()
  14.  
  15.       Winsock1.RemoteHost = 11.0.0.1      'Đổi thành IP của máy bạn
  16.       Winsock1.RemotePort = 1007
  17.       Winsock1.Connect
  18.       shpGo.Visible = True
  19.       txtItem.SetFocus
  20.  
  21. End Sub
  22.  
  23.  
  24. Private Sub cmdSend_Click()
  25.  
  26.       If Winsock1.State = sckConnected Then
  27.             Winsock1.SendData  txtItem.Text
  28.             shpGo.Visible = True
  29.             Label3.Caption = " Đang gửi dữ liệu "
  30.       Else
  31.             shpGo.Visible = False
  32.             shpWait.Visible = False
  33.             shpError.Visible = True
  34.             Label3.Caption = " Hiện tại không thể kết nối được tới host "
  35.       End If
  36.  
  37. End Sub
  38.  
  39.  
  40. Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
  41.  
  42.     Dim sData As String
  43.    
  44.     Winsock1.GetData sData, vbString
  45.     Label1.Caption = sData
  46.     txtPrice.Text = sData
  47.     Label3.Caption = " Dữ liệu đã nhận "
  48.     shpGo.Visible = True
  49.     shpWait.Visible = False
  50.     shpError.Visible = False
  51.  
  52. End Sub
  53.  
  54.  
  55.  
  56. Private Sub Winsock1_SendComplete()
  57.  
  58.      Label3.Caption = " Chuyển giao dữ liệu hoàn tất "
  59.  
  60. End Sub

Tạo Server

Server được thiết kế để chấp nhận số được gửi từ client và tìm giá tương ứng với số đó trong database.Server gửi thông tin về client.Có một tập tin tên “path.txt” trong thư mục gọi là “Server” và lưu dường dẫn của database trong file đó.Kết nối đến database dược thực thi trong sự kiện DataArrival của Winsock.Đoạn code sau dể mở database và tìm record đầu tiên của giá trị in sItemData.Khi record được tìm thấy, giá trị của trường price cà được gửi về client.

' Get clients request from database
strData = "Item = '" & sItemData & "'"

rs.Open "select * from prices", strConnect, adOpenKeyset,adLockOptimistic
rs.Find strData
strOutData = rs.Fields("Price")

Theo những bước sau đây để tạo :

1.Tạo một dự án EXE trong VB

2.Thêm Winsock control vào ứng dụng của bạn

3.Thêm các control theo các đoạn mã dưới đây

Mã: Chọn hết

  1.  
  2.  
  3. Option Explicit
  4. Dim iSockets As Integer
  5. Dim sServerMsg As String
  6. Dim sRequestID As String
  7.    
  8. Private Sub Form_Load()
  9.  
  10.     Form1.Show
  11.     lblHostID.Caption = Socket(0).LocalHostName
  12.     lblAddress.Caption = Socket(0).LocalIP
  13.     Socket(0).LocalPort = 1007
  14.     sServerMsg = "Listening to port: " & Socket(0).LocalPort
  15.     List1.AddItem (sServerMsg)
  16.     Socket(0).Listen
  17. End Sub
  18.  
  19. Private Sub socket_Close(Index As Integer)
  20.     sServerMsg = "Connection closed: " & Socket(Index).RemoteHostIP
  21.     List1.AddItem (sServerMsg)
  22.     Socket(Index).Close
  23.     Unload Socket(Index)
  24.     iSockets = iSockets - 1
  25.     lblConnections.Caption = iSockets
  26.    
  27. End Sub
  28.  
  29. Private Sub socket_ConnectionRequest(Index As Integer, ByVal requestID As Long)
  30.     sServerMsg = "Connection request id " & requestID & " from " & Socket(Index).RemoteHostIP
  31.   If Index = 0 Then
  32.     List1.AddItem (sServerMsg)
  33.     sRequestID = requestID
  34.     iSockets = iSockets + 1
  35.     lblConnections.Caption = iSockets
  36.     Load Socket(iSockets)
  37.     Socket(iSockets).LocalPort = 1007
  38.     Socket(iSockets).Accept requestID
  39.   End If
  40.  
  41. End Sub
  42.  
  43. Private Sub socket_DataArrival(Index As Integer, ByVal bytesTotal As Long)
  44.    
  45.    Dim sItemData As String
  46.    Dim strData As String
  47.    Dim strOutData As String
  48.    Dim strConnect As String
  49.    
  50.        
  51.     ' get data from client
  52.     Socket(Index).GetData sItemData, vbString
  53.  sServerMsg = "Received: " & sItemData & " from " & Socket(Index).RemoteHostIP & "(" & sRequestID & ")"
  54.     List1.AddItem (sServerMsg)
  55.    
  56.  'strConnect = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=G:\Prices.mdb;Persist Security Info=False"
  57.     Dim strPath As String
  58.      
  59.     'Change the database path in the text file
  60.      
  61.     Dim fso As New FileSystemObject, txtfile, _
  62.     fil1 As File, ts As TextStream
  63.  
  64.     Set fil1 = fso.GetFile("path.txt")
  65.     ' Read the contents of the file.
  66.     Set ts = fil1.OpenAsTextStream(ForReading)
  67.     strPath = ts.ReadLine
  68.     ts.Close
  69.     Set fso = Nothing
  70.  
  71.     strConnect = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
  72.       "Persist Security Info=False;Data Source=" & strPath & _
  73.       "; Mode=Read|Write"
  74.      
  75.     Dim rs As New ADODB.Recordset
  76.    
  77.     ' Get clients request from database
  78.     strData = "Item = '" & sItemData & "'"
  79.    
  80.     rs.Open "select * from prices", strConnect, adOpenKeyset,adLockOptimistic
  81.     rs.Find strData
  82.     strOutData = rs.Fields("Price")
  83.    
  84.     'send data to client
  85.     sServerMsg = "Sending: " & strOutData & " to " & Socket(Index).RemoteHostIP
  86.     List1.AddItem (sServerMsg)
  87.     Socket(Index).SendData strOutData
  88.    
  89. End Sub


Chạy ví dụ1.Tạo file thực thi của cả 2 ứng dụng

2.Chạy 2 ứng dụng

3.Bấm nút connect

4.Nhập giá trị từ 1 đến 6 và bấm nút Lookup.Giá tương ứng sẽ hiển thị ở trường giá

Nếu bạn muốn tìm hiểu thêm có thể đọc ở

1- http://www.15seconds.com/issue/010820.htm
2- http://www.vbip.com/winsock/winsock_control.asp
3- http://msdn.microsoft.com/library/d...sockcontrol.asp
4- http://www.freevbcode.com/ShowCode.asp?ID=3025
5- http://www.geocities.com/alpha_prod.../vb_winsock.htm
6- http://www.freevbcode.com/ShowCode.asp?ID=3025
________________________________________________________________________________________________
. . . . . . . . . . . . .. .

giongto35
Thành viên danh dự
Thành viên danh dự
Bài viết: 194
Ngày tham gia: T.Năm 19/04/2007 10:17 am
Đến từ: Đà Nẵng City
Been thanked: 1 time
Liên hệ:

Re: Hướng dẫn chat mạng bằng winsock từ A-Z

Gửi bàigửi bởi giongto35 » T.Bảy 24/05/2008 6:59 pm

Tác giả: GiongTo35
Cấp độ bài viết: Trung Bình Khá
Tóm tắt: Phần 3 : Port Forward


Đa số chúng ta khi làm được phần mềm làm bằng winsock , chỉ chạy được trong mạng Lan , gửi cho thằng bạn thì ko chạy được , tại sao vậy ? :-? do bạn chưa forward port .ĐỊnh nghĩa port forward như sau

Port forwarding là gì?

Port forwarding là quá trình chuyển một port cụ thể trong hệ thống mạng cục bộ LAN từ một client/terminal/node qua một client/terminal/node của một network khác, điều này sẽ cho phép các clients/terminals/nodes bên ngoài có thể truy cập vào clients/terminals/nodes trong mạng LAN bằng cách sử dụng cái port đó từ bên ngoài thông qua cái Router/Modem/Firewall đã mở chức năng NAT.

Như vậy, các máy tính từ xa (máy vòng quanh thế giới trên internet ấy) sẽ sử dụng Port forwarding để kết nối với một máy tính khác trong mạng LAN và đây cũng chính là cách mà các chương trình Torrent sử dụng để chia sẻ file giữa 2 máy tính với nhau nên ta còn gọi là peer to peer (PP) sharing đó.

Ok hiểu , giờ hướng dẫn , ĐỐi với modem nhà em trước cho dễ

*** Port Forwarding DSL-500T ***


[CENTER][COLOR="Red"]*** Port Forwarding DSL-500T ***[/COLOR][/CENTER]

Trước hết tìm Private IP (có 2 cách) :
1) Start ---> Run ---> Gõ Ipconfig .
2) Control Panel ---> Network Connections ---> ,click chuột phải vào phần connect chọn Status ,Support .
Ghi nhớ phần IpAddress .Ex : 192.168.1.2 (của tôi)

+ Bật trình duyệt lên ,nhập địa chỉ 192.168.1.1 .Login với name và pass là Admin .
Hình ảnh
+ Vào phần Advanced ,chọn Virtual Server , chọn user , chọn add:

winsockExam1.PNG

sau đó chúng ta sẽ nhập
* Rule Name - Nhập tên . Ví dụ như : WinSockExam
* Private IP - Nhập IpAddress vào .
* Protocol - Chọn Both (TCP,UDP)
* Port Start - Nhập cổng để nghe , start bắt đầu từ đâu cũng được nhưng đừng có trùng . Ví dụ : 2000
* Port End - Nhập cổng để nghe , start bắt đầu từ đâu cũng được nhưng đừng có trùng . Ví dụ : 3000
* Port Map -Bỏ trống hoặc điền giống như port start và port end Ví dụ port
_Sau đó chọn Apply .Nếu thành công sẽ hiện ra như sau :
winsockExam2.PNG

Những ai không thấy Virtual Server thì làm như sau :
Vào Home ---> Lan ---> phần User Of Lan chọn Multi -User ,rồi tiến hành làm bình thường .
Hình ảnh


DarkGamer Edit by GIongTo35
____________________________________________________________________________________________
Để test xem bạn đã open port được bạn hãy :
Cách 1 : down 1 phần mềm bằng winsock nào đó về :
Giongto thường tải phần mềm này như là ví dụ của winsock
WinsockSource.zip
(5.98 KiB) Đã tải 1299 lần
, bạn mở server lên , ấn listen , gửi co bạn mình client , Đưa Ip của máy mình , Có thể xem trên trang :
http://whatismyip.com/
http://www.ip2location.com/
thường thường sẽ trả về đúng . nhưng có lúc , nó lại trả về IP sai ( hình như do trình duyệt thông qua proxy nên trả về sai) sẽ làm gián đoạn quá trình test của bạn , để lấy được đúng thì hơi cực nhọc 1 chút
Chọn Status chọn device info : xem phần wan sẽ thấy ip address gốc
IpGoc.PNG

ok
giờ bạn có thể send cho bạn mình điền vảo phần client : IP vừa tìm được : Ví dụ Ip của giongto35 là 123.19.54.104
POrt từ 2000 -> 3000 , chọn 1 số thật đặc biệt như 2135 .
Nếu mà bạn thấy bên kia connect được là bạn đã thành công .
CHú Ý : trên 1 máy ko thể test được , vì vậy phải nhờ bạn , nếu ko có bạn thì

Cách 2 : bạn cho cái server luôn luôn listen tại cổng nào đó (ví dụ cổng 2135)
vào trang http://anonymouse.org/anonwww.html
Điền vào cái text box cấu trúc như sau
http://IP:port
ví dụ : http://123.19.54.104:2135
nếu trong phần mềm nhận được
Client Connected. IP : 193.200.150.26
Client : GET / HTTP/1.0
Host: 123.19.54.104:2135
User-Agent: http://Anonymouse.org/ (Unix)
Connection: keep-alive

thì bạn đã open port thành công .

Các modem khác các bạn có thể xem các bài hướng dẫn cho game startcraft tại http://starcraftvn.net/svn/showthread.php?t=263 nhưng điều chỉnh lại port start và port end của chương trình bản
nếu muốn chi tiết hơn thì bạn xem tiếng anh tại trang : http://www.portforward.com/english/rout ... rindex.htm
tất cả các modem =D>
________________________________________________________________________________________________
. . . . . . . . . . . . .. .

luungoc2005
Thành viên năng nổ
Thành viên năng nổ
Bài viết: 62
Ngày tham gia: T.Ba 17/01/2006 9:43 am
Đến từ: Where Bill Gates beats the penguin just like the Batman
Liên hệ:

Re: Hướng dẫn chat mạng bằng winsock từ A-Z

Gửi bàigửi bởi luungoc2005 » T.Hai 09/06/2008 10:58 pm

các bạn có thể vào trang http://portforward.com/routers.htm để xem hướng dẫn thiết lập Port Forwarding cho từng loại router. Ngoài ra bạn cũng có thể dùng chương trình PFConfig để thiết lập tự động, nhưng chương trình này chỉ thiết lập được những router trong database của nó (và những router phổ biến ở VN trong database của nó có ít lắm :D )
edit: bạn cũng có thể thử xem port đã forward đúng chưa bằng cách vào trang http://www.yougetsignal.com/tools/open-ports/ , nhập ip và port để check.
A forum post should be like a skirt. Long enough to cover the subject material, but short enough to keep things interesting.

Hình đại diện của người dùng
01632911829
Thành viên chính thức
Thành viên chính thức
Bài viết: 42
Ngày tham gia: T.Bảy 11/08/2012 12:50 pm
Đến từ: Bình Thuận
Has thanked: 4 time
Been thanked: 2 time
Liên hệ:

Re: Hướng dẫn chat mạng bằng winsock từ A-Z

Gửi bàigửi bởi 01632911829 » CN 30/12/2012 7:18 pm

Hay vãi! :-bd

thanhmssl10
Thành viên chính thức
Thành viên chính thức
Bài viết: 13
Ngày tham gia: CN 10/07/2011 8:03 pm
Has thanked: 3 time

Re: Hướng dẫn chat mạng bằng winsock từ A-Z

Gửi bàigửi bởi thanhmssl10 » CN 21/07/2013 1:40 am

Rất cảm ơn Bác Goingto35
Nói toàn đúng chỗ mình cần

ntd252
Bài viết: 6
Ngày tham gia: T.Năm 07/01/2016 9:42 pm
Has thanked: 1 time

Re: Hướng dẫn chat mạng bằng winsock từ A-Z

Gửi bàigửi bởi ntd252 » T.Sáu 08/01/2016 9:40 am

của mình lúc chạy cài đặt file ocx báo lỗi the module "..." failed to load. the specified module could not be found
mình đã đặt file ocx đúng thư mục system32, chạy cmd với quyền admin rồi mà vẫn vậy :(


Quay về “[VB] Bài viết hướng dẫn”

Đang trực tuyến

Đang xem chuyên mục này: Không có thành viên nào trực tuyến.1 khách