首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

VBScript 使用 MSWINSOCK.Winsock 透過 TCP 協議發送資料完整解決方案

     編輯:程式設計疑難解答

問題背景

在使用 VBScript 透過 MSWINSOCK.Winsock 元件以 TCP 協議向伺服器發送資料時,常遇到「操作無效」或連線失敗的錯誤提示。許多開發者初次嘗試時會直接在 Connect 方法後緊接著呼叫 SendData,卻忽略了 TCP 協議的連線建立需要時間。

錯誤原因分析

TCP 是面向連線的可靠傳輸協議,Connect 方法屬於非同步操作,呼叫後並不代表連線已立即建立完成。若在連線狀態尚未轉為 sckConnected (7) 時就呼叫 SendData,控制項會拋出錯誤。

正確的實作範例

Dim sock
Set sock = WScript.CreateObject("MSWINSOCK.Winsock")
sock.Protocol = 0  ' 0 = TCP, 1 = UDP
sock.RemoteHost = "10.185.59.51"
sock.RemotePort = 9991
sock.Connect

' 等待連線建立,建議使用輪詢方式而非固定 Sleep
Dim timeout : timeout = 0
Do While sock.State <> 7 And timeout < 20
    WScript.Sleep 100
    timeout = timeout + 1
Loop

If sock.State = 7 Then
    sock.SendData msglog
    WScript.Sleep 10  ' 給予發送緩衝時間
End If

sock.Close
Set sock = Nothing

Winsock 狀態碼對照表

常數值說明
sckClosed0預設,連線關閉
sckOpen1開啟
sckListening2監聽中
sckConnectionPending3連線等待中
sckResolvingHost4解析主機名稱中
sckHostResolved5主機名稱已解析
sckConnecting6連線中
sckConnected7已連線,可收發資料
sckClosing8對端正在關閉
sckError9發生錯誤

最佳實務建議

  • 採用輪詢迴圈檢查 State 屬性,避免固定 Sleep 導致的不穩定
  • 設定合理的逾時機制,防止無限等待
  • 64 位元系統需將 mswinsck.ocx 放入 C:\Windows\SysWOW64 並用 regsvr32 註冊
  • 發送完成後適當延遲再關閉,確保資料送達
錯誤畫面示意
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved