在使用 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
| 常數 | 值 | 說明 |
|---|---|---|
| sckClosed | 0 | 預設,連線關閉 |
| sckOpen | 1 | 開啟 |
| sckListening | 2 | 監聽中 |
| sckConnectionPending | 3 | 連線等待中 |
| sckResolvingHost | 4 | 解析主機名稱中 |
| sckHostResolved | 5 | 主機名稱已解析 |
| sckConnecting | 6 | 連線中 |
| sckConnected | 7 | 已連線,可收發資料 |
| sckClosing | 8 | 對端正在關閉 |
| sckError | 9 | 發生錯誤 |
State 屬性,避免固定 Sleep 導致的不穩定mswinsck.ocx 放入 C:\Windows\SysWOW64 並用 regsvr32 註冊