home *** CD-ROM | disk | FTP | other *** search
/ Planet Source Code Jumbo …e CD Visual Basic 1 to 7 / 6_2008-2009.ISO / data / zips / UniSock_-_2123328122008.psc / UniSock.cls < prev   
Text File  |  2008-08-12  |  106KB  |  2,130 lines

  1. VERSION 1.0 CLASS
  2. BEGIN
  3.   MultiUse = -1  'True
  4.   Persistable = 0  'NotPersistable
  5.   DataBindingBehavior = 0  'vbNone
  6.   DataSourceBehavior  = 0  'vbNone
  7.   MTSTransactionMode  = 0  'NotAnMTSObject
  8. END
  9. Attribute VB_Name = "UniSock"
  10. Attribute VB_GlobalNameSpace = False
  11. Attribute VB_Creatable = True
  12. Attribute VB_PredeclaredId = False
  13. Attribute VB_Exposed = False
  14. '*************************************************************************************************
  15. '* UniSock - Winsock replacement
  16. '* -----------------------------
  17. '* By Vesa Piittinen aka Merri, http://vesa.piittinen.name/ <vesa@piittinen.name>
  18. '*
  19. '* LICENSE
  20. '* -------
  21. '* http://creativecommons.org/licenses/by-sa/1.0/fi/deed.en
  22. '*
  23. '* Terms: 1) If you make your own version, share using this same license.
  24. '*        2) When used in a program, mention my name in the program's credits.
  25. '*        3) Free for commercial and non-commercial usage.
  26. '*        4) Use at your own risk. No support guaranteed.
  27. '*
  28. '* REQUIREMENTS
  29. '* ------------
  30. '* Huh what? Just this one class module. No extra files required.
  31. '*
  32. '* VERSION HISTORY
  33. '* ---------------
  34. '* Version 1.2 (2008-08-12)
  35. '* - Vista connection error resolved!
  36. '*
  37. '* Version 1.1 (2008-08-07)
  38. '* - CreateWindowExW fixed: had forgotten to call DefWindowProc, no more subclassing!
  39. '* - Fixed crash bug when using an invalid RequestID value for Accept.
  40. '* - No more blank error messages, all errors should be covered.
  41. '* - Unicode support: you may now send and receive Unicode! You can get into this mode by using Mode = [Socket Text Mode]
  42. '*   - event: TextArrival
  43. '*   - property: Mode (default: [Socket Binary Mode])
  44. '*   - method: SendText (default: UTF-8)
  45. '*   How it works? Well, first of all: you do not need to care about line changes. SendText adds line change to each line.
  46. '*   TextArrival also processes data one line at a time. Unicode detection is done by looking for line changes.
  47. '*   For example, [CR][00][LF][00] guarantees the data is UTF-16. [CR][LF] guarantees data is either UTF-8 or ANSI.
  48. '*   If data is UTF-16 or UTF-8 you get it in "ready to use" format. ANSI however is provided as raw data (use StrConv).
  49. '*
  50. '* Version 1.0 (2008-08-06)
  51. '* - All the Winsock control features implemented.
  52. '* - Changes & extra features:
  53. '*   - Autocomplete: datatypes have changed in some events and methods to be more precise.
  54. '*   - GetData and SendData support a wide range of array datatypes. (Including string arrays!)
  55. '*   - LineChange: line change used when sending string arrays.
  56. '*   - RequestHost, RequestIP and RequestPort must be used instead of Remote ones when using Accept event.
  57. '*   - Some methods return True on success.
  58. '*
  59. '* Important: UDP SUPPORT IS UNTESTED. Bug reports with sample projects welcome!
  60. '*
  61. '* CREDITS
  62. '* -------
  63. '* Paul Caton and LaVolpe for their work on SelfSub, SelfHook and SelfCallback
  64. '*************************************************************************************************
  65. Option Explicit
  66.  
  67. Public Event Closing()
  68. Public Event Connect()
  69. Public Event ConnectionRequest(ByVal RequestID As Long)
  70. Public Event DataArrival(ByVal BytesTotal As Long)
  71. Public Event 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)
  72. Public Event SendComplete()
  73. Public Event SendProgress(ByVal BytesSent As Long, ByVal BytesRemaining As Long)
  74. Public Event StatusChange(ByVal Status As StateConstants)
  75. Public Event TextArrival(Text As String, ByVal LineChange As UniSockLineChange, ByVal ANSI As Boolean)
  76.  
  77. ' for compatibility...
  78. Public Enum ErrorConstants
  79.     sckAddressInUse = 10048
  80.     sckAddressNotAvailable = 10049
  81.     sckAlreadyComplete = 10037
  82.     sckAlreadyConnected = 10056
  83.     sckBadState = 40006
  84.     sckConnectAborted = 10053
  85.     sckConnectionRefused = 10061
  86.     sckConnectionReset = 10054
  87.     sckGetNotSupported = 394
  88.     sckHostNotFound = 11001
  89.     sckHostNotFoundTryAgain = 11002
  90.     sckInProgress = 10036
  91.     sckInvalidArg = 40014
  92.     sckInvalidArgument = 10014
  93.     sckInvalidOp = 40020
  94.     sckInvalidPropertyValue = 380
  95.     sckMsgTooBig = 10040
  96.     sckNetReset = 10052
  97.     sckNetworkSubsystemFailed = 10050
  98.     sckNetworkUnreachable = 10051
  99.     sckNoBufferSpace = 10055
  100.     sckNoData = 11004
  101.     sckNonRecoverableError = 11003
  102.     sckNotConnected = 10057
  103.     sckNotInitialized = 10093
  104.     sckNotSocket = 10038
  105.     sckOpCanceled = 10004
  106.     sckOutOfMemory = 7
  107.     sckOutOfRange = 40021
  108.     sckPortNotSupported = 10043
  109.     sckSetNotSupported = 383
  110.     sckSocketShutdown = 10058
  111.     sckSuccess = 40017
  112.     sckTimedout = 10060
  113.     sckUnsupported = 40018
  114.     sckWouldBlock = 10035
  115.     sckWrongProtocol = 40026
  116. End Enum
  117.  
  118. ' for compatibility...
  119. Public Enum ProtocolConstants
  120.     sckTCPProtocol
  121.     sckUDPProtocol
  122. End Enum
  123.  
  124. ' for compatibility...
  125. Public Enum StateConstants
  126.     sckClosed
  127.     sckOpen
  128.     sckListening
  129.     sckConnectionPending
  130.     sckResolvingHost
  131.     sckHostResolved
  132.     sckConnecting
  133.     sckConnected
  134.     sckClosing
  135.     sckError
  136. End Enum
  137.  
  138. Public Enum UniSockLineChange
  139.     [Socket Null]
  140.     [Socket CRLF]
  141.     [Socket LF]
  142.     [Socket CR]
  143. End Enum
  144.  
  145. Public Enum UniSockMode
  146.     [Socket Binary Mode]
  147.     [Socket Text Mode]
  148. End Enum
  149.  
  150. Public Enum UniSockTextFormat
  151.     [Socket UTF-8]
  152.     [Socket ANSI]
  153.     [Socket UTF-16]
  154. End Enum
  155.  
  156. Private Type HOSTENT
  157.     hName As Long
  158.     hAliases As Long
  159.     hAddrType As Integer
  160.     hLength As Integer
  161.     hAddrList As Long
  162. End Type
  163.  
  164. Private Type SOCKADDR_IN
  165.     Family As Integer
  166.     Port As Integer
  167.     Addr As Long
  168.     Zero(7) As Byte
  169. End Type
  170.  
  171. Private Type WNDCLASS
  172.     Style As Long
  173.     lpfnWndProc As Long
  174.     cbClsextra As Long
  175.     cbWndExtra2 As Long
  176.     hInstance As Long
  177.     hIcon As Long
  178.     hCursor As Long
  179.     hbrBackground As Long
  180.     lpszMenuName As Long
  181.     lpszClassName As Long
  182. End Type
  183.  
  184. Private Type WSAData
  185.     wVersion As Integer
  186.     wHighVersion As Integer
  187.     szDescription(256) As Byte
  188.     szSystemStatus(128) As Byte
  189.     iMaxSockets As Integer
  190.     iMaxUdpDg As Integer
  191.     lpVendorInfo As Long
  192. End Type
  193.  
  194. Private Declare Function CreateWindowExW Lib "user32" (ByVal dwExStyle As Long, ByVal lpClassName As Long, ByVal lpWindowName As Long, ByVal dwStyle As Long, ByVal X As Long, ByVal Y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hWndParent As Long, ByVal hMenu As Long, ByVal hInstance As Long, lpParam As Any) As Long
  195. Private Declare Function DefWindowProcW Lib "user32" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
  196. Private Declare Function DestroyWindow Lib "user32" (ByVal hWnd As Long) As Long
  197. Private Declare Function FindWindowW Lib "user32" (ByVal lpClassName As Long, ByVal lpWindowName As Long) As Long
  198. Private Declare Function FormatMessageW Lib "kernel32" (ByVal dwFlags As Long, lpSource As Any, ByVal dwMessageId As Long, ByVal dwLanguageId As Long, ByVal lpBuffer As Long, ByVal nSize As Long, Arguments As Long) As Long
  199. Private Declare Function GetLastError Lib "kernel32" () As Long
  200. Private Declare Function GlobalAlloc Lib "kernel32" (ByVal wFlags As Long, ByVal dwBytes As Long) As Long
  201. Private Declare Function GlobalFree Lib "kernel32" (ByVal hMem As Long) As Long
  202. Private Declare Function GlobalLock Lib "kernel32" (ByVal hMem As Long) As Long
  203. Private Declare Function GlobalUnlock Lib "kernel32" (ByVal hMem As Long) As Long
  204. Private Declare Function PostMessageW Lib "user32" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
  205. Private Declare Function RegisterClassW Lib "user32" (Class As WNDCLASS) As Long
  206. Private Declare Function SetWindowLongW Lib "user32" (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
  207. Private Declare Function UnregisterClassW Lib "user32" (ByVal lpClassName As Long, ByVal hInstance As Long) As Long
  208.  
  209. Private Declare Function lstrlenA Lib "kernel32" (ByVal lpString As Long) As Long
  210. Private Declare Function MultiByteToWideChar Lib "kernel32" (ByVal CodePage As Long, ByVal dwFlags As Long, ByVal lpMultiByteStr As Long, ByVal cchMultiByte As Long, ByVal lpWideCharStr As Long, ByVal cchWideChar As Long) As Long
  211. Private Declare Sub PutMem4 Lib "msvbvm60" (Destination As Any, Value As Any)
  212. Private Declare Sub PutMem8 Lib "msvbvm60" (Destination As Any, Value As Any)
  213. Private Declare Sub RtlMoveMemory Lib "kernel32" (Destination As Any, Source As Any, ByVal Length As Long)
  214. Private Declare Function SysAllocStringANSI Lib "oleaut32" Alias "SysAllocStringByteLen" (ByVal OleStr As Long, ByVal bLen As Long) As String
  215. Private Declare Function SysAllocStringByteLen Lib "oleaut32" (ByVal OleStr As Long, ByVal bLen As Long) As Long
  216. Private Declare Function SysAllocStringLen Lib "oleaut32" (ByVal OleStr As Long, ByVal bLen As Long) As Long
  217. Private Declare Function WideCharToMultiByte Lib "kernel32" (ByVal CodePage As Long, ByVal dwFlags As Long, ByVal lpWideCharStr As Long, ByVal cchWideChar As Long, ByVal lpMultiByteStr As Long, ByVal cchMultiByte As Long, ByVal lpDefaultChar As Long, lpUsedDefaultChar As Long) As Long
  218.  
  219. Private Declare Function SocketAccept Lib "ws2_32" Alias "accept" (ByVal S As Long, ByRef Addr As SOCKADDR_IN, ByRef AddrLen As Long) As Long
  220. Private Declare Function SocketBind Lib "ws2_32" Alias "bind" (ByVal S As Long, ByRef Name As SOCKADDR_IN, ByRef NameLen As Long) As Long
  221. Private Declare Function SocketClose Lib "ws2_32" Alias "closesocket" (ByVal S As Long) As Long
  222. Private Declare Function SocketConnect Lib "ws2_32" Alias "connect" (ByVal S As Long, ByRef Name As SOCKADDR_IN, ByVal NameLen As Long) As Long
  223. Private Declare Function SocketGetHostName Lib "ws2_32" Alias "gethostname" (ByVal Hostname As String, ByVal NameLen As Long) As Long
  224. Private Declare Function SocketGetHostByName Lib "ws2_32" Alias "gethostbyname" (ByVal Hostname As String) As Long
  225. Private Declare Function SocketGetIP Lib "ws2_32" Alias "inet_addr" (ByVal CP As String) As Long
  226. Private Declare Function SocketGetName Lib "ws2_32" Alias "getsockname" (ByVal S As Long, ByRef Name As SOCKADDR_IN, ByRef NameLen As Long) As Long
  227. Private Declare Function SocketGetNameInfo Lib "ws2_32" Alias "getnameinfo" (ByRef SA As SOCKADDR_IN, ByVal SALen As Long, ByVal Host As String, ByVal HostLen As Long, ByVal Serv As String, ByVal ServLen As Long, ByVal Flags As Long) As Long
  228. Private Declare Function SocketGetOptions Lib "ws2_32" Alias "getsockopt" (ByVal S As Long, ByVal Level As Long, ByVal OptName As Long, OptVal As Any, OptLen As Long) As Long
  229. Private Declare Function SocketGetPeerName Lib "ws2_32" Alias "getpeername" (ByVal S As Long, ByRef Name As SOCKADDR_IN, ByRef NameLen As Long) As Long
  230. Private Declare Function SockethTons Lib "ws2_32" Alias "htons" (ByVal hostshort As Integer) As Integer
  231. Private Declare Function SocketInet_nToa Lib "ws2_32" Alias "inet_ntoa" (ByVal in_addr As Long) As Long
  232. Private Declare Function SocketInit Lib "ws2_32" Alias "socket" (ByVal af As Long, ByVal s_type As Long, ByVal Protocol As Long) As Long
  233. Private Declare Function SocketIOCtl Lib "ws2_32" Alias "ioctlsocket" (ByVal S As Long, ByVal Cmd As Long, ByRef ArgP As Long) As Long
  234. Private Declare Function SocketListen Lib "ws2_32" Alias "listen" (ByVal S As Long, ByVal BackLog As Long) As Long
  235. Private Declare Function SocketnTons Lib "ws2_32" Alias "htons" (ByVal netshort As Integer) As Integer
  236. Private Declare Function SocketReceive Lib "ws2_32" Alias "recv" (ByVal S As Long, Buf As Any, ByVal BufLen As Long, ByVal Flags As Long) As Long
  237. Private Declare Function SocketReceiveFrom Lib "ws2_32" Alias "recv" (ByVal S As Long, Buf As Any, ByVal BufLen As Long, ByVal Flags As Long, ByRef FromAddr As SOCKADDR_IN, ByVal FromLen As Long) As Long
  238. Private Declare Function SocketSend Lib "ws2_32" Alias "send" (ByVal S As Long, Buf As Any, ByVal BufLen As Long, ByVal Flags As Long) As Long
  239. Private Declare Function SocketSendTo Lib "ws2_32" Alias "sendto" (ByVal S As Long, Buf As Any, ByVal BufLen As Long, ByVal Flags As Long, ByRef ToAddr As SOCKADDR_IN, ByVal ToLen As Long) As Long
  240. Private Declare Function SocketSetOptions Lib "ws2_32" Alias "setsockopt" (ByVal S As Long, ByVal Level As Long, ByVal OptName As Long, OptVal As Any, ByVal OptLen As Long) As Long
  241.  
  242. Private Declare Function WSAAsyncGetHostByName Lib "ws2_32" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal strHostName As String, Buf As Any, ByVal BufLen As Long) As Long
  243. Private Declare Function WSAAsyncSelect Lib "ws2_32" (ByVal S As Long, ByVal hWnd As Long, ByVal wMsg As Long, ByVal lEvent As Long) As Long
  244. Private Declare Function WSACancelAsyncRequest Lib "ws2_32" (ByVal hAsyncTaskHandle As Long) As Long
  245. Private Declare Function WSACleanup Lib "ws2_32" () As Long
  246. Private Declare Function WSAGetLastError Lib "ws2_32" () As Long
  247. Private Declare Function WSAStartup Lib "ws2_32" (ByVal wVersionRequired As Long, lpWSADATA As WSAData) As Long
  248.  
  249. Private Const AF_INET = &H2&
  250. Private Const FD_READ = &H1&
  251. Private Const FD_WRITE = &H2&
  252. Private Const FD_ACCEPT = &H8&
  253. Private Const FD_CONNECT = &H10&
  254. Private Const FD_CLOSE = &H20&
  255. Private Const FIONREAD = &H4004667F
  256. Private Const INADDR_NONE = -1&
  257. Private Const INVALID_SOCKET = -1&
  258. Private Const IPPROTO_TCP = 6&
  259. Private Const IPPROTO_UDP = 17&
  260. Private Const MSG_PEEK = &H2&
  261. Private Const SO_BROADCAST = &H20&
  262. Private Const SO_MAX_MSG_SIZE = &H2003&
  263. Private Const SO_RCVBUF = &H1002&
  264. Private Const SO_SNDBUF = &H1001&
  265. Private Const SOCK_DGRAM = 2&
  266. Private Const SOCK_STREAM = 1&
  267. Private Const SOCKET_ERR = -1&
  268. Private Const SOL_SOCKET = &HFFFF&
  269. Private Const SOMAXCONN = 5&
  270.  
  271. Private Const WM_USER = &H400
  272. Private Const RESOLVE_MESSAGE = WM_USER + &H400
  273. Private Const SOCKET_MESSAGE = WM_USER + &H401
  274.  
  275. Private m_AsyncHost As Long
  276. Private m_Buffer As String
  277. Private m_BufferSize As Long
  278. Private m_Class As WNDCLASS
  279. Private m_ClassName As String
  280. Private m_HostentHandle As Long
  281. Private m_HostentPointer As Long
  282. Private m_hWnd As Long
  283. Private m_Initialized As Boolean
  284. Private m_LineChange As String
  285. Private m_LocalIP As String
  286. Private m_LocalPort As Long
  287. Private m_LocalPortBind As Long
  288. Private m_Mode As UniSockMode
  289. Private m_Peek As Boolean
  290. Private m_Protocol As ProtocolConstants
  291. Private m_ReceiveSize As Long
  292. Private m_RegisterClass As Long
  293. Private m_RemoteHost As String
  294. Private m_RemoteIP As Long
  295. Private m_RemotePort As Long
  296. Private m_Request As Collection
  297. Private m_RequestBuffer As String
  298. Private m_RequestID As Long
  299. Private m_RequestSA As SOCKADDR_IN
  300. Private m_SendBuffer As String
  301. Private m_SendBufferSize As Long
  302. Private m_SendSize As Long
  303. Private m_Socket As Long
  304. Private m_State As StateConstants
  305. Private m_WSAData As WSAData
  306.  
  307. Private CRLF As String
  308. Private CR As String
  309. Private LF As String
  310. Private NULLCHAR As String
  311.  
  312. ' the following are the requirements for SelfCallback
  313. Private Declare Sub GetMem1 Lib "msvbvm60" (ByVal Addr As Long, RetVal As Byte)
  314. Private Declare Sub GetMem4 Lib "msvbvm60" (ByVal Addr As Long, RetVal As Long)
  315. Private Declare Function GetModuleHandleA Lib "kernel32" (ByVal lpModuleName As String) As Long
  316. Private Declare Function GetProcAddress Lib "kernel32" (ByVal hModule As Long, ByVal lpProcName As String) As Long
  317. Private Declare Function IsBadCodePtr Lib "kernel32" (ByVal lpfn As Long) As Long
  318. Private Declare Sub PutMem2 Lib "msvbvm60" (ByVal Addr As Long, ByVal NewVal As Integer)
  319. Private Declare Sub RtlMachineCodeCopy Lib "kernel32" Alias "RtlMoveMemory" (Destination As Long, Source As MachineCode, ByVal Length As Long)
  320. Private Declare Function VirtualAlloc Lib "kernel32" (ByVal lpAddress As Long, ByVal dwSize As Long, ByVal flAllocationType As Long, ByVal flProtect As Long) As Long
  321. Private Declare Function VirtualFree Lib "kernel32" (ByVal lpAddress As Long, ByVal dwSize As Long, ByVal dwFreeType As Long) As Long
  322.  
  323. ' self-documentation: less comments and constants
  324. Private Type MachineCode        ' 37 * 4 = 148 bytes
  325.     ' thunk
  326.     OwnerPtr As Long            ' 0
  327.     CallbackAddress As Long     ' 1
  328.     API_EbMode As Long          ' 2
  329.     API_IsBadCodePtr As Long    ' 3
  330.     API_KillTimer As Long       ' 4
  331.     ' code
  332.     MC1(5 To 5) As Long         ' 5
  333.     AllocatedDataPtr As Long    ' 6
  334.     MC2(7 To 17) As Long        ' 7 - 17
  335.     ParamCount As Long          ' 18
  336.     MC3(19 To 35) As Long       ' 19 - 35
  337.     Ordinal As Long             ' 36
  338. End Type
  339.  
  340. Public Function Accept(ByVal RequestID As Long) As Boolean
  341.     Dim clsSocket As UniSock, clsTemp As UniSock, lngBuffer As Long, udtSockAddr As SOCKADDR_IN
  342.     ' validate
  343.     If (m_State = sckClosed) And (RequestID <> 0) Then
  344.         ' ensure this RequestID is from an existing UniSock
  345.         If FindWindowW(0, StrPtr(CStr(RequestID))) Then
  346.             ' make sure socket is closed
  347.             CloseSocket
  348.             ' make a reference to the listening object
  349.             PutMem4 clsTemp, ByVal RequestID
  350.             Set clsSocket = clsTemp
  351.             PutMem4 clsTemp, ByVal 0&
  352.             ' now copy the data, get real RequestID etc.
  353.             clsSocket.Friend_Request m_hWnd, m_RequestID, m_RequestSA, m_Buffer
  354.             ' we do not need it for more than that
  355.             Set clsSocket = Nothing
  356.             ' correct some settings
  357.             m_Socket = m_RequestID
  358.             m_BufferSize = LenB(m_Buffer)
  359.             m_Protocol = sckTCPProtocol
  360.             If SocketGetOptions(m_RequestID, SOL_SOCKET, SO_RCVBUF, lngBuffer, 4) <> SOCKET_ERR Then m_ReceiveSize = lngBuffer
  361.             If SocketGetOptions(m_RequestID, SOL_SOCKET, SO_SNDBUF, lngBuffer, 4) <> SOCKET_ERR Then m_SendSize = lngBuffer
  362.             ' register messages
  363.             If WSAAsyncSelect(m_RequestID, m_hWnd, SOCKET_MESSAGE, FD_READ Or FD_WRITE Or FD_ACCEPT Or FD_CONNECT Or FD_CLOSE) = SOCKET_ERR Then
  364.                 Private_SetState sckError, "Accept", WSAGetLastError
  365.             End If
  366.             ' local information
  367.             If SocketGetName(m_RequestID, udtSockAddr, Len(udtSockAddr)) <> SOCKET_ERR Then
  368.                 m_LocalIP = CStr(udtSockAddr.Addr And &HFF&) & "." & _
  369.                     CStr((udtSockAddr.Addr And &HFF00&) \ &H100&) & "." & _
  370.                     CStr((udtSockAddr.Addr And &HFF0000) \ &H10000) & "." & _
  371.                     CStr(((udtSockAddr.Addr And &HFF000000) \ &H1000000) And &HFF&)
  372.                 m_LocalPortBind = SocketnTons(udtSockAddr.Port) And &HFFFF&
  373.             Else
  374.                 Private_SetState sckError, "Accept", WSAGetLastError
  375.             End If
  376.             ' remote information
  377.             m_RemoteHost = RequestHost
  378.             m_RemoteIP = m_RequestSA.Addr
  379.             m_RemotePort = SocketnTons(m_RequestSA.Port) And &HFFFF&
  380.             ' done!
  381.             m_RequestID = 0
  382.             m_RequestSA = udtSockAddr
  383.             ' status changes
  384.             Private_SetState sckConnected
  385.             RaiseEvent Connect
  386.             ' last but not least, data has arrived
  387.             If m_BufferSize Then Private_Message FD_READ
  388.             ' success!
  389.             Accept = True
  390.         Else
  391.             Err.Raise sckInvalidArg, "UniSock.Accept", Private_FormatWSAError(sckInvalidArg)
  392.         End If
  393.     Else
  394.         Err.Raise sckInvalidOp, "UniSock.Accept", Private_FormatWSAError(sckInvalidOp)
  395.     End If
  396. End Function
  397.  
  398. Public Function Bind(Optional ByVal LocalPort As Long, Optional LocalIP As String) As Boolean
  399.     Dim lngBuffer As Long
  400.     If m_Initialized Then
  401.         ' create socket if we do not have one
  402.         If m_Socket = INVALID_SOCKET Then
  403.             ' create socket for that protocol
  404.             If m_Protocol = sckTCPProtocol Then
  405.                 m_Socket = SocketInit(AF_INET, SOCK_STREAM, IPPROTO_TCP)
  406.                 ' if we got a socket...
  407.                 If m_Socket <> INVALID_SOCKET Then
  408.                     ' get the buffer sizes
  409.                     If SocketGetOptions(m_Socket, SOL_SOCKET, SO_RCVBUF, lngBuffer, 4) <> SOCKET_ERR Then m_ReceiveSize = lngBuffer
  410.                     If SocketGetOptions(m_Socket, SOL_SOCKET, SO_SNDBUF, lngBuffer, 4) <> SOCKET_ERR Then m_SendSize = lngBuffer
  411.                     ' register messages
  412.                     If WSAAsyncSelect(m_Socket, m_hWnd, SOCKET_MESSAGE, FD_READ Or FD_WRITE Or FD_ACCEPT Or FD_CONNECT Or FD_CLOSE) = SOCKET_ERR Then
  413.                         Private_SetState sckError, "Bind", WSAGetLastError
  414.                     End If
  415.                 End If
  416.             Else
  417.                 m_Socket = SocketInit(AF_INET, SOCK_DGRAM, IPPROTO_UDP)
  418.                 ' if we get a socket...
  419.                 If m_Socket <> INVALID_SOCKET Then
  420.                     lngBuffer = 1
  421.                     SocketSetOptions m_Socket, SOL_SOCKET, SO_BROADCAST, lngBuffer, 4
  422.                     ' get the buffer sizes
  423.                     If SocketGetOptions(m_Socket, SOL_SOCKET, SO_MAX_MSG_SIZE, lngBuffer, 4) <> SOCKET_ERR Then
  424.                         m_ReceiveSize = lngBuffer
  425.                         m_SendSize = lngBuffer
  426.                     End If
  427.                     ' register messages
  428.                     If WSAAsyncSelect(m_Socket, m_hWnd, SOCKET_MESSAGE, FD_READ Or FD_WRITE Or FD_ACCEPT Or FD_CONNECT Or FD_CLOSE) = SOCKET_ERR Then
  429.                         Private_SetState sckError, "Bind", WSAGetLastError
  430.                     End If
  431.                 End If
  432.             End If
  433.         End If
  434.         ' start binding
  435.         If m_Socket <> INVALID_SOCKET Then Bind = Private_Bind(LocalPort, LocalIP)
  436.     End If
  437. End Function
  438.  
  439. Public Function BytesReceived() As Long
  440.     If m_Protocol = sckTCPProtocol Then
  441.         BytesReceived = m_BufferSize
  442.     ElseIf m_Socket Then
  443.         SocketIOCtl m_Socket, FIONREAD, BytesReceived
  444.     End If
  445. End Function
  446.  
  447. Public Function CloseSocket() As Boolean
  448.     Dim udtSockAddr As SOCKADDR_IN
  449.     If m_State <> sckClosed Then
  450.         Private_SetState sckClosing
  451.         ' clear asynchronous process if active plus clean up the related memory
  452.         If m_AsyncHost Then WSACancelAsyncRequest m_AsyncHost: m_AsyncHost = 0
  453.         If m_HostentHandle Then GlobalFree m_HostentHandle: m_HostentHandle = 0: m_HostentPointer = 0
  454.         ' now close the socket
  455.         If m_Socket <> INVALID_SOCKET Then
  456.             CloseSocket = (SocketClose(m_Socket) <> SOCKET_ERR)
  457.             If Not CloseSocket Then
  458.                 ' something failed while closing the socket
  459.                 Private_SetState sckError, "CloseSocket", WSAGetLastError
  460.             End If
  461.         End If
  462.         ' clean up
  463.         m_Buffer = vbNullString
  464.         m_BufferSize = 0
  465.         m_LocalIP = vbNullString
  466.         m_LocalPort = 0
  467.         m_LocalPortBind = 0
  468.         Set m_Request = New Collection
  469.         m_RequestBuffer = vbNullString
  470.         m_RequestID = 0
  471.         m_RequestSA = udtSockAddr
  472.         m_SendBuffer = vbNullString
  473.         m_SendBufferSize = 0
  474.         m_Socket = INVALID_SOCKET
  475.         ' closed!
  476.         Private_SetState sckClosed
  477.     End If
  478. End Function
  479.  
  480. Public Function Connect(Optional RemoteHost As String, Optional RemotePort As Long) As Boolean
  481.     Dim lngBuffer As Long, lngIP As Long
  482.     If m_Initialized Then
  483.         ' remember given parameters
  484.         If LenB(RemoteHost) Then m_RemoteHost = RemoteHost
  485.         If RemotePort > 0 And RemotePort < 65536 Then m_RemotePort = RemotePort
  486.         ' must have remote host
  487.         If LenB(m_RemoteHost) Then
  488.             ' create socket if we do not have one
  489.             If m_Socket = INVALID_SOCKET Then
  490.                 ' create socket for that protocol
  491.                 If m_Protocol = sckTCPProtocol Then
  492.                     m_Socket = SocketInit(AF_INET, SOCK_STREAM, IPPROTO_TCP)
  493.                     ' if we got a socket...
  494.                     If m_Socket <> INVALID_SOCKET Then
  495.                         ' get the buffer sizes
  496.                         If SocketGetOptions(m_Socket, SOL_SOCKET, SO_RCVBUF, lngBuffer, 4) <> SOCKET_ERR Then m_ReceiveSize = lngBuffer
  497.                         If SocketGetOptions(m_Socket, SOL_SOCKET, SO_SNDBUF, lngBuffer, 4) <> SOCKET_ERR Then m_SendSize = lngBuffer
  498.                         ' register messages
  499.                         If WSAAsyncSelect(m_Socket, m_hWnd, SOCKET_MESSAGE, FD_READ Or FD_WRITE Or FD_ACCEPT Or FD_CONNECT Or FD_CLOSE) = SOCKET_ERR Then
  500.                             Private_SetState sckError, "Connect", WSAGetLastError
  501.                         End If
  502.                     End If
  503.                 Else
  504.                     m_Socket = SocketInit(AF_INET, SOCK_DGRAM, IPPROTO_UDP)
  505.                     ' if we get a socket...
  506.                     If m_Socket <> INVALID_SOCKET Then
  507.                         lngBuffer = 1
  508.                         SocketSetOptions m_Socket, SOL_SOCKET, SO_BROADCAST, lngBuffer, 4
  509.                         ' get the buffer sizes
  510.                         If SocketGetOptions(m_Socket, SOL_SOCKET, SO_MAX_MSG_SIZE, lngBuffer, 4) <> SOCKET_ERR Then
  511.                             m_ReceiveSize = lngBuffer
  512.                             m_SendSize = lngBuffer
  513.                         End If
  514.                         ' register messages
  515.                         If WSAAsyncSelect(m_Socket, m_hWnd, SOCKET_MESSAGE, FD_READ Or FD_WRITE Or FD_ACCEPT Or FD_CONNECT Or FD_CLOSE) = SOCKET_ERR Then
  516.                             Private_SetState sckError, "Connect", WSAGetLastError
  517.                         End If
  518.                     End If
  519.                 End If
  520.             End If
  521.             ' see if we not have a socket
  522.             If m_Socket <> INVALID_SOCKET Then
  523.                 If m_Protocol = sckTCPProtocol Then
  524.                     ' see if it is a string IP
  525.                     lngIP = SocketGetIP(m_RemoteHost)
  526.                     ' failed?
  527.                     If lngIP = INADDR_NONE Then
  528.                         ' we have to resolve the remote host...
  529.                         If m_AsyncHost Then
  530.                             ' cancel previous host query
  531.                             WSACancelAsyncRequest m_AsyncHost
  532.                             ' however, we keep using the previous memory block for HOSTENT
  533.                         Else
  534.                             ' get a new memory block
  535.                             m_HostentHandle = GlobalAlloc(0, 1024)
  536.                         End If
  537.                         If m_HostentHandle Then
  538.                             ' try to get the pointer...
  539.                             m_HostentPointer = GlobalLock(m_HostentHandle)
  540.                             If m_HostentPointer Then
  541.                                 GlobalUnlock m_HostentHandle
  542.                                 ' success, now we can resolve the host asynchronously
  543.                                 m_AsyncHost = WSAAsyncGetHostByName(m_hWnd, RESOLVE_MESSAGE, m_RemoteHost, ByVal m_HostentPointer, 1024)
  544.                                 ' success if we got that
  545.                                 Connect = m_AsyncHost <> 0
  546.                                 ' see which status we raise
  547.                                 If Connect Then
  548.                                     Private_SetState sckResolvingHost
  549.                                 Else
  550.                                     Private_SetState sckError
  551.                                 End If
  552.                             Else
  553.                                 ' failed, free it up
  554.                                 GlobalFree m_HostentHandle
  555.                                 m_HostentHandle = 0
  556.                                 Private_SetState sckError, "Connect", GetLastError, "Failed to get pointer to allocated memory."
  557.                             End If
  558.                         Else
  559.                             ' we failed to get memory for the asynchronous process
  560.                             Private_SetState sckError, "Connect", GetLastError, "Could not allocate memory for asynchronous process."
  561.                         End If
  562.                     Else
  563.                         ' we got a valid IP, try to connect!
  564.                         Connect = ConnectIP(lngIP)
  565.                     End If
  566.                 Else
  567.                     ' UDP is a connectionless protocol
  568.                     Connect = Private_Bind
  569.                 End If
  570.             Else
  571.                 ' could not create socket
  572.                 Private_SetState sckError, "Connect", WSAGetLastError
  573.             End If
  574.         Else
  575.             ' cannot start connection thanks to invalid settings
  576.             Private_SetState sckError, "Connect"
  577.         End If
  578.     Else
  579.         ' we do not even have all the requirements!
  580.         Private_SetState sckError, "Connect"
  581.     End If
  582. End Function
  583.  
  584. Private Function ConnectIP(ByVal RemoteIP As Long) As Boolean
  585.     Dim lngError As Long, udtSockAddr As SOCKADDR_IN
  586.     If m_Initialized Then
  587.         ' validate port
  588.         If m_Socket <> INVALID_SOCKET And m_RemotePort > 0 And m_RemotePort < 65536 Then
  589.             Private_SetState sckConnecting
  590.             ' remember IP
  591.             m_RemoteIP = RemoteIP
  592.             With udtSockAddr
  593.                 .Addr = RemoteIP
  594.                 .Family = AF_INET
  595.                 .Port = SockethTons(m_RemotePort And &HFFFF)
  596.             End With
  597.             ' connect!
  598.             ConnectIP = (SocketConnect(m_Socket, udtSockAddr, Len(udtSockAddr)) <> SOCKET_ERR)
  599.             If Not ConnectIP Then
  600.                 lngError = WSAGetLastError
  601.                 ' ignore "resource not available"
  602.                 If lngError <> sckWouldBlock Then
  603.                     ' then imitate Winsock control
  604.                     If lngError = sckAddressNotAvailable Then
  605.                         Err.Raise lngError, "UniSock.ConnectIP", Private_FormatWSAError(lngError)
  606.                     Else
  607.                         Private_SetState sckError, "ConnectIP", lngError
  608.                     End If
  609.                 Else
  610.                     ' and thus we succeed
  611.                     ConnectIP = True
  612.                 End If
  613.             End If
  614.         Else
  615.             Private_SetState sckError, "ConnectIP"
  616.         End If
  617.     Else
  618.         ' we do not even have all the requirements!
  619.         Private_SetState sckError, "ConnectIP"
  620.     End If
  621. End Function
  622.  
  623. Friend Sub Friend_Request(ByVal hWnd As Long, RequestID As Long, SA As SOCKADDR_IN, Buffer As String)
  624.     Dim udtSockAddr As SOCKADDR_IN
  625.     If m_RequestID Then
  626.         ' remember hWnd
  627.         On Error Resume Next: m_Request.Add hWnd, CStr(m_RequestID): On Error GoTo 0
  628.         ' copy there
  629.         RequestID = m_RequestID
  630.         SA = m_RequestSA
  631.         Buffer = m_RequestBuffer
  632.         ' clear here
  633.         m_RequestID = 0
  634.         m_RequestSA = udtSockAddr
  635.         m_RequestBuffer = vbNullString
  636.     End If
  637. End Sub
  638.  
  639. Public Function GetData(Data, Optional VarType As VbVarType = vbByte Or vbArray, Optional ByVal MaxLen As Long) As Boolean
  640.     Dim blnArray() As Boolean, bytArray() As Byte, curArray() As Currency, dtmArray() As Date, dblArray() As Double, intArray() As Integer, lngArray() As Long, sngArray() As Single
  641.     Dim blnData As Boolean, bytData As Byte, curData As Currency, dtmData As Date, dblData As Double, intData As Integer, lngData As Long, sngData As Single, strData As String
  642.     Dim lngFlags As Long, lngLen As Long, lngPtr As Long, udtSockAddr As SOCKADDR_IN
  643.     ' which datatype to use?
  644.     If VBA.VarType(Data) <> vbEmpty Then VarType = VBA.VarType(Data)
  645.     ' which protocol we are using?
  646.     If (m_Protocol = sckTCPProtocol) And (m_State = sckConnected) And (m_Mode = [Socket Binary Mode]) Then
  647.         ' how much data to get?
  648.         If MaxLen < 1 Then
  649.             MaxLen = m_BufferSize
  650.         ElseIf MaxLen > m_BufferSize Then
  651.             MaxLen = m_BufferSize
  652.         End If
  653.         ' see if we get data at all
  654.         If MaxLen Then
  655.             ' now decide what to do
  656.             If VarType And vbArray Then
  657.                 Select Case (VarType And Not vbArray)
  658.                     Case vbBoolean
  659.                         ReDim blnArray((MaxLen - 1) \ 2)
  660.                         RtlMoveMemory blnArray(0), ByVal StrPtr(m_Buffer), MaxLen
  661.                         Data = blnArray
  662.                         GetData = True
  663.                     Case vbByte
  664.                         bytArray = LeftB$(m_Buffer, MaxLen)
  665.                         Data = bytArray
  666.                         GetData = True
  667.                     Case vbCurrency
  668.                         ReDim curArray((MaxLen - 1) \ 8)
  669.                         RtlMoveMemory curArray(0), ByVal StrPtr(m_Buffer), MaxLen
  670.                         Data = curArray
  671.                         GetData = True
  672.                     Case vbDate
  673.                         ReDim dtmArray((MaxLen - 1) \ 8)
  674.                         RtlMoveMemory dtmArray(0), ByVal StrPtr(m_Buffer), MaxLen
  675.                         Data = dtmArray
  676.                         GetData = True
  677.                     Case vbDouble
  678.                         ReDim dblArray((MaxLen - 1) \ 8)
  679.                         RtlMoveMemory dblArray(0), ByVal StrPtr(m_Buffer), MaxLen
  680.                         Data = dblArray
  681.                         GetData = True
  682.                     Case vbInteger
  683.                         ReDim intArray((MaxLen - 1) \ 2)
  684.                         RtlMoveMemory intArray(0), ByVal StrPtr(m_Buffer), MaxLen
  685.                         Data = intArray
  686.                         GetData = True
  687.                     Case vbLong
  688.                         ReDim lngArray((MaxLen - 1) \ 4)
  689.                         RtlMoveMemory lngArray(0), ByVal StrPtr(m_Buffer), MaxLen
  690.                         Data = lngArray
  691.                         GetData = True
  692.                     Case vbSingle
  693.                         ReDim sngArray((MaxLen - 1) \ 4)
  694.                         RtlMoveMemory sngArray(0), ByVal StrPtr(m_Buffer), MaxLen
  695.                         Data = sngArray
  696.                         GetData = True
  697.                     Case vbString
  698.                         strData = StrConv(LeftB$(m_Buffer, MaxLen), vbUnicode)
  699.                         ' we make a string array simply by looking for line changes
  700.                         If InStr(strData, vbNewLine) Then
  701.                             Data = Split(strData, vbNewLine)
  702.                         ElseIf InStr(strData, vbLf) Then
  703.                             Data = Split(strData, vbLf)
  704.                         ElseIf InStr(strData, vbCr) Then
  705.                             Data = Split(strData, vbCr)
  706.                         Else
  707.                             Data = Split(strData, vbNullChar)
  708.                         End If
  709.                         GetData = True
  710.                     Case Else
  711.                         Err.Raise sckUnsupported, "UniSock.GetData", Private_FormatWSAError(sckUnsupported)
  712.                 End Select
  713.             Else
  714.                 Select Case VarType
  715.                     Case vbBoolean
  716.                         If MaxLen > 2 Then MaxLen = 2
  717.                         RtlMoveMemory blnData, ByVal StrPtr(m_Buffer), MaxLen
  718.                         GetData = True
  719.                     Case vbByte
  720.                         MaxLen = 1
  721.                         RtlMoveMemory bytData, ByVal StrPtr(m_Buffer), MaxLen
  722.                         GetData = True
  723.                     Case vbCurrency
  724.                         If MaxLen > 8 Then MaxLen = 8
  725.                         RtlMoveMemory curData, ByVal StrPtr(m_Buffer), MaxLen
  726.                         GetData = True
  727.                     Case vbDate
  728.                         If MaxLen > 8 Then MaxLen = 8
  729.                         RtlMoveMemory dtmData, ByVal StrPtr(m_Buffer), MaxLen
  730.                         GetData = True
  731.                     Case vbDouble
  732.                         If MaxLen > 8 Then MaxLen = 8
  733.                         RtlMoveMemory dblData, ByVal StrPtr(m_Buffer), MaxLen
  734.                         GetData = True
  735.                     Case vbInteger
  736.                         If MaxLen > 2 Then MaxLen = 2
  737.                         RtlMoveMemory intData, ByVal StrPtr(m_Buffer), MaxLen
  738.                         GetData = True
  739.                     Case vbLong
  740.                         If MaxLen > 4 Then MaxLen = 4
  741.                         RtlMoveMemory lngData, ByVal StrPtr(m_Buffer), MaxLen
  742.                         GetData = True
  743.                     Case vbSingle
  744.                         If MaxLen > 4 Then MaxLen = 4
  745.                         RtlMoveMemory sngData, ByVal StrPtr(m_Buffer), MaxLen
  746.                         GetData = True
  747.                     Case vbString
  748.                         Data = StrConv(LeftB$(m_Buffer, MaxLen), vbUnicode)
  749.                         GetData = True
  750.                     Case Else
  751.                         Err.Raise sckUnsupported, "UniSock.GetData", Private_FormatWSAError(sckUnsupported)
  752.                 End Select
  753.             End If
  754.             ' if we got the data and if not in peek mode...
  755.             If GetData And Not m_Peek Then
  756.                 ' remove the data we got from the buffer
  757.                 m_Buffer = MidB$(m_Buffer, MaxLen + 1)
  758.                 m_BufferSize = m_BufferSize - MaxLen
  759.             End If
  760.         End If
  761.     ElseIf (m_Protocol = sckUDPProtocol) And (m_State = sckOpen) Then
  762.         ' peek mode?
  763.         If m_Peek Then lngFlags = MSG_PEEK
  764.         ' how much data to get?
  765.         SocketIOCtl m_Socket, FIONREAD, lngLen
  766.         If MaxLen < 1 Then
  767.             MaxLen = lngLen
  768.         ElseIf MaxLen > lngLen Then
  769.             MaxLen = lngLen
  770.         End If
  771.         ' see if we get data at all
  772.         If MaxLen Then
  773.             ' now decide what to do
  774.             If VarType And vbArray Then
  775.                 Select Case (VarType And Not vbArray)
  776.                     Case vbBoolean
  777.                         ReDim blnArray((MaxLen - 1) \ 2)
  778.                         GetData = (SocketReceiveFrom(m_Socket, blnArray(0), MaxLen, lngFlags, udtSockAddr, Len(udtSockAddr)) <> SOCKET_ERR)
  779.                         If GetData Then
  780.                             Data = blnArray
  781.                         Else
  782.                             Private_SetState sckError, "GetData", WSAGetLastError
  783.                         End If
  784.                     Case vbByte
  785.                         ReDim bytArray(MaxLen - 1)
  786.                         GetData = (SocketReceiveFrom(m_Socket, bytArray(0), MaxLen, lngFlags, udtSockAddr, Len(udtSockAddr)) <> SOCKET_ERR)
  787.                         If GetData Then
  788.                             Data = bytArray
  789.                         Else
  790.                             Private_SetState sckError, "GetData", WSAGetLastError
  791.                         End If
  792.                     Case vbCurrency
  793.                         ReDim curArray((MaxLen - 1) \ 8)
  794.                         GetData = (SocketReceiveFrom(m_Socket, curArray(0), MaxLen, lngFlags, udtSockAddr, Len(udtSockAddr)) <> SOCKET_ERR)
  795.                         If GetData Then
  796.                             Data = curArray
  797.                         Else
  798.                             Private_SetState sckError, "GetData", WSAGetLastError
  799.                         End If
  800.                     Case vbDate
  801.                         ReDim dtmArray((MaxLen - 1) \ 8)
  802.                         GetData = (SocketReceiveFrom(m_Socket, dtmArray(0), MaxLen, lngFlags, udtSockAddr, Len(udtSockAddr)) <> SOCKET_ERR)
  803.                         If GetData Then
  804.                             Data = dtmArray
  805.                         Else
  806.                             Private_SetState sckError, "GetData", WSAGetLastError
  807.                         End If
  808.                     Case vbDouble
  809.                         ReDim dblArray((MaxLen - 1) \ 8)
  810.                         GetData = (SocketReceiveFrom(m_Socket, dblArray(0), MaxLen, lngFlags, udtSockAddr, Len(udtSockAddr)) <> SOCKET_ERR)
  811.                         If GetData Then
  812.                             Data = dblArray
  813.                         Else
  814.                             Private_SetState sckError, "GetData", WSAGetLastError
  815.                         End If
  816.                     Case vbInteger
  817.                         ReDim intArray((MaxLen - 1) \ 2)
  818.                         GetData = (SocketReceiveFrom(m_Socket, intArray(0), MaxLen, lngFlags, udtSockAddr, Len(udtSockAddr)) <> SOCKET_ERR)
  819.                         If GetData Then
  820.                             Data = intArray
  821.                         Else
  822.                             Private_SetState sckError, "GetData", WSAGetLastError
  823.                         End If
  824.                     Case vbLong
  825.                         ReDim lngArray((MaxLen - 1) \ 4)
  826.                         GetData = (SocketReceiveFrom(m_Socket, lngArray(0), MaxLen, lngFlags, udtSockAddr, Len(udtSockAddr)) <> SOCKET_ERR)
  827.                         If GetData Then
  828.                             Data = lngArray
  829.                         Else
  830.                             Private_SetState sckError, "GetData", WSAGetLastError
  831.                         End If
  832.                     Case vbSingle
  833.                         ReDim sngArray((MaxLen - 1) \ 4)
  834.                         GetData = (SocketReceiveFrom(m_Socket, sngArray(0), MaxLen, lngFlags, udtSockAddr, Len(udtSockAddr)) <> SOCKET_ERR)
  835.                         If GetData Then
  836.                             Data = sngArray
  837.                         Else
  838.                             Private_SetState sckError, "GetData", WSAGetLastError
  839.                         End If
  840.                     Case vbString
  841.                         lngPtr = SysAllocStringByteLen(0, MaxLen)
  842.                         PutMem4 ByVal VarPtr(strData), ByVal lngPtr
  843.                         GetData = (SocketReceiveFrom(m_Socket, ByVal lngPtr, MaxLen, lngFlags, udtSockAddr, Len(udtSockAddr)) <> SOCKET_ERR)
  844.                         If GetData Then
  845.                             ' we make a string array simply by looking for line changes
  846.                             If InStrB(strData, CRLF) Then
  847.                                 Data = Split(StrConv(strData, vbUnicode), vbNewLine)
  848.                             ElseIf InStrB(strData, LF) Then
  849.                                 Data = Split(StrConv(strData, vbUnicode), vbLf)
  850.                             ElseIf InStrB(strData, CR) Then
  851.                                 Data = Split(StrConv(strData, vbUnicode), vbCr)
  852.                             Else
  853.                                 Data = Split(StrConv(strData, vbUnicode), vbNullChar)
  854.                             End If
  855.                         Else
  856.                             Private_SetState sckError, "GetData", WSAGetLastError
  857.                         End If
  858.                     Case Else
  859.                         Err.Raise sckUnsupported, "UniSock.GetData", Private_FormatWSAError(sckUnsupported)
  860.                 End Select
  861.             Else
  862.                 Select Case VarType
  863.                     Case vbBoolean
  864.                         If MaxLen > 2 Then MaxLen = 2
  865.                         GetData = (SocketReceiveFrom(m_Socket, blnData, MaxLen, lngFlags, udtSockAddr, Len(udtSockAddr)) <> SOCKET_ERR)
  866.                         If GetData Then
  867.                             Data = blnData
  868.                         Else
  869.                             Private_SetState sckError, "GetData", WSAGetLastError
  870.                         End If
  871.                     Case vbByte
  872.                         MaxLen = 1
  873.                         GetData = (SocketReceiveFrom(m_Socket, bytData, MaxLen, lngFlags, udtSockAddr, Len(udtSockAddr)) <> SOCKET_ERR)
  874.                         If GetData Then
  875.                             Data = bytData
  876.                         Else
  877.                             Private_SetState sckError, "GetData", WSAGetLastError
  878.                         End If
  879.                     Case vbCurrency
  880.                         If MaxLen > 8 Then MaxLen = 8
  881.                         GetData = (SocketReceiveFrom(m_Socket, curData, MaxLen, lngFlags, udtSockAddr, Len(udtSockAddr)) <> SOCKET_ERR)
  882.                         If GetData Then
  883.                             Data = curData
  884.                         Else
  885.                             Private_SetState sckError, "GetData", WSAGetLastError
  886.                         End If
  887.                     Case vbDate
  888.                         If MaxLen > 8 Then MaxLen = 8
  889.                         GetData = (SocketReceiveFrom(m_Socket, dtmData, MaxLen, lngFlags, udtSockAddr, Len(udtSockAddr)) <> SOCKET_ERR)
  890.                         If GetData Then
  891.                             Data = dtmData
  892.                         Else
  893.                             Private_SetState sckError, "GetData", WSAGetLastError
  894.                         End If
  895.                     Case vbDouble
  896.                         If MaxLen > 8 Then MaxLen = 8
  897.                         GetData = (SocketReceiveFrom(m_Socket, dblData, MaxLen, lngFlags, udtSockAddr, Len(udtSockAddr)) <> SOCKET_ERR)
  898.                         If GetData Then
  899.                             Data = dblData
  900.                         Else
  901.                             Private_SetState sckError, "GetData", WSAGetLastError
  902.                         End If
  903.                     Case vbInteger
  904.                         If MaxLen > 2 Then MaxLen = 2
  905.                         GetData = (SocketReceiveFrom(m_Socket, intData, MaxLen, lngFlags, udtSockAddr, Len(udtSockAddr)) <> SOCKET_ERR)
  906.                         If GetData Then
  907.                             Data = intData
  908.                         Else
  909.                             Private_SetState sckError, "GetData", WSAGetLastError
  910.                         End If
  911.                     Case vbLong
  912.                         If MaxLen > 4 Then MaxLen = 4
  913.                         GetData = (SocketReceiveFrom(m_Socket, lngData, MaxLen, lngFlags, udtSockAddr, Len(udtSockAddr)) <> SOCKET_ERR)
  914.                         If GetData Then
  915.                             Data = lngData
  916.                         Else
  917.                             Private_SetState sckError, "GetData", WSAGetLastError
  918.                         End If
  919.                     Case vbSingle
  920.                         If MaxLen > 4 Then MaxLen = 4
  921.                         GetData = (SocketReceiveFrom(m_Socket, sngData, MaxLen, lngFlags, udtSockAddr, Len(udtSockAddr)) <> SOCKET_ERR)
  922.                         If GetData Then
  923.                             Data = sngData
  924.                         Else
  925.                             Private_SetState sckError, "GetData", WSAGetLastError
  926.                         End If
  927.                     Case vbString
  928.                         lngPtr = SysAllocStringByteLen(0, MaxLen)
  929.                         PutMem4 ByVal VarPtr(strData), ByVal lngPtr
  930.                         GetData = (SocketReceiveFrom(m_Socket, ByVal lngPtr, MaxLen, lngFlags, udtSockAddr, Len(udtSockAddr)) <> SOCKET_ERR)
  931.                         If GetData Then
  932.                             Data = StrConv(strData, vbUnicode)
  933.                         Else
  934.                             Private_SetState sckError, "GetData", WSAGetLastError
  935.                         End If
  936.                     Case Else
  937.                         Err.Raise sckUnsupported, "UniSock.GetData", Private_FormatWSAError(sckUnsupported)
  938.                 End Select
  939.             End If
  940.         End If
  941.     Else
  942.         Err.Raise sckBadState, "UniSock.GetData", Private_FormatWSAError(sckBadState)
  943.     End If
  944. End Function
  945.  
  946. Public Property Get LineChange() As UniSockLineChange
  947.     If LenB(m_LineChange) = 4 Then
  948.         LineChange = [Socket CRLF]
  949.     ElseIf m_LineChange = vbLf Then
  950.         LineChange = [Socket LF]
  951.     ElseIf m_LineChange = vbCr Then
  952.         LineChange = [Socket CR]
  953.     Else
  954.         LineChange = [Socket Null]
  955.     End If
  956. End Property
  957.  
  958. Public Property Let LineChange(ByVal NewValue As UniSockLineChange)
  959.     Select Case NewValue
  960.         Case [Socket CRLF]
  961.             m_LineChange = vbNewLine
  962.         Case [Socket LF]
  963.             m_LineChange = vbLf
  964.         Case [Socket CR]
  965.             m_LineChange = vbCr
  966.         Case [Socket Null]
  967.             m_LineChange = vbNullChar
  968.         Case Else
  969.             Err.Raise sckInvalidArg, "UniSock.LineChange", Private_FormatWSAError(sckInvalidArg)
  970.     End Select
  971. End Property
  972.  
  973. Public Function Listen() As Boolean
  974.     Dim lngError As Long
  975.     If (m_State = sckClosed) Or (m_State = sckOpen) Then
  976.         ' first we must bind
  977.         If Bind Then
  978.             ' try to start listening
  979.             Listen = (SocketListen(m_Socket, SOMAXCONN) <> SOCKET_ERR)
  980.             If Not Listen Then
  981.                 ' failed
  982.                 lngError = WSAGetLastError
  983.                 Err.Raise lngError, "UniSock.Listen", Private_FormatWSAError(lngError)
  984.             End If
  985.         End If
  986.     Else
  987.         Err.Raise sckInvalidOp, "UniSock.Listen", Private_FormatWSAError(sckInvalidOp)
  988.     End If
  989. End Function
  990.  
  991. Public Function LocalHostname() As String
  992.     LocalHostname = Private_LocalHostName
  993. End Function
  994.  
  995. Public Function LocalIP() As String
  996.     Dim lngLocalIP As Long
  997.     If (m_State = sckOpen) Or (m_State = sckListening) Then
  998.         LocalIP = m_LocalIP
  999.     Else
  1000.         lngLocalIP = Private_LocalIP
  1001.         LocalIP = CStr(lngLocalIP And &HFF&) & "." & _
  1002.             CStr((lngLocalIP And &HFF00&) \ &H100&) & "." & _
  1003.             CStr((lngLocalIP And &HFF0000) \ &H10000) & "." & _
  1004.             CStr(((lngLocalIP And &HFF000000) \ &H1000000) And &HFF&)
  1005.     End If
  1006. End Function
  1007.  
  1008. Public Property Get LocalPort() As Long
  1009.     If m_LocalPortBind = 0 Then
  1010.         LocalPort = m_LocalPort
  1011.     Else
  1012.         LocalPort = m_LocalPortBind
  1013.     End If
  1014. End Property
  1015.  
  1016. Public Property Let LocalPort(ByVal NewValue As Long)
  1017.     If m_State = sckClosed Then
  1018.         If NewValue >= 0 And NewValue < 65536 Then
  1019.             m_LocalPort = NewValue
  1020.         Else
  1021.             Err.Raise sckInvalidArg, "UniSock.LocalPort", Private_FormatWSAError(sckInvalidArg)
  1022.         End If
  1023.     Else
  1024.         Err.Raise sckInvalidOp, "UniSock.LocalPort", Private_FormatWSAError(sckInvalidOp)
  1025.     End If
  1026. End Property
  1027.  
  1028. Public Property Get Mode() As UniSockMode
  1029.     Mode = m_Mode
  1030. End Property
  1031.  
  1032. Public Property Let Mode(ByVal NewValue As UniSockMode)
  1033.     m_Mode = NewValue
  1034. End Property
  1035.  
  1036. Public Function PeekData(Data, Optional VarType As VbVarType, Optional ByVal MaxLen As Long) As Boolean
  1037.     m_Peek = True
  1038.     PeekData = GetData(Data, VarType, MaxLen)
  1039.     m_Peek = False
  1040. End Function
  1041.  
  1042. Private Function Private_Bind(Optional ByVal LocalPort As Long, Optional LocalIP As String) As Boolean
  1043.     Dim lngLocalPort As Long, lngLocalIP As String, strIP As String, udtSockAddr As SOCKADDR_IN
  1044.     ' first of all check if we have bind already
  1045.     Private_Bind = (m_State = sckOpen)
  1046.     ' and if we have not...
  1047.     If (Not Private_Bind) And (m_Socket <> INVALID_SOCKET) Then
  1048.         ' determine local port to use
  1049.         If LocalPort > 0 And LocalPort < 65536 Then
  1050.             lngLocalPort = LocalPort
  1051.         Else
  1052.             lngLocalPort = m_LocalPort
  1053.         End If
  1054.         ' determine local ip
  1055.         lngLocalIP = Private_LocalIP(LocalIP)
  1056.         ' make a string too
  1057.         strIP = CStr(lngLocalIP And &HFF&) & "." & _
  1058.             CStr((lngLocalIP And &HFF00&) \ &H100&) & "." & _
  1059.             CStr((lngLocalIP And &HFF0000) \ &H10000) & "." & _
  1060.             CStr(((lngLocalIP And &HFF000000) \ &H1000000) And &HFF&)
  1061.         ' fill the structure for bind
  1062.         With udtSockAddr
  1063.             .Addr = lngLocalIP
  1064.             .Family = AF_INET
  1065.             .Port = SocketnTons(lngLocalPort And &HFFFF)
  1066.         End With
  1067.         ' bind it
  1068.         Private_Bind = (SocketBind(m_Socket, udtSockAddr, Len(udtSockAddr)) <> SOCKET_ERR)
  1069.         If Private_Bind Then
  1070.             ' remember IP
  1071.             m_LocalIP = strIP
  1072.             ' see if we had valid port
  1073.             If lngLocalPort Then
  1074.                 m_LocalPort = lngLocalPort
  1075.                 Private_SetState sckOpen
  1076.             Else
  1077.                 ' get the local port
  1078.                 lngLocalPort = Private_LocalPort
  1079.                 If lngLocalPort <> SOCKET_ERR Then
  1080.                     m_LocalPortBind = lngLocalPort
  1081.                 Else
  1082.                     Private_SetState sckError, "Private_Bind", WSAGetLastError
  1083.                 End If
  1084.             End If
  1085.         Else
  1086.             Private_SetState sckError, "Private_Bind", WSAGetLastError
  1087.         End If
  1088.     End If
  1089. End Function
  1090.  
  1091. Private Function Private_FormatError(ByVal Number As Long) As String
  1092.     Dim lngResult As Long, lngStrPtr As Long, strError As String
  1093.     If Number Then
  1094.         ' initialize the buffer
  1095.         lngStrPtr = SysAllocStringLen(0, 65535)
  1096.         PutMem4 ByVal VarPtr(strError), ByVal lngStrPtr
  1097.         ' get the error message
  1098.         lngResult = FormatMessageW(&H1000&, ByVal 0&, Number, 0, lngStrPtr, 65536, ByVal 0&)
  1099.         ' if we got a string, place it in the string
  1100.         If lngResult Then PutMem4 ByVal VarPtr(Private_FormatError), ByVal SysAllocStringLen(lngStrPtr, lngResult)
  1101.     End If
  1102. End Function
  1103.  
  1104. Private Function Private_FormatWSAError(ByVal Number As Long) As String
  1105.     Select Case Number
  1106.         ' WSA_INVALID_HANDLE
  1107.         Case 6
  1108.             Private_FormatWSAError = "Specified event object handle is invalid."
  1109.         ' WSA_NOT_ENOUGH_MEMORY
  1110.         Case 8
  1111.             Private_FormatWSAError = "Insufficient memory available."
  1112.         ' WSA_INVALID_PARAMETER
  1113.         Case 87
  1114.             Private_FormatWSAError = "One or more parameters are invalid."
  1115.         ' WSA_OPERATION_ABORTED
  1116.         Case 995
  1117.             Private_FormatWSAError = "Overlapped operation aborted."
  1118.         ' WSA_IO_INCOMPLETE
  1119.         Case 996
  1120.             Private_FormatWSAError = "Overlapped I/O event object not in signaled state."
  1121.         ' WSA_IO_PENDING
  1122.         Case 997
  1123.             Private_FormatWSAError = "Overlapped operations will complete later."
  1124.         ' WSAEINTR
  1125.         Case 10004
  1126.             Private_FormatWSAError = "Interrupted function call."
  1127.         ' WSAEBADF
  1128.         Case 10009
  1129.             Private_FormatWSAError = "File handle is not valid."
  1130.         ' WSAEACCES
  1131.         Case 10013
  1132.             Private_FormatWSAError = "Permission denied."
  1133.         ' WSAEFAULT
  1134.         Case 10014
  1135.             Private_FormatWSAError = "Bad address."
  1136.         ' WSAEINVAL
  1137.         Case 10022
  1138.             Private_FormatWSAError = "Invalid argument."
  1139.         ' WSAEMFILE
  1140.         Case 10024
  1141.             Private_FormatWSAError = "Too many open files."
  1142.         ' WSAEWOULDBLOCK
  1143.         Case 10035
  1144.             Private_FormatWSAError = "Resource temporarily unavailable."
  1145.         ' WSAEINPROGRESS
  1146.         Case 10036
  1147.             Private_FormatWSAError = "Operation now in progress."
  1148.         ' WSAEALREADY
  1149.         Case 10037
  1150.             Private_FormatWSAError = "Operation already in progress."
  1151.         ' WSAENOTSOCK
  1152.         Case 10038
  1153.             Private_FormatWSAError = "Socket operation on nonsocket."
  1154.         ' WSAEDESTADDRREQ
  1155.         Case 10039
  1156.             Private_FormatWSAError = "Destination address required."
  1157.         ' WSAEMSGSIZE
  1158.         Case 10040
  1159.             Private_FormatWSAError = "Message too long."
  1160.         ' WSAEPROTOTYPE
  1161.         Case 10041
  1162.             Private_FormatWSAError = "Protocol wrong type for socket."
  1163.         ' WSAENOPROTOOPT
  1164.         Case 10042
  1165.             Private_FormatWSAError = "Bad protocol option."
  1166.         ' WSAEPROTONOSUPPORT
  1167.         Case 10043
  1168.             Private_FormatWSAError = "Protocol not supported."
  1169.         ' WSAESOCKTNOSUPPORT
  1170.         Case 10044
  1171.             Private_FormatWSAError = "Socket type not supported."
  1172.         ' WSAEOPNOTSUPP
  1173.         Case 10045
  1174.             Private_FormatWSAError = "Operation not supported."
  1175.         ' WSAEPFNOSUPPORT
  1176.         Case 10046
  1177.             Private_FormatWSAError = "Protocol family not supported."
  1178.         ' WSAEAFNOSUPPORT
  1179.         Case 10047
  1180.             Private_FormatWSAError = "Address family not supported by protocol family."
  1181.         ' WSAEADDRINUSE
  1182.         Case 10048
  1183.             Private_FormatWSAError = "Address already in use."
  1184.         ' WSAEADDRNOTAVAIL
  1185.         Case 10049
  1186.             Private_FormatWSAError = "Cannot assign requested address."
  1187.         ' WSAENETDOWN
  1188.         Case 10050
  1189.             Private_FormatWSAError = "Network is down."
  1190.         ' WSAENETUNREACH
  1191.         Case 10051
  1192.             Private_FormatWSAError = "Network is unreachable."
  1193.         ' WSAENETRESET
  1194.         Case 10052
  1195.             Private_FormatWSAError = "Network dropped connection on reset."
  1196.         ' WSAECONNABORTED
  1197.         Case 10053
  1198.             Private_FormatWSAError = "Software caused connection abort."
  1199.         ' WSAECONNRESET
  1200.         Case 10054
  1201.             Private_FormatWSAError = "Connection reset by peer."
  1202.         ' WSAENOBUFS
  1203.         Case 10055
  1204.             Private_FormatWSAError = "No buffer space available."
  1205.         ' WSAEISCONN
  1206.         Case 10056
  1207.             Private_FormatWSAError = "Socket is already connected."
  1208.         ' WSAENOTCONN
  1209.         Case 10057
  1210.             Private_FormatWSAError = "Socket is not connected."
  1211.         ' WSAESHUTDOWN
  1212.         Case 10058
  1213.             Private_FormatWSAError = "Cannot send after socket shutdown."
  1214.         ' WSAETOOMANYREFS
  1215.         Case 10059
  1216.             Private_FormatWSAError = "Too many references."
  1217.         ' WSAETIMEDOUT
  1218.         Case 10060
  1219.             Private_FormatWSAError = "Connection timed out."
  1220.         ' WSAECONNREFUSED
  1221.         Case 10061
  1222.             Private_FormatWSAError = "Connection refused."
  1223.         ' WSAELOOP
  1224.         Case 10062
  1225.             Private_FormatWSAError = "Cannot translate name."
  1226.         ' WSAENAMETOOLONG
  1227.         Case 10063
  1228.             Private_FormatWSAError = "Name too long."
  1229.         ' WSAEHOSTDOWN
  1230.         Case 10064
  1231.             Private_FormatWSAError = "Host is down."
  1232.         ' WSAEHOSTUNREACH
  1233.         Case 10065
  1234.             Private_FormatWSAError = "No route to host."
  1235.         ' WSAENOTEMPTY
  1236.         Case 10066
  1237.             Private_FormatWSAError = "Directory not empty."
  1238.         ' WSAEPROCLIM
  1239.         Case 10067
  1240.             Private_FormatWSAError = "Too many processes."
  1241.         ' WSAEUSERS
  1242.         Case 10068
  1243.             Private_FormatWSAError = "User quota exceeded."
  1244.         ' WSAEDQUOT
  1245.         Case 10069
  1246.             Private_FormatWSAError = "Disk quota exceeded."
  1247.         ' WSAESTALE
  1248.         Case 10070
  1249.             Private_FormatWSAError = "Stale file handle reference."
  1250.         ' WSAEREMOTE
  1251.         Case 10071
  1252.             Private_FormatWSAError = "Item is remote."
  1253.         ' WSASYSNOTREADY
  1254.         Case 10091
  1255.             Private_FormatWSAError = "Network subsystem is unavailable."
  1256.         ' WSAVERNOTSUPPORTED
  1257.         Case 10092
  1258.             Private_FormatWSAError = "Winsock.dll version out of range."
  1259.         ' WSANOTINITIALISED
  1260.         Case 10093
  1261.             Private_FormatWSAError = "Successful WSAStartup not yet performed."
  1262.         ' WSAEDISCON
  1263.         Case 10101
  1264.             Private_FormatWSAError = "Graceful shutdown in progress."
  1265.         ' WSAENOMORE
  1266.         Case 10102
  1267.             Private_FormatWSAError = "No more results."
  1268.         ' WSAECANCELLED
  1269.         Case 10103
  1270.             Private_FormatWSAError = "Call has been canceled."
  1271.         ' WSAEINVALIDPROCTABLE
  1272.         Case 10104
  1273.             Private_FormatWSAError = "Procedure call table is invalid."
  1274.         ' WSAEINVALIDPROVIDER
  1275.         Case 10105
  1276.             Private_FormatWSAError = "Service provider is invalid."
  1277.         ' WSAEPROVIDERFAILEDINIT
  1278.         Case 10106
  1279.             Private_FormatWSAError = "Service provider failed to initialize."
  1280.         ' WSASYSCALLFAILURE
  1281.         Case 10107
  1282.             Private_FormatWSAError = "System call failure."
  1283.         ' WSASERVICE_NOT_FOUND
  1284.         Case 10108
  1285.             Private_FormatWSAError = "Service not found."
  1286.         ' WSATYPE_NOT_FOUND
  1287.         Case 10109
  1288.             Private_FormatWSAError = "Class type not found."
  1289.         ' WSA_E_NO_MORE
  1290.         Case 10110
  1291.             Private_FormatWSAError = "No more results."
  1292.         ' WSA_E_CANCELLED
  1293.         Case 10111
  1294.             Private_FormatWSAError = "Call was canceled."
  1295.         ' WSAEREFUSED
  1296.         Case 10112
  1297.             Private_FormatWSAError = "Database query was refused."
  1298.         ' WSAHOST_NOT_FOUND
  1299.         Case 11001
  1300.             Private_FormatWSAError = "Host not found."
  1301.         ' WSATRY_AGAIN
  1302.         Case 11002
  1303.             Private_FormatWSAError = "Nonauthoritative host not found."
  1304.         ' WSANO_RECOVERY
  1305.         Case 11003
  1306.             Private_FormatWSAError = "This is a nonrecoverable error."
  1307.         ' WSANO_DATA
  1308.         Case 11004
  1309.             Private_FormatWSAError = "Valid name, no data record of requested type."
  1310.         ' WSA_QOS_RECEIVERS
  1311.         Case 11005
  1312.             Private_FormatWSAError = "QOS receivers."
  1313.         ' WSA_QOS_SENDERS
  1314.         Case 11006
  1315.             Private_FormatWSAError = "QOS senders."
  1316.         ' WSA_QOS_NO_SENDERS
  1317.         Case 11007
  1318.             Private_FormatWSAError = "No QOS senders."
  1319.         ' WSA_QOS_NO_RECEIVERS
  1320.         Case 11008
  1321.             Private_FormatWSAError = "QOS no receivers."
  1322.         ' WSA_QOS_REQUEST_CONFIRMED
  1323.         Case 11009
  1324.             Private_FormatWSAError = "QOS request confirmed."
  1325.         ' WSA_QOS_ADMISSION_FAILURE
  1326.         Case 11010
  1327.             Private_FormatWSAError = "QOS admission error."
  1328.         ' WSA_QOS_POLICY_FAILURE
  1329.         Case 11011
  1330.             Private_FormatWSAError = "QOS policy failure."
  1331.         ' WSA_QOS_BAD_STYLE
  1332.         Case 11012
  1333.             Private_FormatWSAError = "QOS bad style."
  1334.         ' WSA_QOS_BAD_OBJECT
  1335.         Case 11013
  1336.             Private_FormatWSAError = "QOS bad object."
  1337.         ' WSA_QOS_TRAFFIC_CTRL_ERROR
  1338.         Case 11014
  1339.             Private_FormatWSAError = "QOS traffic control error."
  1340.         ' WSA_QOS_GENERIC_ERROR
  1341.         Case 11015
  1342.             Private_FormatWSAError = "QOS generic error."
  1343.         ' WSA_QOS_ESERVICETYPE
  1344.         Case 11016
  1345.             Private_FormatWSAError = "QOS service type error."
  1346.         ' WSA_QOS_EFLOWSPEC
  1347.         Case 11017
  1348.             Private_FormatWSAError = "QOS flowspec error."
  1349.         ' WSA_QOS_EPROVSPECBUF
  1350.         Case 11018
  1351.             Private_FormatWSAError = "Invalid QOS provider buffer."
  1352.         ' WSA_QOS_EFILTERSTYLE
  1353.         Case 11019
  1354.             Private_FormatWSAError = "Invalid QOS filter style."
  1355.         ' WSA_QOS_EFILTERTYPE
  1356.         Case 11020
  1357.             Private_FormatWSAError = "Invalid QOS filter type."
  1358.         ' WSA_QOS_EFILTERCOUNT
  1359.         Case 11021
  1360.             Private_FormatWSAError = "Incorrect QOS filter count."
  1361.         ' WSA_QOS_EOBJLENGTH
  1362.         Case 11022
  1363.             Private_FormatWSAError = "Invalid QOS object length."
  1364.         ' WSA_QOS_EFLOWCOUNT
  1365.         Case 11023
  1366.             Private_FormatWSAError = "Incorrect QOS flow count."
  1367.         ' WSA_QOS_EUNKOWNPSOBJ
  1368.         Case 11024
  1369.             Private_FormatWSAError = "Unrecognized QOS object."
  1370.         ' WSA_QOS_EPOLICYOBJ
  1371.         Case 11025
  1372.             Private_FormatWSAError = "Invalid QOS policy object."
  1373.         ' WSA_QOS_EFLOWDESC
  1374.         Case 11026
  1375.             Private_FormatWSAError = "Invalid QOS flow descriptor."
  1376.         ' WSA_QOS_EPSFLOWSPEC
  1377.         Case 11027
  1378.             Private_FormatWSAError = "Invalid QOS provider-specific flowspec."
  1379.         ' WSA_QOS_EPSFILTERSPEC
  1380.         Case 11028
  1381.             Private_FormatWSAError = "Invalid QOS provider-specific filterspec."
  1382.         ' WSA_QOS_ESDMODEOBJ
  1383.         Case 11029
  1384.             Private_FormatWSAError = "Invalid QOS shape discard mode object."
  1385.         ' WSA_QOS_ESHAPERATEOBJ
  1386.         Case 11030
  1387.             Private_FormatWSAError = "Invalid QOS shaping rate object."
  1388.         ' WSA_QOS_RESERVED_PETYPE
  1389.         Case 11031
  1390.             Private_FormatWSAError = "Reserved policy QOS element type."
  1391.         Case sckBadState
  1392.             Private_FormatWSAError = "Wrong protocol or connection state for the requested transaction or request."
  1393.         Case sckGetNotSupported
  1394.             Private_FormatWSAError = "Property is write-Ba."
  1395.         'AIr."
  1396.         Case sckGetNotSupported
  1397.             Private_Forror = "In sckEp10069
  1398.             Private_FormatWSAError = "Disk quota exceeded."
  1399.         ' WSAESTALE
  1400.         Case 10070
  1401.             Private_FormatWSAError = "Stale file handle reference."
  1402.         ' WSAEREMOTE
  1403.         Case 10071
  1404.  requestedn
  1405.  
  1406. Public0"
  1407.        Private_FormatWSAError = "Disk quota exM   Case 10070
  1408.             Privatfile lEOBJ
  1409.  bUnicode)
  1410.                        OS shaping rate object."ce quota exM  OWSA_NOT_ENOUGH_MEMORY
  1411.       P300000000000000000000000000000000000000000tr(((ect."
  1412.      w        h         ssate_FormatWSAError = NCase sckGetNotSupportedowspec error."
  1413.         'T   ' O     Case 11005
  1414.             Pevate_Forwspec erropef_ocal ip
  1415.         lngLoi     Privat  Case 11005
  1416.             Pevate_Forwspec erropef_ocal ip
  1417.         lngLoi     Privat  Case 11005
  1418.             Pevate_Forwspec erropef_ocal ip
  1419.         lngLoi     Privat  Case 11005
  1420.       ratu lngLLLLLLLLLLLLcalwspec erropef_ocaw erropr And &pef_oca
  1421. End Functi, MaxLen)
  1422.   10071
  1423.  requestedn
  1424.  
  1425. Public0"
  1426.        Privablic Property Get LineChange() As Uni    OS 2              <O8or(sckUn yyoublic0"
  1427.        Privablic Propertpec erropef_ocal ip
  1428.     matWSAError = "Disk quota exceeded."
  1429.    t L(unctioI ct Case VarTy erropef_ocalec erro071
  1430.  requesor request."
  1431.      atError(ByVal Number As Long) As String
  1432.  0, Pp"Vali           Private_FowlU   End With
  1433.     ' WSAENOTase 11031 005)
  1434.     c Proi0062
  1435.             Private_Foh
  1436.  equesr)iiiiiiiiiiiiiiiii sngArray
  1437.   I                 oortea        PrivaLLLLLLLLLLLLcalwspec erropef_ocaw erropr And &pef_oca
  1438. End Functi, MaxLen)
  1439.   10071
  1440.  requestedn
  1441.  
  1442. Public0"
  1443.        Privablic Property Get LineChange() As Uni    OS 2              <O8o  PrivaLLLLLLLLLLLLc"ock.LocalPort", Private_FoU
  1444.      erropef      Caf&) 000000000trPort > 0 And Local 000trPort p#iblicW      CStr((lngLocalIP And &HFF00&) \ &H10 Caf&) 0000oLLLLI If
  1445.     SCaf&L000000000000000esults."
  1446.  irPtre00esultsO connnnnnnnnnnnnnnnnnnnnnnnnnn dtmAerminwij SCaf0000peciic0"
  1447.        Privablic Propetpec erropef_oca     iic0"
  1448.        Privablic Prop ip
  1449.    AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA    ' WS     Privablic Prop ip
  1450.    AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA    ' WS     Privablic Prop ip
  1451.    AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA    ' WS     Privablic Prop ip
  1452.    AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA    ' WS     Privablic Prop ip
  1453.    AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA     Privab)_FOUND
  1454.         Carropef_oca  2    g protoc3Private   ' WSAENOTSOCK
  1455.         Case 10038
  1456.             PrivatwPrivate )_FOUND
  1457.         Carrop  'APERATEOBJc3Private   ' WSAENOTSOCK
  1458.          CaseNOT_?R AENPrivate      WSAENOTSOCK
  1459.         CaetData Then
  1460.                               t== (Epped operation u_FOUNRIAe,perationr    ' WSA_QOS_NO_RECEIVERS
  1461.         Case 11008
  1462.             Pr Case=APE   P'APE   Privvvvvvvvvvvvvvvvvr)iiiiiiiiii7UAAAAAAAAAAa23
  1463.              "
  1464.         'AIr. Case 11007owlU   End WBalwspec erropa23 End a   Carrop  'APmatWSAErroAror = "DisONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN Car23 EnAAA     Privab)_FOUND
  1465.         Carropef_oca  2    g protoc3PrPriopr A          Pr     eratiRND
  1466.    "R        oortea  r23 EnAAA  erved policy QOS eaNNNCeAAAAAAAAAAA     Privab)_FOmPrived policy QOS eaNNNCeAAAAAAAData 8     i4 e       ' WSAEACCES
  1467.         Case 10013
  1468.             Private_FormatWSAError = "Permission denied."
  1469.         ' WSAEFAULT
  1470.         Case 10014
  1471.             Private_FormatWSAError = "Bad address."
  1472.   EEEEEEETooooooooooooooooSAGetLastError
  1473.    Case 1L(,                     te_SetState sckError, "GetDaOEFILTERTYPatWSAError = "Be 100End   m_LocalPortBin m_Peek ThCase 10070
  1474.          fD_PET   ' WSAEACCESad polinnectioe not supported."r."
  1475.         ' WSA_QOS_Etring
  1476.                         lngPtr =)                     Case vbDring
  1477.                         lngPtr =)                     Case vbDring
  1478.                         lngPtr =)                     Case vbDring
  1479.                         lngPtr =)                     Case vbDring
  1480.                         lngPtr =)               _FormatWSAEr70
  1481.   v                 ((((kr =)                    vab)_FOmPre 11026
  1482.    i23 EnAAA  erv    ElseIf MaxLen > lngLen Then
  1483.  S filting
  1484.     )_FOmPre 1108QOS eaNNNCeAAAAAAmati04vse    ElseYPE
  1485. 4ess."
  1486.         ' WSnvalid QOS provider-specific flotrPort p#iblicWError = " connnnnnnnnnnnnnnnnnnnnnnnnnn dtmAerminQsnw2H   ElseIf  ' WSAENOBUFS
  1487.         Case 10055
  1488.  _ERR)
  1489.                         If GetData Tho                Case vbDring
  1490.  o      Case vbDring
  1491.           RLF]
  1492.     Elsebiiiiii 70
  1493.             Private0055
  1494. vate_SetSt     e vbDrier-specialPort = F   w        h          Private0055
  1495. vate_SetSt     e vbDrieDisk qu netData Th          Private", WSAGetor = "E          
  1496.   h    ER
  1497.         Case=ier-special9 =) (         Private0055
  1498. vate_SetSt     ebwLo      Case StSockAddr)) <        o WSAECONvbDrlseIf MaxLen > lngLen Then
  1499.  S filting
  1500.     )_FOmPre 1108QOS eaNNNCeAAAAAAmati04vse    ElseYPE
  1501. 4ess."
  1502.         ' WSnvalid QOS provider-specific flotrPort p#ibmen RAAAAAAAAAAAAAAAAA    ' WS     Privabli       Cnnnnnnnnnnnnnnnnnn  ' WSAC  If GetData Tho  ie(ByVal Number As Long) As String
  1503.     SelerYYYYYYYYYCTw  Case sckGetNotr   CmdPrivate_FormatWSAError(lngError)
  1504.             End If
  1505.         End vting)AError = "Too many open files."
  1506.         ' WSAEWOULDBLOCK
  1507.         Case 10035
  1508.             Private_FormatWSAError = "Resource temporarily unavaiovider-specific filterspec."
  1509.         ' WSA_QOS_ESDMODEOBJ
  1510.         Case 11029
  1511.             Private_:nge(fTcaw erroproviooption."
  1512.         ' WSAEPROTONOSUPPORT
  1513.         Case 10043
  1514.             Private_FormatWSAError = "Protocol not suppoOivate_FormatWSetSt     e vbSAER   ElsebiAError = "Resou35
  1515.   open files."
  1516.         ' WSAEWOULDr045
  1517.             Private_F = "Resou35
  1518.   od,op= vbCr
  1519.         Case [Socket NEi
  1520.         Case  Mode =Ke  ' WSTYPatWSAE   Caso_FormatWSAEr700  Private_F =&St  f "Resou35ase 10054
  1521.  IAAAAAAAA    ' WS p       yVal Number As Long) As oPrivae(fTcaw ervate_For [Socket NEi
  1522.       XEACH
  1523.      ay
  1524.                         Elsef_oca     iic0"
  1525.                    y Then
  1526.                 Select Case (VarTs [S  ' xivatP' xivatP' xivatP' xiva0oNQOS_ESDMODEOBJP resey Get LocalPort() As Long
  1527.     If mRAnd Local 000trPort p#iblicW      CStr((lngLocalIP And &HFF00&) \ &ct CaslPortB0    ' WS   6
  1528.          F00&) \ &ct Ccc xivatP' xivysAllvate_For [Socket NEi
  1529.       XEACH
  1530.      ay
  1531.                      fooooooooooooooooSAGet      ET_ERR)
  1532.        S.MaxLe2rtB0    ' WS  uS oPrivae(fTcaw eO       Case 10111
  1533.   Cargument."oror = "Operation now in progress."
  1534.  cD'xivatP' xivysA     Case 10047y object."
  1535.         ' WuivysA     CgPtr =) e 10FFIC_CTRL_ERROR
  1536.      Urivablic PrPrivaRR)
  1537.    ed cadWSA_QOS_ESDMODEOBJ
  1538.         Case 11029
  1539. ribbbbbbbbbbbbbbbbbbbbbP0t performedLFuS oPrivae(fTcaw eO       CicWErOPA of allc29
  1540. rsl_mMBW&HFF00&) \ &H10    Case 1() As Long
  1541.   rbbP0t performed    0t performedLFuS oPrivae(fTcaw eO  =B0      ' WSA_QOS_ESsste_Forror = "In sckEp1005
  1542.             Privatr = "In sc(fTcaw eO  =coPrivalpcaw e3  Err.Raise lngError, "U_ESsste_Forror = "In sckEp1005
  1543.             erropedtSockAdddilicropedpiiiiiiiiiiii1.atWSAError = "Cannot translate name."
  1544.  vf
  1545. End                    Private_FormatWSAError = Private_FormatWSAError = Private_FormESO   Private_FormatWSAError = Pr_RECOVERYr allc29
  1546. rsl_mM iic0"
  1547.        Privab88vate_FormatWSAError =  AAlPort", Private_FoU
  1548.      erropef  =)        sAError         Privae_Fo0U
  1549.      erropef  OtWSA1' WSA_QOS_NO_RECEIVErr
  1550.     SA_QOS_RESERVED_P     ' WSA_QOS_ESsstLLLcalwspec erropef_ocaw erropr And &pef_Car2 AAlPort", PriI96
  1551.         atWSAError = "QOS generic err
  1552.    rPoIrro        Andi
  1553. End            ' WSA_QO ((((kr =_QOS_Enr     atWSAError =vatAEr        'T   ' OiRPrivab88vxLe2rtB0    ' WS  uS oPrivae(fTcaw eO    i0    iIsssssssss WS  uS oPrmber As Lc Pr'' OiRPrivab88vxLe2rtB0    ' WS  uS oPrivae(fTcaw eO    i0    iIsssssssss WS  uSi       Cnnnror         PrivaeLc PWLr)) <> S0Ctr = "In sc(fTcawg  Cnnnror         PrivaeLc PWssss WS  uSi       Cnc i0&now iCtr = "In s' rPoIrro        Andi
  1554. End      1' WSA_QOS_NO_RECEnow iCtr = "In s' xm     ' Oi uSi       Cnc     XEACH
  1555.      ay
  1556.   erYYYYYYYYYCe() AFecialDatSAER  d &Hrror, "GetTc in progress.or =sp      sAError         Privae_Fo0U
  1557.     tsr        'T   ' O  S.MaxLe2rtB0    ' WS  uS oPrivae(fTcaLr_RECOVERYr allc29tAEr        'T   ' OiRPrivab88vxLe2rsssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssCnnotr = "In sckEp1005
  1558. 5CSockAddr, Len(udtSockAddr)) <> SOCKET_ERR)
  1559.                         If GetData ooooooSAReceiveFrom(m_Socket, dtm8  Case vbDring
  1560.           RLF]
  1561.  pef  OtW
  1562.        Hdtm8  Casperation now in progress."
  1563.  cD''''''eiveFrom(m_sssssssssssssssssssssssss   Carr &Hrro   Ca S.MaxLe2rtB0 Ca S.MaxLe2rtB0 Ca S.MaxLe2rtB0 Ca S.Mif GetD AAlPort", Private_FoU
  1564.      erropef  =)  ssssssssss   Carr &Hrro   Ca S.MaxLe2rtB0 Ca S.MaxLe2rtB0 CaitSAER  d &Hrrord        axLoaRMif GetD AAlPort", Private_FoU
  1565.      erropeYPE
  1566. 4ess."  ' WSAENOTSOCK
  1567.         C= "Address already in use0trPort pf GetD AAlPort", Private_FoU
  1568.      erropefl7tWSAEAgsddress already in use0trnEAgsddress alre         e_Forlng
  1569.     ' OiRPrivab88vxL AAlnd000) & "." & _
  1570.             CStr(((lngLocalIP And &HFF000000) \ &H1000000) And &HFF&)
  1571.         ' fill the structure for bs al      drop7     EndERY
  1572.        
  1573.  o      C1000000) And &HFF&A flowAPort",h000)      Privae_Fo0U
  1574.     tsr        'T   ' O l ssssssd    flowAPortansaction orIllc29
  1575. rsl_mMBW&HFF00&) \ &H10    Case 1() As Long
  1576.   rbbP0t pecti     'T   ' O"Ti== "Nonauthor7svP' xiiiiiiiiiiiiD        foooooooooSA_QOErsl_mae_Fo0U
  1577.     tsr        'T   ' O l ssssssd    flowAPortansactiesult = 5g
  1578.  ab88vxL AHFF00&) \ &HoaRMif GetD AAlPort", Private_FoU
  1579.                  bICval9(e8dSrmay         Private_Form ii7UA genericfata ooooD        foif2i:ange a
  1580.         oooSAReceiveFrolG<Ve As OiRPrivU=r a
  1581.         ooo
  1582.    lter style."
  1583.         ' WSA_QOS_E      ' WSA_QOS_E      ' Wg
  1584.   rbbP0t pecti     'T   ' O+ styfooooo Case vb     Prie flowAPor9 =) (   dda
  1585.         Else
  1586.      PORT
  1587.         Case 1raEiTo   0e_Fo, i0   )oU
  1588. flowAPor9 =) ablicmore rLe2rssssssssssssss       i fooi   AlowAPor9 ISEE    PrivatiR
  1589.         Case 11014
  1590.            orIllc29tD AAlPort",      fooooosh.LocalIP An0LocalIP An0LocalI   CaserMtWSAErroreAlowAPor9 ISvate_FoU     E          bICval9(e8dSrmay      YYYYYYYYYCTw  C         "
  1591.         ' WSA_QOS_TRAFFIC_CTRL       Else
  1592.      PORT        bILLLLcalwR  g   ' Wg
  1593.   rfnSAErrorssss    t   Pevate_Forwspec err&rorsCStr(((lngLocalIP And &HFF000000=) lPortp00000=) lPortp000A_QOS_E      ' Wg
  1594.   rbbP0t ppppppppppppppppppppppphp    Cnc      10111YYY   ' fill thm     ') <> SOCKET_ERR)
  1595.             cific 7WBalwspec e    10111YYY   ' fill thm     ') <>  '         cif cific 7WBalwsp'     End If
  1596.         e ') <> SOCKET_ERRti     'T   _mM iiiiiiiiiiiigormatWSAEr700  PrM iiiib7y=" cific 7WBalwspec b7y=" cific 7WBalwspec b7y=" wAPortansacties' WSA_QOS_TRAFFIC_C)
  1597.             End If
  1598.         End Ift pecti     way      YYYYYYYYYAsu 4 ' n If
  1599.         End Ift pecti     way    (e8dSrma" cifit< N  ' WSA).LineChan11005
  1600.    FoU
  1601.      erropefl7tWSAEAgsddData", WSERR)
  1602.             cific ase 10043
  1603.             Private_FormatWSAError = "Protocol not s FoU0047y object."
  1604.  Etring
  1605.                         lnging
  1606.  0, Pp"1bP0t pppppppppppppppppppngData,   00000
  1607.     WSERR)
  1608. epeAAAAAAAAte_FormatWSAErr    f0t pppppivatergData,   00000
  1609.     WSERR)
  1610. epeAAAAAAAAte_Foro4k   i0    iIsssssssss "Protocola,   000iveFrom(m_Socket, curData, MaxLen, :) <> STf    DatafAAAAAte_rivae(fTcaw eOss "f STf AAAAA  MaxLen, :) <> STf    DatafAAAAAWBalwsp'     End If
  1611.  b88vxL AHFF00&) \ &HoaRMifivate           oaRMifivate    rorcmily = AF_INET
  1612.             .Port = 
  1613.  b88vxL AHA).LineChan11005
  1614.    FoU
  1615.      erropefl7tWSAEAgsddData", WSERR)
  1616.             cific ase 10043
  1617.             Private_FormatWSAError = "Protocol not0iveddData", Wppefl7tkOpenC = 5g
  1618.  ab     E Ca S.MaxLeeeeeeeeeeeee:]fiR), WSEction reset by peer."or = "Procedure call table is invalid."
  1619. 7Data", WSERR)
  1620.     rorcmily = AF_INET
  1621.             .Port = 
  1622.  b88vxL AHA).LineChan11005
  1623.    FoU
  1624.      erropefl7tWSAEAgsddData", WSERR)
  1625.             cific ase 10043
  1626.             Priva            cific ase 10043t       cific ase Wsm_Socket, cutype."
  1627.         ' WSA__________________nnnnnnnn dtmAerminQsnw2H   ElseIf  ' WD fS                 cific ase Wsm_Socket, c    Case 11013
  1628.                        a", Wpp_Forific ase 100rmatWSAErrP     ____EdCval9(e8dSrmay      YYYYYYYYYCTWsm_SWSAESTALE
  1629.        Dg    arP     ___ PriaWSERR)   Case 10044
  1630.     013
  1631.                        a", Wpp_Forific ase 100rmatW
  1632.             CStr(((lngLocaData, MaxL=", Wpp_F    bICval9(e8dSrmay       a", Wpic asARAMETERI        RECEIVErr
  1633.     AAAA
  1634.           oe_FormatWSWse    rorcmilywij SCaf0000peciic0"e8ddState)
  1635. atwPrivky Gewspec b7y=R)
  1636.             cif OS 2              <O8or(sckUn yyoublic0"L      foif2i:ange a
  1637.           ') <>  '     dp0iveddData", Wppefl7tkOpen'   'ocke   ge a
  1638.           ') <>  '     dp  =)  ssssssssss   Carr &Hrro   Ca S.MaxLe2rtB0 Ca S.MaxLe2rtB0 CaitSAER  d &HAo 'ocke   ge a
  1639.       O   <O8or(scf OS 2         AHAO8or(scf     ' WSnvalid 8vxLia              0lace nnnnn AEN Wpic asARAMEB0 Ca S      a", Wpi a", ' WD fS                 cific a       ssss   a              0lace nnnn)p     cific a       ssss    fS        fWse  cifit   W      CSts fS                 cific a    Re
  1640.         If LocalPort > 0 And Localdwspec b7y=R)H 10009
  1641.                C     O   <O8or(scf OS 2       S  ' WSnvalid 8vxLia              0lace nnnnn AEN Wpic asARAMEB0 Ca S      a", Wpi a", ' WD fS                 cific a       r1lc29ance "Call wa   r1ror peciSEirrivU=r a
  1642.         ooo
  1643.    lnce EB0 Ca S      a", Wpir8r = "Lro   Ca S.MaxLe2rtB0Data(e8dSrBdSrmay       a", valid."
  1644.         ' WSAEINVALIDPROVIDER
  1645.         Case 10105
  1646.    c asAALIDPROVIDER
  1647.      PIet, cO$r(lngmatWnfse 11019
  1648.             Private_FoDud       .Port = SocketnTons(le 10105
  1649.    c asAALIDPROVIDER
  1650.   L  ciuoF33333333s                     OSifit   W1Vro   Ca S.Ma  W1VrretnTons(le 10105
  1651.    c asAALIDPROE             eciSEirrivU=r a
  1652.         ooo
  1653.    lnce EB0 Ca S      a", Wpir8r = "Lro   Ca S.MaxLe2rtB0Data(e8dSrBdSrmay       a", valid."
  1654.         ' WSAEINVALIDPROVIDER
  1655.         Case 10105
  1656.    c asAALIDPRO  c asAA"
  1657.       sCAeineCS.MaxLssssssssssssssssss,5
  1658.    DPRO    Case      ir8r = "Lro   Ca   ir  PrirStr(((lngLocaO  c asAA"ate           oaRM  Case vbDA_OPERATION_ABORTED
  1659.         Case 995
  1660.  rbbP0t performed    0t perN Wpic asA Cas=INVALIDPROVIDER
  1661. alIP An0LocalIP An0LocalI   CaserMtWSAErroreAlowAPor9 ISvate_FoU     E        rN Wpic asA Cas=INVALIDPROVIDER
  1662. alIP An0LocalIP An0LocalI   CaserMtWSAErroreAlowAPor9 ISvate_FoU     E        rN Wpic asA Cas=INVALIDPROVPa", WpiiiiiinalIP    Private_FormatWSAError = "Destination addr      Else
  1663.     asAALIMif GetD AAlPoin4ssse_FoU
  1664.      erropef  =)        sAErro   Else
  1665.  OS_EG    PeekDats     a", valid."
  1666.           t== (Epped ope1Pi a", ' WD fS        VIDERr = "Invalid oivate_       VIDERr = "Invalid oivapetpec error = "Incorr     rirSf LocalPort > 0 Anas=INVAOneChan11005
  1667.    FoU
  1668.      erropefl7tWSAro   Ca ta(e8dSrBdSrid oivapeCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC10111
  1669.  CCCCCC oaa         cie 11008
  1670.         Case 1101
  1671.    c ascie 1CCCCCCCCCCCy   c asAALIDPROVIDER
  1672.     CCCCCCCCCCCCC+CCCCCCCCCCCCCCCCCCCCCCCC         ECCCCCCCCCCCCCCCCCCCCCCCCCCr = "CCCy   c aspck.GetData   cieR
  1673.     s
  1674.       sCAeineCS.0005
  1675.    Dopef_oca     iic0"
  1676.       r    ng
  1677.       f       teOREMOTE
  1678.         Case 10071
  1679.  r     e    10111YYY   ' fill thm  An uS oPrYror = "    Case 10071
  1680.  r   O
  1681.         Case 10071
  1682.  r  ormatD      f   Mse 10071
  1683.  r  ormatD      f   Mse 100&HFV1
  1684.  r)i"InwPriCif2i:ange a
  1685.         ooose 10071
  1686.     ooose 10071111tkOpenC = 5g
  1687.  ab     E Ca S.MaxLeeeeeeeee     End If
  1688.             End If
  1689.  d0h0C = 5g
  1690.  ab     E Ca S.Man(lngSsi:ang  cif OS 2       OREMOTE
  1691.                                                        CCCCCCCCCCCCC7= "Invalid oivate_       VID_FormatWSAError = "Connection timed outsAAlPort", Private_FoU
  1692.      erropeYPCCCCCCCCCCCCr = "CCCyS= "Incor   Privvvvvvvvvvvvvvvvvr)iiiAUINVALIDAd oivate_   PeekDats    *CCCCCCCCr = wWmU
  1693.      *CCCCCCCCr = wWmU
  1694.      *CCCh    U1007TIflowAPorCCr = CCCCC7= "Invalid o  L  Invali    PriebSW
  1695.     013-CDo, ' WD fS  GeCCCr = M
  1696.         Case sckGetNotSupruH   erVAOneChan11> <O8B 7WBalwspeckr =_QOS_Enr     atWSAError =vatAEr   71
  1697.     ooos  013-CDo, ' WD fS ' WSnvalid 8hckInvalidArg,
  1698.  IAAAAAA        rmatWSAError = Private_FormESO   PWSAError(lngError)
  1699.  f       teOtInvali     ' WSANO_RECOVERY
  1700.         Case 11003
  1701.       ruoF33333333s     Lli   tocoSaction orIllc29
  1702. rsl_mMBW&HFF00&) \\\\\\\\\\\\\\\\\\\\\\\\\\    r)
  1703.  f   P orIllc2     'T   ' O+ styfooooo CaEnd If
  1704.         e ') <> SOCKEError = "DestinaSorIllc2     'T   '  tocoSaction orIllc29
  1705. rsl_mMBW&HFF00&) \\\\\\\\\\\\\\\\\\\\\\\\\\    r) o fD_PET   port
  1706.      ' WSASYSedtmAion orIllc29
  1707. rsl_mMBW&HFF00&3    Fd0rIllc29
  1708. rsl_SOCKrIllc29
  1709. rsl_S fS  f    Case sckkkkkkkk        PrivaeLc PWLrA                VIDkkkkkkkkSYS'       e ') <> SOCKEErl_SOCKr(le 1a=lic Pr N Wpic asSw                ' WSASYSedtmAion orIllc29
  1710. rsfa", WSERR)
  1711. kSYS'       e ') <>iorIllc29
  1712.  5
  1713.       lV\\\\\\\\ac29
  1714.  5YS'       e ') <>iorIllc29
  1715.  5
  1716.       lV\Gcific ase
  1717.     )    eOCKr(le 1a=lio Privat ') <> SOCKEEion orIllc29otWSig,
  1718.  IAAAAAA      End IfIllc29
  1719.  5
  1720.       lBlN  *CCBe resoBLEr   7Oo  Case 995
  1721.  rbbP0t perform     lBlLEr   7Oo  Case 995
  1722.  rbbpef      Caf&) 0000000CCr = wWmfr)NOTSOCK
  1723.   (EvalidrlHgErre_FormESO   PWSAError(lngELocaO  f   Mse 100&HFV1
  1724.  'pe 11019    rt
  1725.      ' sllc2)NOTS     E
  1726.              te_    14Be resoBLEr   7Oo  CAError(lngELocaO  f   Mse 100&HFV1
  1727.  'Ert pfK Case Rrvice type  foif2i:ange a
  1728.  ormatD      f   Mse CaMI An0LocalIP An0LocalI  ng  ooos  013      e ') <>iorIllc29
  1729.  5
  1730.       lV\Gcific ase
  1731.   hE     e ') <>iorIlt p
  1732.     ' WSAENOTase 11031 005)
  1733.  n)     lV\GcificaiPrivvvvv1   lV\GcificaiPri  asAALIMif GetD AAlPoin4ssse_FoU
  1734.      erropef  =)        sAErro   Else
  1735.  OS_EG  *CCCCCCCCr = wWmU
  1736.      *CCCCCCCCr =sse_FoU
  1737.      e     D 1a=lielI  ng  oo =)        Ca c=)   ,iiinalIP    Private_FormatWSAError = "Destination addr95
  1738.  rbbP0t performed    0t perN Wpi            Priv
  1739.     Wpi            Priv
  1740.     Wpi      "Des8hckInvasnmU
  1741.     Son addr95
  1742.  rbbP
  1743.  OS_EG  *CCCCCCCCr = wWmSaOocalIP An0LocalI     lowAPor9 =) ablicmor          ific FormESO YYY    
  1744.   aswWmSa   Wpi   ,   (FO,0ckInvasnmU
  1745.     Son addr95
  1746.  rbbP
  1747.  OS_EG  *CCCCCCCCr = wWmSaOocalIP An0LocalI     lowAPor9 =) ablicmor          ific FormESO YYY    
  1748.          Private_C    With r)NOTSOCK
  1749.             ific FormESO YYY  Private      WSAENOTS     ifiPicmor          ific FormESO YYY    
  1750.  OermatWSAError = "QO0  ifiPicmor         addr9D AAleO YYY    
  1751.  OermatSe
  1752.   IhBlLEr   7O     Private_FormatWSAError = "QOS no ilI     lowAPor9 =) ablicmor          ific FormESO YYY    
  1753.          Private_C    With r)NOTSOCK
  1754.             ific FormESO YYY  Private      WSAENOTS     ifiPicmor r&) 000000  Prrivat Pri _DATlc2AerN Wpi   c cificWmfr _DATlc2AerNrlsssss>fs10105
  1755.    c asAALIDPROVIDER
  1756.   L  ciuoF33333333s          rmatSe
  1757.   IhCa S.MaxLe2rtB0Daa Son AAAAAAAAAAAAAAAA   CCCCCrror = Priva   
  1758.          Private_C    Ri:CfS        AErr
  1759.             cific 7WBalwspeceA =) (         Private0055
  1760. vate_SetSt     
  1761. vate_      ' WSAEUSERS
  1762.    ' WSAEUSER,C   ific 7WBalwsIu ciuoF33333R&A   e ') <>iorIlt p
  1763.  ific 7WBalwsIu ciuoF33333R&A   e ') <>ioreYYY    nC,
  1764.          o
  1765.    lnce EB0 Ca S   YormESO Yesor request."5
  1766.  rbbP
  1767.  ivate_FormatWSAError = "SaOocalIP An0LocalI     lo"QOS no ilI     lowAPor9 =) ablicmor  
  1768.  ivate_FormatWSAError = "SaOocalIP An0LocTmfr _DATlc2AeSe reference."
  1769.        P00000ise 1raEi
  1770.  ineChe(le 1a=llllllllllllly' Priva   
  1771.          Private_C    Ri:CfS        AErr
  1772.             cific 7WBalwspeceA =)         <O8or(sckUn svate) (         Privat     ci Els  
  1773.         Dific 7WBa     <O8oA <>  '     dp0iveddData", Wppefl70_RECEnow iCtr =  c=)   ,iiinalIP    Private_FormatWUn n so005)
  1774.  n)     lV\GcificaiPrivvvvv1   lV\GcificaiPri  asAALIMif GetD AAlPoin4ssse_FoU
  1775.      erropef  =)        sAErro   Else
  1776.  OS_EG  *CCCCCCCCr = wWmU
  1777.      *CCCCCCCCr =sse_FoU
  1778.  uiE1
  1779.  r  oVngLocalPorcalIP An0    C=)  Re_Format     EnRU
  1780.      *CCCCCCCCr =sse_FoU
  1781.  uiE1
  1782.  r lIP e 10r =ssCEnow i7WBalwsIu cxu FormESO YYY    
  1783.          Pri?no ilI     lowAPor9 =) ablicmor          ific FormESO YYY <0sSO YYY <0sSO YYY Y    Case 10071
  1784.  request
  1785.          cxu FormESO YYY    
  1786.          Pri?no ilI     lowAPor9 =) lAAAAmati04vse    ElseYPE
  1787. 4ess."
  1788.    A =)        <O8or(sckUn svate)YYY        pecialPocmor       ,uiM     Flial9 =) (   04vse    Elsor(sckUn svate)YYY        pecialPocmor       ,uiM     Flial9 =) (   04vse    b1objectnauthorrrrrd_FoU
  1789.      er       pecialPok= "SaOocalIP An0LocTmfr _DATlc2AeSe reference."
  1790.        P00000ise 1raEi
  1791.  ineChe(le 1a=llllllllllllly' PrilPorcalIP erNrps'tnLe2r IhCa S.MaxLe2rtB0Daa Son AAAAAAAAAAAAAAAAAAAA n)     lVdressaa S
  1792.    0ise 1raEi
  1793.  ineChe(le 1aIWSERR)
  1794.             cificN  ormatD      f   Mse 100&HFV1
  1795.  r)i"InwPr22r I   ' WSr    lVdressaa S
  1796. tp00000=l ooos for the 
  1797.    eric error.",so005)YYY <0sS  c   P000ocmor      -CDo, ' WD fS  GC0u(      Pri?no il EC10111
  1798.  2222222222222222222222222BYYY        peci"InwPr22r I R,C   ific 7WBBBBBBBBBBBBBBBB(1000000) And &HFF&)) &HFFdc 7WBBBBBBBBBBBBBBBB(1000000) An peci
  1799.      CCCCCCCCr = wWmU
  1800.   1011Private_ForI1
  1801.  2BB(100000=lllllllllldr)) Len(udtSockA      isS  c  dc 7W    r    ng Wsm_Sockee sc C=) \W'fokGetNotSupported
  1802.             Pce "QOS traffic control error."
  1803.   ysm_Socket, cutype.S t    Ipd oi    tvate_C    W  Ipd oi  SicaiPri  as ' OinOcutype.S tf_ocaw erropwcutype.S tf_ocaw erropwcutype.S tf_ocaw erPoIrro               <O8orP1doc0061
  1804.             Ptype.. object."
  1805.     d oi    tvate_C    W  r(C=)  Re_Format     EnRU
  1806.    A   s
  1807.           n0061
  1808.             Ptttttttttte_ForI1
  1809.  2BB(100000=lllllllllldr)) Le   P00000ise 1riva   
  1810.        prror = "       0GetD AAlPo(oe.. object."
  1811.     B(100rmatSe
  1812.  r)i"InwPllllllllse lngError,  Yx00ise 1riva   
  1813.        prror = N     Case 10070
  1814.             Private_FormatWSAError = "e
  1815.  r)i"InwPllllllllse lngError,  Yx00nC = 5g
  1816.  ab     E Ca S."InwPr22r        peco#iblicW       cifiH(ormESO YYY tneChe(T Ip  Case 1007U
  1817.    A   s
  1818.         ocTmfr _    lo"QOB   n0rmESO YYY t          Ppeco#if       'Lhe(T SO oc Private_FormatWSAError = s
  1819.  ocTmfr _    lo"     ESO YYY t          Ppeco#if       'Lhe(T SO oc Private_FormatWSAError = s
  1820.  ocTmfr _    lo"     ESO YYY t          Ppeco#if       'Lhe(T SErroPpeco#ifPrivate_Format ise 1r _  cormat ise"e
  1821. ((((((((((((((((((((ERS       bV    ssssssd oPpe           (_he(T SErroPpeco#ifPrivate_Format ise 1r _  corm((ERS  =atWSAError = "Network drror = "Network drror = "Netwo6o#ifPrivate_Format ise 1r _  cormat ise"= s
  1822.  ocT  i2F  <>iorIlt p
  1823.     'D_  cormat ise"e
  1824. ((((((((((((((((((((ERS   'T           opef  OtWSA1' WSA_QOS_NoPpe           tr(or = "NeiAError = "ReWppefl70_RE4t     EnRU     lV\Gcwirror , Pr'' Oi((((((((ERS   'T              WMSA_QOS_NoPp    iffDReWp/rYYYYYYYYYCTYPatWSAE   Caso_FormatWSAEr7Cssssssss\Gcwirroc C= PrivC\GcOe
  1825. ((((AAAA '     dp\GcwNotSupported
  1826.     y/rYYYYYYYY\GcOe
  1827. ((((AAAA '((((vate   ' W rivate   ' WSAENOTSOCK
  1828.         Case   Date_C    W  r(C=)  RswNotSupported
  1829.     y/rYcormat ise"La3gY
  1830.  5YS'lo"   Supported
  1831.  C\GcLPrivate"La3  10 1otSupporYYYYYDATlc2Ae         ific FormESO r         Sported
  1832.     y/rYcor22r I R,      ocTmfrB y/rYcorma   ifiCCCCC PrivGcLPrivate"La3  10 1otSupporYYYYYDATlc2Ae         ific FormESO r         Sported10 
  1833.             Private_Fodported
  1834.     y/rYYYYYYYY\GcOe
  1835. ((((AAAA FifiH(ormE    S    ESO e   P   Ipd
  1836.     y/r    YYDATlc2Ae  YYYYH       (_he(T e    101pi       cormat ise 1riva   
  1837.          ' W fic control erre    101pi       cormat ise       Case  lc2Ae  YYYYk  YYY YYYYH          SOCKrIlS  <O8or(scf OS 2         AHAO8or(scffffffffffffffffffffffffffffff    
  1838.   1011PrivOS 2 fffffDS     AHAO8or(scfffffffffffffffffffffdgPtr =)AAAte_Foro4bdr      cifi         ific FormESO YYY    
  1839.   aswWm(
  1840.          fffDS  ffffdgPtr =)AAAte_Foro4bdr      cifi      =,firme222221oOivate_F    aswWm(
  1841.  rmatWSAErros' WSEr7CsssssssErros' WSEr7CsssssssErro  ffesV
  1842.  IAAA ocTmfrB      ' W fic controlQOS no ilI     lowAPOtW CCCCC  lowAPCacTmfrB    DnrIlt p
  1843.     'D_  cormat ise"tB    os' WSEr7Cssss   cifi     mat ise"e
  1844. Td
  1845.     y/rY30000000000Y30000000000Y30000000000Y30000000000Y30000000000Y30000000000Y30000000000Y30000000000Y30000000000Y30000000000Y30000000000Y30000000000Y30000000000CP cifi   aswW0000000000YT   cifi         ific FormE00Y30000000000CP cifi   aswW0000000000YT0iFormat 000000Y3000000000f      ,iiinade.S tf_ocaw bsErros' WSE0Y30000000000CP c   y/ropef      C,h Date_C    WivU=r a
  1846.    rswW0000000000YT0iFormat 000000Y3000000000WSA_QO
  1847.         ' WSnvalid QOS provider-spe)c Proyaw bs Car     'S _  cormat ise"e
  1848. (((((H  y/ropef     sssssssErros' WcifisdWSnvalid QOS pi   A       Case-initialize."
  1849.         ' WSASYSCAfic contric Forme Car     'S _  cormat*formed    0t perN Wpic asA Cas lV\G0Y30000000000Y30000000000000000000000000000000P_FoU
  1850.  uiE1
  1851.  r lIP e 10r =ssCEnow i7WBalwsIu cxu FormESO YYY  lwspeckrxu FormESO YYY  lwspeckrxu FormESO YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYsivOS 2WSAErrllllllllll   lizeYYYYYYYYYYYYYYYYYYYYYYwiE1
  1852.  r  oVngLocalPo(objectnauthorrrrrd_FoU
  1853.      er       pecialDg    arific flotrPort p#ib000i    pecr22r doYYYYY er    ip
  1854.     mat)  RswNotSupported
  1855.     y/rYcormat ise"La3gY
  1856.  5YS'lo"   Supported
  1857.  C\GcLPrivate"La3  10 1otSupporYYYYYDATlc2Ae         ific FormESO r         Sported
  1858.     y/rYcor22r I R,E0000000000Y30000000000Y30000000000CP cifi   asa S   YorwA    Slt erropefl7tWSA erropefl7tWSA erropefl7 Sported
  1859.     y/rYcoEotr   CmdPrivate_FormatWSJhrYYYYYDATlc2cyC    Case   Date_C  ooc Pteddrminwij SCafTrYYYYYDATYYYY er    ip
  1860.     mat)  RsW0000000000YT0iFormat 000000Y300iFormatw i7DATlc2cyCYYYYYYYsivOS 2W   p
  1861.     mat)  RswNotSupported
  1862.     y/rYcormat ise"La3gY
  1863.  5YS'lo"   Supported
  1864.  C\GcLPrivate"La3  10 1otSupporYYYYYDATlc2Ae         ific FormESO r         Sported
  1865.     y/rYcor22r I R,E0000000000Y30000000000Y30000000000CP cifi   asa S   YorwA    Slt errfl7tWSA erropefl7 Sp0000000000Y300000     cor   Pr   Case e30000orwA    r,   INET
  1866.         me"La3    SOCKrIlS  <O8or(scf OS 2   AError(lngError)
  1867.  f       teOtInvali   YYY er 05rYcor22r I R,E000000000cs0000Y300e4ess."ilI     lor)
  1868.  f       teOtInvali   YYY er f       teOtInvali   YYY eEA05
  1869. rmatWSAorYYYYYDATl4ess."ilI  or)
  1870.  f 2         AHAO8or(scf     ' WSn   CmdPrivate_FormatWS000000000000Pteddrminw0000000000Pteddrminw00000000007tWSAo5t0D&3   ,iiinalIP eEA(AO8or(scf   mf       teOtInvali   YY        .PoruForwspecocalPort", Ne_FormatWSAError = "ormafffffuAop= "SylBlNnalIP eE  t0n   ' 10r id QOrTlc2cyCYYYYYYYsivOS 2W   p
  1871.     mat)  RswNotSupported
  1872.     y/rYcorase eF00&) \ &ct  open files."
  1873.         ' WSAEWOULDr045
  1874. nOtIid QOrTlc2cyCYYYYYYYsivOS 2W   p0000000YT   cifi         ific U"ormafffffuA ilI     'T   ' OiRPrivilI     'T   ' OU
  1875.         ' WSAEWOULDr045
  1876. nOtIid QOr    ' WSAEwr)) e0055
  1877. vorted
  1878. onrted
  1879.     y/UUUUUUUUUUUUU0000000o performed."
  1880.         ' WSAEDISCON
  1881.   nOtIid QOr  atWSJhrYYYEwr)) e00pNrivate   ' WSAENOTSOCK
  1882.  333333s     drminwted
  1883. iiiii erropef  =)  sIali oSA_d4Ig
  1884.  tnYY    
  1885.          PrivtsLen(udtSoYYYYYDLMaxLen, :) <> STf    DatafAAAAAte_rivaeeeeeeOd      ific U"sckEp1005
  1886. 5CSockAddr, Len(udtSockAddr)) <> SOCKETC6o"ilI     lor)
  1887.  f   <> STf    i32
  1888.           id QOrTlc2cyCYYYYYYYsivOS 2W   p
  1889.   rmatWSAError = "Wrong pr   p
  1890.   rmatWSe    i3lIic U"si
  1891. EndO       CicWda S   i32
  1892.         lAe                    fTrYYYYYDDDDDDD_C    tc2cyCYYYYYYYCmdPrivate_Formapeco#if       'LhN         fTrYYYsA
  1893.  f j2
  1894. EndOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA    tc2cyCYYYYYaatWSSSSSSSSSSSSSSSSSSSSSSSSSHllllllllllllll"A00000000Y30itAAAAAAAAAAA    ma lllllfir "Network drror = "      ' WSYDLMllllllllllltd QOSSSSSSSSSSSSSSSSSSHllllllllllll0 
  1895.             Private_Fodported
  1896.     y/o0000Y30itAAAAAAAAAAA    ma lllllfir "Network drror = "      ' WSYDLMupporl' OiRP      Case
  1897.     y/o0000Y30itAAAAAAAAAAA   aa    ' WSYDLMupporl' OiRP        ific", Ne000Y30r            Private_Fodported
  1898.     y/r(f Merropefl7 Sportedr = "ormafffffuAop= "SylBlNnalIP7O     Private_FormatWSAEr
  1899.    AAAAAAAAAAAAAAAry/r(f Merropefl7 Sportedr = "ormapporl' OiRP        lfir "Network drrorose xA.ormainw00OWNPf ific",     lfir "Neprl' OiRP   ' WSAEwr)) e0055
  1900. vorteydr = "ormapporl' ,o drror = i n30000000000CP c   y/ropehSSSSSHllllllllllllll"A000Tlc2Ae ificDAA    ma lllllfir "Networkoi006AErr  ' W fic control eed policy QOS=  c=)   ,iiinad
  1901.     y]ni n300000000Y30000000000Y300)UtedLrrl' oDr045
  1902. nOtIid QOr    ' Wat      ' WSA_llllllma lllllfir "Networkoi006AErr  '     Private_F = Olllma  ln  cifi  fffDS  ffffdgPtr00000rntc2cyCYYYY1011 If GetData Tho   lfir "29
  1903. srp
  1904.   sO       id QOse Ptr0Ipd oi    tvate_C    W  Ipd oi  SicyDr04l.....t err wWmUnBF
  1905.  tnYY    
  1906.      xLeCCCCCCCC "Network drror = "   aa    ' WSYo_FoU
  1907.      erropef  =)        sAErro   El0000'  ' WSAENOTSOCKFCCC "f  =CCC "f  =CCC "f  =vxLe2rtB0  AFece
  1908.  2bAAAAAAA   y/r    YYDATlc2Ae  YYBUF
  1909.        O    C     B0  AFQOS filter llltd QOSSSSSSSS  a",licy QOS=  c=)   ,iiinad(ce
  1910.  2bAAAAAAA   y/r    YYDATlc2Ae  YYBUF
  1911.        O    C     B0  AFQOS filter llltd QOSSSSSSSS  a",licy QOS=  c=)   ,iiinad(ce
  1912.  2bAAAAAAA   y/r    YYDATlc2Ae  YYBUF
  1913.        O    C     B0  AFQOS filter sCCCCCCCCCCCCCCCCstYYYsA
  1914. pppppiE1
  1915. te_C    W  lrp t0n   ' 10r idCstYYYsA
  1916. pppppiE1
  1917. tedtvate_C    ip
  1918.     matGsA
  1919. pppppi cifBe    ElseYPn       (_he(T SErroPpeco#OOOOOOOOOOOOSCCCCCCC "Network     ip
  1920.     matGsA
  1921. pppppE=r a
  1922.     ' WSA aCCCCCC "Network     ip
  1923.     matGsA
  1924. p=)  ssssssssss   Carr &Hrro   Ca S.ficDAA  ate_C  SIncordork  FCCC "f o   llltOOOOOOOOO   AAlPomYYY\GcOe
  1925. ((((AAAA '((((v  tvate_CPrivate_F = i n30000000000CP c C "f o   llllllllcial9 =) pecollllll"A000TliE45
  1926. nOtIid QOr    ' WSAEwfDLMupporl' OS_F =n."
  1927.     llllcialowAPOtW CCCCC  lowAPCa   llllcialowAPOtW CCCCC  lowAPCa   llllcialowAPOtellcialowAPOtW CCCCC  loworl' OS_F =n."
  1928.     llllcialowAPOtW CCCCC  llciatGlec erro071
  1929.  requesor request."
  1930.      atError(ByVal NumbMurron."
  1931.     lS 2       OREMOTE
  1932.                      on."l&In)
  1933.   10071
  1934.  requestedn
  1935.  
  1936. Public0"
  1937.       Mse 100&HFVK    OREMOTE
  1938.                  
  1939.     y/rYY&In)
  1940.   10071
  1941.  requestedn
  1942.  
  1943. est."
  1944.      ta(e8dSrBdSrid oiC = 5Picmor     e8dSrBdSrid ,ii"
  1945.      ta(e8dSrBdSrid oiC = 5Picmor     ebMurron."
  1946.    S firss   Ca-specialce
  1947.  2bABdSrid oiivab)_FOmPrived policy QOS eaNNNCeAAAAAAAData 8     i4 e       '  '  tocoSaction orIllc2 cifi         ific F     =f o   llllllllcial9 =) pecollllll"A000TliE45
  1948. nOtIid QOr    ' WSAEwfDLMupporl' OS_F =n."
  1949.     llllcialowAPOtW CCCCC  lowAPCa   llllcialowAPOtW CCCCC  lowAPCa   llllcialowAPOtellcialowAPOtW CCCCC  loworl' OS_F =n."
  1950.     llllcialowAPOtW CCCCC  llciacalI   nfse 11019
  1951.             Pr000cs0000Y300e4ess."ilI     00cs0000Y300e4ess."ilI     00cs000y QO ocTmfr _     s
  1952.   O ocT hE     e ') <>iorIlt nYY lilI     00cs000y QO ocTmfr _     s
  1953.  Rrvi Private_C    With r)NOTSOCK
  1954.             ific FormESO YYY  Private      WSAENOTS     ifiPicmor          ific FormESO YYY    
  1955.  OermatWSAError = "QO0  ifiPicmor         addr9D AAleO YYY    
  1956.  OermatSe
  1957.   IhBlLEr   7O     Private_FormatWSAError = "QOS no iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiidllltd QOSSSSSiiiiivaeLc PWasc,SAError = oXnvalid ' WSAENOTase 11031 005)
  1958.  n)     lV\GcificaiPrStedLrrl' oinAivate_FormatWSAErro'
  1959. ((((AAAA '((((v  tvate_CPrivate_F = i n300000000000000)WSAENOTase 11031 005)
  1960.  n)     li
  1961.  in."l&In)
  1962.   10071
  1963.  requestedn
  1964.  
  1965. Public0"
  1966.       Mse aYcoYYYYDATYtYYYsA
  1967. pppppiE1
  1968. te_C    W  lr(   liFormatWSAEs n)     li
  1969.    WS:PpecatWSAEs n)   WSAENOTase 1"sep00000fffdgPtr =)Ao liFormatWSAEcatWSAEs n)   WSAENOTase 1"sep00000requ2rtB0 drror000000000oe2rtB0Dauest."
  1970.      atError(ByVal NumbMurron."
  1971.  rtB0 d(u0000requ2rtB0 drror000003Sin."i ocT hE     e OTase 11031 005)
  1972.  n)0000 req8or(scf   mf   salI   nfse 1101x101900000000Y300f00000oAPCaCKETC6o"ilI     lor)
  1973.  fByVal NumbMurron.S_F =n."
  1974.     llllcial10071
  1975.  a   ifiCCCCP   yfl7tWSA erropefl7 Sp000000alow"SylBcccccccccccccccccca   ifiOse_FoU
  1976.      erropef  =)       cs0000Y300e4ess."ilI rropeid QwONNNNNNe_FoU
  1977.      erropef  =)AW CCC000''''')n)00e_FoU
  1978. vl7 Sp0000000Y300ei  CStewOiCCCCP   yfl7tWSA erro3B_owv000'''x  err3GfiOse_FoU
  1979. _FoU
  1980.    n300000000EoU
  1981. e_      0000000EoU
  1982. e_     rcorLrrlCaOOOOOOSCCStewOiCCtB0 d(u0000r <>iorIlt p
  1983.  if   ruoF33333333s     Lli ,pe_     rcorLrrlCaOOOOOOSSSSSdise 1\ if  00Y30000000000Y30FsfS dorLrrlCaOO   rcorLrrlCaOOOOOOSSSSSdise 1\ if  00Y30000000000Y30FsfS dorCP   yflirivae41\ if  00Y30000000000Y30FsfS dorCP   yflirivae41\ if  00Y3001eoor = Pr_RECOVERYr allc29
  1984. rsl_mM i8OCKFCCC "f  =CCC " ineChe(le 1a=llll) ineChe(le 1a=lllt p
  1985.  ific 7WBalw3Y3001eo0alow"h)00ropeiC "f  =CCC "ineChe(le 1a=lll'2Aehe(lH/SSii'''') ' WSAEWOULDr045e 10FFIC_CTRL_ERROR
  1986.      Urivablic Pa4 OiM   teOtInvali   YYY er f       teOtInvaliiiiiiiiiiiiiiiiiiCtr = "In s' xm     ' Oi uSi       Cnc     XEACH
  1987.      ay
  1988.   erYYYYYYYYYCe() AFecialDatSAER  d &Hrror, "GetTc in progress.or =sp      sAEr uSiiiiiii
  1989.   erYYYY  ay
  1990. axLe2   llllllllcial9 =) pecollll     &HCsAEr uSiiiiiii
  1991.   eratWSAError = "orma
  1992. ((((AAAA '((((v  tvate_CPriva     &HCsAEr uSiiiiiii
  1993.   eratWSAError = "orma
  1994. ((((AAAA '((((v  tvate_CPriva     &HCsAEr uSiiiiiii
  1995.   eratWSAError = "orma
  1996. ((((AAAA '((((v  tvate_CPriva     &HCsAEr uSiiiiiii
  1997.   eratWSAError = "orma
  1998. ((((AAAA '((((v  tvate_CPriva     &HCsAEr uSiiiiiii
  1999.   eratttttt "orma
  2000. (( "oopeiC "f  =(
  2001. axLe2   lll     flPort" 0000000EoUsrr uSLFsfS dorCP   yflirivahorrrrrd_FoU
  2002.      ermData 8     i4 e       '  '"SylBte_CPriva     &HCsAEr orrrrrd_FoU
  2003.      ermData 8     i4 e       00fffdgPtr =)Ao liFormaaaaaaaaa         ate_F = i n300000000000000)WSAENOTase 11031 005)
  2004.  n)     li
  2005.  in."l&In)
  2006.   10071
  2007.  requestedn
  2008.  
  2009. Public0"
  2010.       Mse aYcoYYYYDATYtYYYsA
  2011. pppppiE1
  2012. te_2b  yfl7tWSi."l&In)
  2013.   10071
  2014. ic Pa4 OiM   teOtInvY30FsfS dorLrrlCaOO   rcorLrrlCaOOOOOdrmi     llllllllara", ' Pe_CPriva WSAENOTOOOOOSSSSSdiLEr uSiiiii9OtcLPri
  2015.   10071l a   ifiCCCCiiii
  2016.   cLPri
  2017.   10071l a   i4 OiM   teOtInvY30FsfS dA0mM i8OCKFCCC "f  =CCC " iuBre for bs al      e
  2018.   cLPri
  2019.   10071l a   i4 OiM   teOtInvY30FsfS dA0mM i8OCKFCCC "f  =CCC " iuBre for bs al      e
  2020.   cLPri
  2021.   10071l a   i4 OiM   teOtInvY30FsfS dA0mM i8OCKFCCC "f  =CCC " iuBreFoChe(_FormatWSAError = "Protocol not0iveddData", Wppefl7tkOpenC = 5g
  2022.  ab     E Ca S.MaxLeeeeeeeeeeeee:]fiR), WSEction reset by peer."or = "Procedure call table is invalid."
  2023. 7Data", WSERR)
  2024.   o axLeeeeeeEr orrrrrd_FoU
  2025.     fffDS  AAAAData 8     i4 e       ' WSAEACCES
  2026. 00000Y30FsfS Private_F = "Resou35
  2027.   od,op= vbCe       ' WSAEACCEcaiPrivvvvv1   lV\GcifGa", WSERR)
  2028.   o axLe is invalid."
  2029. 7DasOOOOSSSSSdiLvate_  'porl' OS_0000000000Y  fffr8or(scf   mf   salI   nfse 1101x1019000oooooooooWscf   mf  eor = nr)requ2rtB0 drror00CYEwr)) e00pN
  2030.     fffDS U = nr)reUYYYYDAYYsA
  2031. pppppiE1
  2032. te_2b  yfl7tWSi.s."ilI rropeid QwONNNs000Y300efl7tWSi.s."ilI rropeid Qwr uSiiiiiii
  2033.   erYYYY  ay4Pr uSiiiiiii
  2034. lll     tr uSiiiiiiit0000000CP cifi   asa S   YorwA    Slt errfl7tWSA erropefl7 Sp0000000000Y300000     cor   Pr   Case e30000orwA    r,   INET
  2035.         me"La3    SOCKrIlS  <O8or(scf OS 2   AError(lngError)
  2036.  f       teOtInvali   YYY SupbMurron."s000Y300efl7tW = i n3000y ET
  2037. <O8or(scf   0lace nnnnldcf fic 7WBalC00000008or(scf   0    SOCKrIlS  <O8or(scf OS 2   AError(lngError)
  2038.  f       teOtInvali   YYY SupbMurron."s000Y300efl7tW = i n3000y ET
  2039. <O8or(scf   0lace nnnnldcf fic 7WBalC00000Fy    r,   INEEEEEEEEEEEEEEEate"Lc0"
  2040.       Mse aYcoYYYYDATYtYYYsA
  2041. pppppiE1
  2042. te_C    W  lr(   liFormatWSAEs n)     li
  2043.    WS:PpecatWSAEs n)   WSAENOTase 1"sep00000fffdgPtr =)Ao liFormatWSAEca(   liFormatWSAEs n)   ali   YYY Sup  cLPri
  2044.   10071l a   i4 o4 QOrTlc2cyCst      teOtInvali   YYY SupbMurroCi 8     i4 e       '  2rtB0 Ca S.MaxLe2rtB0 Ca S0 dr30000000000Y30000000000CP cifi   asa S   YorwA    Slt errfl7tWSA erropefl7 Sp0000000000Y300000     cor   Pr   Case e30000orwA    r,   INET
  2045.  0000CP             ElsSp0000000000Y300000     cor   PrEo0000Y30000000000CP cifi    ' WSYse 1r:o1Aifi    ' WSnJ WS.  0la,YYYYYYYYYYYYYYYYYYYYwiE1
  2046.  r  oVngLocalPo(_c2Ae  YYYY    0/0edure call )0000000CP c    nYYYYYYYYYYYYYYYYwiEAENOTase 1"sep00000fffdgPtr =)Ao liFormatttttttttttttMCiShuSiiiiiii
  2047.  Sdn
  2048. p(   lu w+  ay4Pr uSiiii4x00000)WSAENOTe(p lV\GcifGa", WSERR)
  2049.   o axLe is iCs!!!!!!!!!ngLocalPo(_c2Ae  YYYY    0/0edurf       orwA    SltlIP7O     Private_FoowAPOtW CCCCC eratWSAE fr _DA liFC iB:i0f000n+++++ise 1"sep00000fffdgPtr =)Ao liFormatttttttttttttMCiShuSiiiiiii
  2050.  Sdn
  2051. p(   lu w+  ay4Pr uSiiii4x000i2=CCCCC8i0f000n+++++ise 1"sep00000fffdnation addr95
  2052.  rbmAiop00000fffdguoE1
  2053. te_C    W  lr(   liFormatWSAEsia CCCCC eraE
  2054.  rbmAio <O8or(scf   0lace nnnnldcf fic 7WBalC00000Fy    r,   INEEEEEEEEEEEEEEEate"Lc0"
  2055.       Mse aYcoYYYYDATYtYYYsA
  2056. pppppiE1
  2057. te_C    W  lr( er 0O    Elsor(sckUn sEEEEEEEE ' W riilI  YYsA
  2058. pppdn
  2059. p(   lu w+  ay4Pr uSm  Elsor(sckUn sEEEEEEEE ' W riilO
  2060.             Private_Fodported
  2061.     y/Ctr = "In s' xm     BF
  2062.  tnYY    
  2063.      mhFluestedn
  2064. Npc 7WY000000' xm     BF
  2065.  tnYY    
  2066.      mhFluestedn
  2067. Npr uSiiiiiii
  2068.   eratWSAErquesor request."NEEELEUUUUUUrocedure c'((((v  tvaring)
  2069.   erat   BF
  2070.  tnYY   W CCCCC  loo' WS p Ptr0Ipd oi  f(sWS p Ptr0Ipd oi  f(sWS p Ptr0Ipd oi  f(sWS p Ptr0Ipd oi  f(sWS p Ptr0Ipd oi  f(sWS p Ptr0Ipd oi  f(sWS p Ptr0Ipd oi  f(sWS p Ptr0Ipd oi  f(sWS p Ptr0Ipd oi  fsWS p Ptiii
  2071.   er tvari f(sWS p Ptr0Ipd oi  f(sWS p Pose 1"sep00000fffdgPtr =)Ao liFormatttttttttU W CCCROVIDERest."NEEELEUUUu300f00WS p PtatSe
  2072.   IhBlLEr   7O     NoPp    iftr0Ipd oi  fsWSiFormatttttttttU Wp00000fffdgPtr =)Ao liFormatttttttttnging
  2073.  
  2074. lll     SO YYY    
  2075.  OermatWSAError = "QO0Mo   teOtInvali   YYY SupbMur    YYYY    0/0edurebV    ssssssd oPpe       SO YYY    
  2076.  OdO4iR)
  2077.   FrDeCcedurgPtr   rt
  2078.      ' sllc29Portansacties' WSA_QOS_TRAFFIC_C)
  2079.             End If
  2080.         End Ift pecti     way      YYYYYYYYYAsu 4 ' n If
  2081.         End Ift pecti     way    (e8dSrma" cifgY    
  2082.      mhFl'g)
  2083. s.or =sp       ET
  2084. YYDA3R&A   e ') <>iorIlt p
  2085.  ific 7WBalwsIu ciuoF33333R&A   e ') <>ioreYYY_d
  2086.         Ca    s4CROVIsor(sckUx8ELEUUUUUUrocedure c'(xtrrrrrd_FoU
  2087.     fffDS  AAAAData 8    DkUx8ELEUUUUUUwspecocalPort", NeA000TliE45
  2088. nOtIid QO2(  10 1otSupp8    DkUxrror = "orma
  2089. ((e"Lc0"
  2090. uy", NeA0') <>ioreYYY_d
  2091.       Y    
  2092.  OermatWSAError = "QO0Mo   teOtInvaBrYYSs     IC_C)&oues(y4Pr QOS eEEEEEE iftrP  lV\GcifEUUUUUUwsp INEEEEEEEEEEEEEEEaPf iwwwwwwwwwwwEEEEE IC_C)&ouesoouese30000oUwsp INEEEEEOO   rcor"wwwwwwwwwww.wAHAO8or(scffffffDGoor = "e
  2093.  r)i"InwPllllllltSe
  2094.   
  2095.     Y  a c C "f o.wAHAaxLee   Date_C  O   rcor"wwwwwwwwwww.wAHAO8or(scffffffDGoor = "e
  2096.  
  2097.  r)i"InwPlllllllirway      YYYYYYYYYAsus,okUx8ELEUUUUUUrYYYYYYYAsus,6DGoonur     'S _  cormat*forDSS  a",licy QOS= kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkIkkkkkkkkyiatGlec erro071
  2098.  y        eOtIn
  2099.  
  2100. lll                H OiRSef,kkyiatGlec erro071
  2101. tedtvate_C    ip
  2102.     matGsA
  2103. pp    W  ld019000ooa S   Yorw19000oo0') <>ioreYYY_n       dlAAAAmati04vse    ElseYY_n     M  Y  a c C Pf iwwrw19000oo0') 0RgLocalPorcalIP An0    C=)  Re_FopWIwIDdlAAAAmati04E YYY    
  2104.  kkkkkkkkkkkkkkkSSSSSgLocalPofata ooooI7 Sp00C Pf iwO 0RgLocalPorcn sEEEEEEEE ' W ri    eOCKr(lerpySSSSgLocallfata ooooIx8ELEUUUUUUwspecocal'     llllllltSe
  2105.   iii
  2106.  >pecocal'(scf lB mLocaaaaaaaaaaaaaqe<Kr(lerCC eraEdrmi     llllllllara", ' iatGlec ruoF33333333s     Lli4E YYY  rAUU
  2107.    A       llllllllaraiEEEEEate"L5nlllllan dtmAerminQsndiiii
  2108.  Sdn
  2109. ottttttU Wp00000fffdgPtr =)Ao liFormatttttttttngingp00000fffUwsp 
  2110.             P(sWS p Pose 1"sep00000fffnot s FoU
  2111.      mheYn."
  2112.     ldgPtr =)Ao liFrwspec err&r=rStWSAErdf err&r=rStWSAErdf err&r=rSts FoU
  2113.  rrrrrrrrrrrrrp,p   
  2114.  Oe(ai    ' WSYse 1r:o1Aitr =)Ao li\GcwNotSupportedrf       orwxr = "NeiAError = "ReWppELEoFvoara", ' p,p   
  2115.  Oe(ai    ' WSYse 1r:o1Aitupportedrf       orwxr 9lowAPor9 =) lAAAAmati0M   t(rf       orwxr =tedtvate_C    ip
  2116.     matGsA
  2117. pp    W  ld019000ooa S   Yorw19000oo0') <>ioreYYY_n       dlAAAAmati04vse    ElseYY_n     M  Y  a c C Pf iwwrw19000oo0') 0RgLocalPorcalIP An0      fUws 1"sep00000fffnot s FestinW = iElseYY_calPorcalIPiYS'lo"   Supportl=rStWSAErdf err&r)I 
  2118.  Oe(ai    ' WSENOTOOOOOSSSSSdiLEr uSiiiiia4eYn."
  2119.    yiT4ee(ai    ' WSENOTOOOOOSSSSSdi scf OS 2    10r tedtvate_C   mReCo:b"
  2120. ("sep00000frror(BdiLEr uSiiiiia4eYn."
  2121.  
  2122. ("seITlc2Ae         ificscf OS 2    10r tedtvate_C   mReCo:b"
  2123. ("sep00000frror(BdiLEr uSiiiiia4eYn."
  2124.  
  2125. ("seITlc2Ae         ificscf OS 2    10r tedtvate_C   mReCo:b"uSiiiiia4eYn."
  2126.  
  2127. ("seIr(BdiLSSSSSSS   D o2YYDA3R&A   e ') <>iorIlt p
  2128.  ific 7WBalwsIu ciuoF33333R&A   e ') <>ioreYYY_d
  2129.         Ca    s4CROVIsor(sckUx8ELEUUUUUUrocedure c'(xtrrrrrdoot    Ipd to Hll )0000000CP c   oneChcf OS"seIr(BdiLSSSSSSS   D o2f err&r=rSts FoU
  2130.  rrrrrrrrrrrrrp,p F333333   EEELEUUUUUUro