บทความต่อไปนี้ เป็นโปรแกรมตัวอย่างการใช้งาน
Winsock Control (วินซ็อกคอนโทรล) ซึ่งเป็น คอนโทรลที่ใช้สำหรับการเขียนโปรแกรมบนอินเทอร์เน็ต
โปรแกรม Daytime นี้จะใช้โปรโตคอล DAYTIME ในการที่จะรับเอาค่าวัน และ เวลา
จากเครื่องเซิร์ฟเวอร์ที่คุณต้องการ โดยที่ไคลเอนต์จะต้องทำการติดต่อกับเซิร์ฟเวอร์ผ่านทางพอร์ต
หมายเลข 13 เมื่อได้ทำการติดต่อ แบบโปรโตคอล DAYTIME แล้วเซิร์ฟเวอร์ก็จะส่งค่าตัวอักษร
ที่ประกอบด้วยวันและเวลา ไปยังไคลเอนต์
เริ่มต้นด้วยการสร้างโปรเจ็กใหม่ (Standard EXE) ซึ่งโปรแกรมจะสร้างฟอร์มให้
1 ฟอร์ม โดยอัตโนมัติ ทำการเพิ่มวินช็อกคอนโทรล (กด Ctrl-T) ลาก และ วางคอนโทรลไว้บนฟอร์ม
ส่วนคอนโทรลอื่นที่จะใช้ จะแสดงดังภาพด้านล่างนี้
หลังจากนั้น ให้เปิดหน้าต่างโค้ดเพิ่มโค้ดต่อไปนี้ลงไป
Private
Sub cmdCancel_Click()
Unload Me
End Sub
Private Sub cmdConnect_Click()
txtDateTime = ""
Winsock1.Connect Trim$(txtRemoteHost), 13
End Sub
Private Sub Form_Load()
txtRemoteHost = ""
txtDateTime = ""
End Sub
Private Sub Winsock1_DataArrival(ByVal
bytesTotal As Long)
Dim strData As
String
Winsock1.GetData strData, vbString
txtDateTime = txtDateTime & Trim$(strData)
End Sub
Private Sub Winsock1_Error(ByVal
Number As Integer, _
Description
As String, _
ByVal Scode As Long, _
ByVal Source
As String, _
ByVal HelpFile
As String, _
ByVal HelpContext
As Long, _
CancelDisplay As Boolean)
MsgBox "Winsock Error: " & Number & vbCrLf
& _
Description,
vbInformation
End Sub
เอาละครับ.. ต่อไปผมจะอธิบายโค้ดข้างต้นที่ได้พิมพ์เข้าไป
เมื่อผู้ใช้ทำการใส่ชื่อของเซิร์ฟเวอร์ ลงในช่อง Remote Host แล้วทำการคลิกปุ่ม
Connect โปรแกรมก็จะทำงานตามอีเวนต์ cmdConnect_Click ซึ่งมีคำสั่งที่สำคัญ
คือ
Winsock1.Connect Trim$(txtRemoteHost),
13
คุณจะเห็นได้ว่า โปรแกรมจะใช้เมธอด
Connect ของวินซ็อกคอนโทรล ทำการติดต่อกับ เซิร์ฟเวอร์ที่ต้องการ ผ่านทางพอร์ต
หมายเลข 13 ถ้าในขณะนั้น service (เซอร์วิซ) Daytime ของ เซิร์ฟเวอร์ให้บริการอยู่
มันก็จะ รับคำร้องขอที่เข้ามาจากไคลเอนต์, ตอบสนองข้อมูลให้กับไคลเอนต์ แล้วทำการตัดการติดต่อ
วินซ็อกคอนโทรลจะแจ้งให้คุณรู้ว่าได้รับข้อมูล เมื่อข้อมูลเข้ามาผ่านทาง
อีเวนต์ DataArrival ซึ่งข้อมูลทั้งหมดจะถูกเก็บอยู่ที่บัฟเฟอร์ เราจะต้องใช้เมธอด
GetData เพื่อ จะดึงข้อมูลนำมาใช้งาน
Dim strData As String
Winsock1.GetData strData, vbString
txtDateTime = txtDateTime & Trim$(strData)
โค้ดด้านบนนี้ จะเป็นการดึงข้อมูลมาใส่ไว้ใน
txtDayTime จากบัฟเฟอร์ที่เก็บข้อมูลไว้
เป็นเรื่องที่ดี ที่เราจะทราบเกี่ยวกับ
ข้อผิดพลาดของวินซ็อก ซึ่งอาจจะเกิดขึ้นในขณะรันโปรแกรม โดยคุณควรใส่โค้ดต่อไปนี้
ไว้ในอีเวนต์ เออร์เรอร์ ของวินซ็อก
MsgBox
"Winsock Error: " & Number & vbCrLf & _
Description,
vbInformation
โด้ดนี้จะแจ้งให้คุณทราบถึงข้อผิดพลาดที่เกิดขึ้นกับวินซ็อก
เอาละครับ ตอนนี้ทุกอย่างก็พร้อม สำหรับการทดสอบโปรแกรมแล้ว ให้กด F5 เพื่อรันโปรแกรม
ป้อนชื่อของเซิร์ฟเวอร์ลงในช่อง "Remote Host" (ตัวอย่างเช่น w3.org)
แล้วทำการคลิกปุ่ม "Connect" แล้วรอสักครู่ จะมีการตอบกลับมาจากเซิร์ฟเวอร์
เป็นข้อมูลที่แสดงในช่อง txtDayTime ให้คุณทำการคลิกที่ปุ่ม "Connect" อีกครั้ง
แล้วคอยดูผลที่เกิดขึ้น
จะมีการแจ้งข้อผิดพลาดเกิดขึ้น แต่คำว่า
"current state" หมายความว่ายังไง? เราก็ต้องค้นหา คำตอบ โดยคลิกปุ่ม "Debug"
และกดปุ่ม Ctrl-G จะปรากฎหน้าต่าง "Immediate" แล้วทำการพิมพ์ข้อความต่อไปนี้
แล้วกด enter
?Winsock1.State
คุณจะเห็นได้ว่า วินซ็อกคอนโทรลจะมีค่าของ
State (สถานะ) ซึ่งเป็นตัวบอกถึงสถานะการทำงาน ในขณะนั้นของวินซ็อก ซึ่งมีค่าเท่ากับ
8 เพื่อหาคำตอบของค่าดังกล่าว ให้ทำการเรียก Object Browser (กดปุ่ม F2 )
จากหน้าต่าง Object Browser ทำให้เราทราบว่า
วินซ็อกคอนโทรลในขณะนั้นมีสถานะ คือ ถูกเซิร์ฟเวอร์ตัดการติดต่อไปแล้ว ซึ่งในขณะที่มันอยู่ในสถานะนี้
เราไม่สามารถใช้สร้างการติดต่อ ครั้งใหม่ได้เลย แต่ก็มีเทคนิคง่ายเพื่อแก้ปัญหานี้
คือ การเรียกใช้เมธอด Close :
Winsock1.Close
เราจะต้องเรียกใช้เมธอด Close ก่อนการเรียกใช้เมธอด
Connect ครั้งใหม่ เพื่อแก้ข้อผิดพลาดที่ เกิดขึ้นข้างต้น เอาละครับ เรามาลองดูกันอีกครั้ง
รันโปรแกรม, ป้อนชื่อเซิร์ฟเวอร์, คลิกปุ่ม "Connect" แล้วรอการตอบกลับมาของเซิร์ฟเวอร์
เมื่อได้รับข้อมูลแล้ว ให้เราทำเหมือนเดิม คือ คลิกที่ปุ่ม "Connect" ซ้ำอีกครั้ง
ก็จะปรากฏข้อผิดพลาดว่า "Address in use?" ข้อผิดพลาดนี้เกิด จากที่วินซ็อกมีการเรียกใช้หมายเลขพอร์ตเก่าที่ได้ปิดไปแล้ว(Close)
มีวิธีการแก้ไขคือ กำหนด หมายเลขพอร์ตให้กับวินซ็อกใหม่ โดยจะกำหนดให้มีค่า
เท่ากับศูนย์ (0 =จะเป็นการสุ่มหมายเลข พอร์ตที่ว่างอยู่โดยอัตโนมัติ) ดังโค้ดด้านล่างนี้
Winsock1.LocalPort = 0
ดังนั้นจะได้โค้ดในส่วนของปุ่ม "Connect"
ดังนี้:
Private Sub
cmdConnect_Click()
txtDateTime = ""
Winsock1.Close
Winsock1.LocalPort = 0
Winsock1.Connect Trim$(txtRemoteHost), 13
End Sub
|