Help!!!我想用winsock API中的一些函数,但我的VB6.0中没有这些函数,是否由于我没有安装完全?

jylth 2000-09-05 05:06:00
...全文
270 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
xianserver 2001-06-23
  • 打赏
  • 举报
回复
我天~~~好不容易看到了这里,别白来,写句话吧:"呵呵,我看过了,真长,真多,我知道你好不容易打了3天才写在这里的,是吧,朋友,真是厉害,佩服,恩,高"!!!

到此一游
wangfeng 2001-06-23
  • 打赏
  • 举报
回复
能不能给个原代码,我再加50分
Jackyin 2001-04-26
  • 打赏
  • 举报
回复
gz
shines77 2000-09-11
  • 打赏
  • 举报
回复
当然Ocx占用系统的资源会多些,但使用上方便多了,且出错的机会少(因为是封装的),使用Winsock Api效率会高些,但比较麻烦,出错得自己处理。
jylth 2000-09-11
  • 打赏
  • 举报
回复
shines,你才是笨蛋,连问题都没有看明白,废话,我问的就是使用上各有什么优缺点。
jylth 2000-09-11
  • 打赏
  • 举报
回复
知道了!谢谢诸位。
Un1 2000-09-06
  • 打赏
  • 举报
回复
当然是在VB中不用winsock.ocx使用winsock啦!
jylth 2000-09-06
  • 打赏
  • 举报
回复
thanks Uun1,我需要好好研究一下你的代码。请问它能实现什么功能?
shines77 2000-09-06
  • 打赏
  • 举报
回复
简直是笨蛋!!Api就是Api,还有什么不同的,API就是API,控件就是控件,控件也是调用API的,当然Un1给的只是Winsock Api的声明,具体的使用还要看你的了,不懂?那就算了,是吗Un1,呵呵。

连Winsock控件与Winsock Api都不懂的懒得理他!!
jylth 2000-09-06
  • 打赏
  • 举报
回复
Un1,winsock控件与winsock api相比,有什么不同呢?
Un1 2000-09-05
  • 打赏
  • 举报
回复
'wsksock.bas


' (1) I have never used WS_SELECT (select), therefore I must warn that I do

' not know if fd_set and timeval are properly defined.

' (2) Alot of the functions are declared with "buf as any", when calling these

' functions you may either pass strings, byte arrays or UDT's. For 32bit I

' I recommend Byte arrays and the use of memcopy to copy the data back out

' (3) The async functions (wsaAsync*) require the use of a message hook or

' message window control to capture messages sent by the winsock stack. This

' is not to be confused with a CallBack control, The only function that uses

' callbacks is WSASetBlockingHook()

' (4) Alot of "helper" functions are provided in the file for various things

' before attempting to figure out how to call a function, look and see if

' there is already a helper function for it.

' (5) Data types (hostent etc) have kept there 16bit definitions, even under 32bit

' windows due to the problem of them not working when redfined following the

' suggested rules.

Option Explicit



Public Const FD_SETSIZE = 64

Type fd_set

fd_count As Integer

fd_array(FD_SETSIZE) As Integer

End Type



Type timeval

tv_sec As Long

tv_usec As Long

End Type



Type HostEnt

h_name As Long

h_aliases As Long

h_addrtype As Integer

h_length As Integer

h_addr_list As Long

End Type

Public Const hostent_size = 16



Type servent

s_name As Long

s_aliases As Long

s_port As Integer

s_proto As Long

End Type

Public Const servent_size = 14



Type protoent

p_name As Long

p_aliases As Long

p_proto As Integer

End Type

Public Const protoent_size = 10



Public Const IPPROTO_TCP = 6

Public Const IPPROTO_UDP = 17



Public Const INADDR_NONE = &HFFFFFFFF

Public Const INADDR_ANY = &H0



Type sockaddr

sin_family As Integer

sin_port As Integer

sin_addr As Long

sin_zero As String * 8

End Type

Public Const sockaddr_size = 16

Public saZero As sockaddr





Public Const WSA_DESCRIPTIONLEN = 256

Public Const WSA_DescriptionSize = WSA_DESCRIPTIONLEN + 1



Public Const WSA_SYS_STATUS_LEN = 128

Public Const WSA_SysStatusSize = WSA_SYS_STATUS_LEN + 1



Type WSADataType

wVersion As Integer

wHighVersion As Integer

szDescription As String * WSA_DescriptionSize

szSystemStatus As String * WSA_SysStatusSize

iMaxSockets As Integer

iMaxUdpDg As Integer

lpVendorInfo As Long

End Type



Public Const INVALID_SOCKET = -1

Public Const SOCKET_ERROR = -1



Public Const SOCK_STREAM = 1

Public Const SOCK_DGRAM = 2



Public Const MAXGETHOSTSTRUCT = 1024



Public Const AF_INET = 2

Public Const PF_INET = 2



Type LingerType

l_onoff As Integer

l_linger As Integer

End Type

' Windows Sockets definitions of regular Microsoft C error constants

Global Const WSAEINTR = 10004

Global Const WSAEBADF = 10009

Global Const WSAEACCES = 10013

Global Const WSAEFAULT = 10014

Global Const WSAEINVAL = 10022

Global Const WSAEMFILE = 10024

' Windows Sockets definitions of regular Berkeley error constants

Global Const WSAEWOULDBLOCK = 10035

Global Const WSAEINPROGRESS = 10036

Global Const WSAEALREADY = 10037

Global Const WSAENOTSOCK = 10038

Global Const WSAEDESTADDRREQ = 10039

Global Const WSAEMSGSIZE = 10040

Global Const WSAEPROTOTYPE = 10041

Global Const WSAENOPROTOOPT = 10042

Global Const WSAEPROTONOSUPPORT = 10043

Global Const WSAESOCKTNOSUPPORT = 10044

Global Const WSAEOPNOTSUPP = 10045

Global Const WSAEPFNOSUPPORT = 10046

Global Const WSAEAFNOSUPPORT = 10047

Global Const WSAEADDRINUSE = 10048

Global Const WSAEADDRNOTAVAIL = 10049

Global Const WSAENETDOWN = 10050

Global Const WSAENETUNREACH = 10051

Global Const WSAENETRESET = 10052

Global Const WSAECONNABORTED = 10053

Global Const WSAECONNRESET = 10054

Global Const WSAENOBUFS = 10055

Global Const WSAEISCONN = 10056

Global Const WSAENOTCONN = 10057

Global Const WSAESHUTDOWN = 10058

Global Const WSAETOOMANYREFS = 10059

Global Const WSAETIMEDOUT = 10060

Global Const WSAECONNREFUSED = 10061

Global Const WSAELOOP = 10062

Global Const WSAENAMETOOLONG = 10063

Global Const WSAEHOSTDOWN = 10064

Global Const WSAEHOSTUNREACH = 10065

Global Const WSAENOTEMPTY = 10066

Global Const WSAEPROCLIM = 10067

Global Const WSAEUSERS = 10068

Global Const WSAEDQUOT = 10069

Global Const WSAESTALE = 10070

Global Const WSAEREMOTE = 10071

' Extended Windows Sockets error constant definitions

Global Const WSASYSNOTREADY = 10091

Global Const WSAVERNOTSUPPORTED = 10092

Global Const WSANOTINITIALISED = 10093

Global Const WSAHOST_NOT_FOUND = 11001

Global Const WSATRY_AGAIN = 11002

Global Const WSANO_RECOVERY = 11003

Global Const WSANO_DATA = 11004

Global Const WSANO_ADDRESS = 11004

'---ioctl Constants

Public Const FIONREAD = &H8004667F

Public Const FIONBIO = &H8004667E

Public Const FIOASYNC = &H8004667D



#If Win16 Then

'---Windows System functions

Public Declare Function PostMessage Lib "User" (ByVal hWnd As Integer, ByVal wMsg As Integer, ByVal wParam As Integer, lParam As Any) As Integer

Public Declare Sub MemCopy Lib "Kernel" Alias "hmemcpy" (Dest As Any, Src As Any, ByVal cb&)

Public Declare Function lstrlen Lib "Kernel" (ByVal lpString As Any) As Integer

'---async notification constants

Public Const SOL_SOCKET = &HFFFF

Public Const SO_LINGER = &H80

Public Const FD_READ = &H1

Public Const FD_WRITE = &H2

Public Const FD_OOB = &H4

Public Const FD_ACCEPT = &H8

Public Const FD_CONNECT = &H10

Public Const FD_CLOSE = &H20

'---SOCKET FUNCTIONS

Public Declare Function Accept Lib "Winsock.dll" Alias "accept" (ByVal s As Integer, addr As sockaddr, addrlen As Integer) As Integer

Public Declare Function bind Lib "Winsock.dll" (ByVal s As Integer, addr As sockaddr, ByVal namelen As Integer) As Integer

Public Declare Function closesocket Lib "Winsock.dll" (ByVal s As Integer) As Integer

Public Declare Function Connect Lib "Winsock.dll" Alias "connect" (ByVal s As Integer, addr As sockaddr, ByVal namelen As Integer) As Integer

Public Declare Function ioctlsocket Lib "Winsock.dll" (ByVal s As Integer, ByVal cmd As Long, argp As Long) As Integer

Public Declare Function getpeername Lib "Winsock.dll" (ByVal s As Integer, sName As sockaddr, namelen As Integer) As Integer

Public Declare Function getsockname Lib "Winsock.dll" (ByVal s As Integer, sName As sockaddr, namelen As Integer) As Integer

Public Declare Function getsockopt Lib "Winsock.dll" (ByVal s As Integer, ByVal level As Integer, ByVal optname As Integer, optval As Any, optlen As Integer) As Integer

Public Declare Function htonl Lib "Winsock.dll" (ByVal hostlong As Long) As Long

Public Declare Function htons Lib "Winsock.dll" (ByVal hostshort As Integer) As Integer

Public Declare Function inet_addr Lib "Winsock.dll" (ByVal cp As String) As Long

Public Declare Function inet_ntoa Lib "Winsock.dll" (ByVal inn As Long) As Long

Public Declare Function Listen Lib "Winsock.dll" Alias "listen" (ByVal s As Integer, ByVal backlog As Integer) As Integer

Public Declare Function ntohl Lib "Winsock.dll" (ByVal netlong As Long) As Long

Public Declare Function ntohs Lib "Winsock.dll" (ByVal netshort As Integer) As Integer

Public Declare Function recv Lib "Winsock.dll" (ByVal s As Integer, buf As Any, ByVal buflen As Integer, ByVal flags As Integer) As Integer

Public Declare Function recvfrom Lib "Winsock.dll" (ByVal s As Integer, buf As Any, ByVal buflen As Integer, ByVal flags As Integer, from As sockaddr, fromlen As Integer) As Integer

Public Declare Function ws_select Lib "Winsock.dll" Alias "select" (ByVal nfds As Integer, readfds As Any, writefds As Any, exceptfds As Any, timeout As timeval) As Integer

Public Declare Function send Lib "Winsock.dll" (ByVal s As Integer, buf As Any, ByVal buflen As Integer, ByVal flags As Integer) As Integer

Public Declare Function sendto Lib "Winsock.dll" (ByVal s As Integer, buf As Any, ByVal buflen As Integer, ByVal flags As Integer, to_addr As sockaddr, ByVal tolen As Integer) As Integer

Public Declare Function setsockopt Lib "Winsock.dll" (ByVal s As Integer, ByVal level As Integer, ByVal optname As Integer, optval As Any, ByVal optlen As Integer) As Integer

Public Declare Function ShutDown Lib "Winsock.dll" Alias "shutdown" (ByVal s As Integer, ByVal how As Integer) As Integer

Public Declare Function socket Lib "Winsock.dll" (ByVal af As Integer, ByVal s_type As Integer, ByVal protocol As Integer) As Integer

'---DATABASE FUNCTIONS

Public Declare Function gethostbyaddr Lib "Winsock.dll" (addr As Long, ByVal addr_len As Integer, ByVal addr_type As Integer) As Long

Public Declare Function gethostbyname Lib "Winsock.dll" (ByVal host_name As String) As Long

Public Declare Function gethostname Lib "Winsock.dll" (ByVal host_name As String, ByVal namelen As Integer) As Integer

Public Declare Function getservbyport Lib "Winsock.dll" (ByVal Port As Integer, ByVal proto As String) As Long

Public Declare Function getservbyname Lib "Winsock.dll" (ByVal serv_name As String, ByVal proto As String) As Long

Public Declare Function getprotobynumber Lib "Winsock.dll" (ByVal proto As Integer) As Long

Public Declare Function getprotobyname Lib "Winsock.dll" (ByVal proto_name As String) As Long

'---WINDOWS EXTENSIONS

Public Declare Function WSAStartup Lib "Winsock.dll" (ByVal wVR As Integer, lpWSAD As WSADataType) As Integer

Public Declare Function WSACleanup Lib "Winsock.dll" () As Integer

Public Declare Sub WSASetLastError Lib "Winsock.dll" (ByVal iError As Integer)

Public Declare Function WSAGetLastError Lib "Winsock.dll" () As Integer

Public Declare Function WSAIsBlocking Lib "Winsock.dll" () As Integer

Public Declare Function WSAUnhookBlockingHook Lib "Winsock.dll" () As Integer

Public Declare Function WSASetBlockingHook Lib "Winsock.dll" (ByVal lpBlockFunc As Long) As Long

Public Declare Function WSACancelBlockingCall Lib "Winsock.dll" () As Integer

Public Declare Function WSAAsyncGetServByName Lib "Winsock.dll" (ByVal hWnd As Integer, ByVal wMsg As Integer, ByVal serv_name As String, ByVal proto As String, buf As Any, ByVal buflen As Integer) As Integer

Public Declare Function WSAAsyncGetServByPort Lib "Winsock.dll" (ByVal hWnd As Integer, ByVal wMsg As Integer, ByVal Port As Integer, ByVal proto As String, buf As Any, ByVal buflen As Integer) As Integer

Public Declare Function WSAAsyncGetProtoByName Lib "Winsock.dll" (ByVal hWnd As Integer, ByVal wMsg As Integer, ByVal proto_name As String, buf As Any, ByVal buflen As Integer) As Integer

Public Declare Function WSAAsyncGetProtoByNumber Lib "Winsock.dll" (ByVal hWnd As Integer, ByVal wMsg As Integer, ByVal number As Integer, buf As Any, ByVal buflen As Integer) As Integer

Public Declare Function WSAAsyncGetHostByName Lib "Winsock.dll" (ByVal hWnd As Integer, ByVal wMsg As Integer, ByVal host_name As String, buf As Any, ByVal buflen As Integer) As Integer

Public Declare Function WSAAsyncGetHostByAddr Lib "Winsock.dll" (ByVal hWnd As Integer, ByVal wMsg As Integer, addr As Long, ByVal addr_len As Integer, ByVal addr_type As Integer, buf As Any, ByVal buflen As Integer) As Integer

Public Declare Function WSACancelAsyncRequest Lib "Winsock.dll" (ByVal hAsyncTaskHandle As Integer) As Integer

Public Declare Function WSAAsyncSelect Lib "Winsock.dll" (ByVal s As Integer, ByVal hWnd As Integer, ByVal wMsg As Integer, ByVal lEvent As Long) As Integer

Public Declare Function WSARecvEx Lib "Winsock.dll" (ByVal s As Integer, buf As Any, ByVal buflen As Integer, ByVal flags As Integer) As Integer

#ElseIf Win32 Then

'---Windows System Functions

Public Declare Function PostMessage Lib "user32" Alias "PostMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long

Public Declare Sub MemCopy Lib "kernel32" Alias "RtlMoveMemory" (Dest As Any, Src As Any, ByVal cb&)

Public Declare Function lstrlen Lib "kernel32" Alias "lstrlenA" (ByVal lpString As Any) As Long

'---async notification constants

Public Const SOL_SOCKET = &HFFFF&

Public Const SO_LINGER = &H80&

Public Const FD_READ = &H1&

Public Const FD_WRITE = &H2&

Public Const FD_OOB = &H4&

Public Const FD_ACCEPT = &H8&

Public Const FD_CONNECT = &H10&

Public Const FD_CLOSE = &H20&

'---SOCKET FUNCTIONS

Public Declare Function Accept Lib "wsock32.dll" Alias "accept" (ByVal s As Long, addr As sockaddr, addrlen As Long) As Long

Public Declare Function bind Lib "wsock32.dll" (ByVal s As Long, addr As sockaddr, ByVal namelen As Long) As Long

Public Declare Function closesocket Lib "wsock32.dll" (ByVal s As Long) As Long

Public Declare Function Connect Lib "wsock32.dll" Alias "connect" (ByVal s As Long, addr As sockaddr, ByVal namelen As Long) As Long

Public Declare Function ioctlsocket Lib "wsock32.dll" (ByVal s As Long, ByVal cmd As Long, argp As Long) As Long

Public Declare Function getpeername Lib "wsock32.dll" (ByVal s As Long, sName As sockaddr, namelen As Long) As Long

Public Declare Function getsockname Lib "wsock32.dll" (ByVal s As Long, sName As sockaddr, namelen As Long) As Long

Public Declare Function getsockopt Lib "wsock32.dll" (ByVal s As Long, ByVal level As Long, ByVal optname As Long, optval As Any, optlen As Long) As Long

Public Declare Function htonl Lib "wsock32.dll" (ByVal hostlong As Long) As Long

Public Declare Function htons Lib "wsock32.dll" (ByVal hostshort As Long) As Integer

Public Declare Function inet_addr Lib "wsock32.dll" (ByVal cp As String) As Long

Public Declare Function inet_ntoa Lib "wsock32.dll" (ByVal inn As Long) As Long

Public Declare Function Listen Lib "wsock32.dll" Alias "listen" (ByVal s As Long, ByVal backlog As Long) As Long

Public Declare Function ntohl Lib "wsock32.dll" (ByVal netlong As Long) As Long

Public Declare Function ntohs Lib "wsock32.dll" (ByVal netshort As Long) As Integer

Public Declare Function recv Lib "wsock32.dll" (ByVal s As Long, buf As Any, ByVal buflen As Long, ByVal flags As Long) As Long

Public Declare Function recvfrom Lib "wsock32.dll" (ByVal s As Long, buf As Any, ByVal buflen As Long, ByVal flags As Long, from As sockaddr, fromlen As Long) As Long

Public Declare Function ws_select Lib "wsock32.dll" Alias "select" (ByVal nfds As Long, readfds As fd_set, writefds As fd_set, exceptfds As fd_set, timeout As timeval) As Long

Public Declare Function send Lib "wsock32.dll" (ByVal s As Long, buf As Any, ByVal buflen As Long, ByVal flags As Long) As Long

Public Declare Function sendto Lib "wsock32.dll" (ByVal s As Long, buf As Any, ByVal buflen As Long, ByVal flags As Long, to_addr As sockaddr, ByVal tolen As Long) As Long

Public Declare Function setsockopt Lib "wsock32.dll" (ByVal s As Long, ByVal level As Long, ByVal optname As Long, optval As Any, ByVal optlen As Long) As Long

Public Declare Function ShutDown Lib "wsock32.dll" Alias "shutdown" (ByVal s As Long, ByVal how As Long) As Long

Public Declare Function socket Lib "wsock32.dll" (ByVal af As Long, ByVal s_type As Long, ByVal protocol As Long) As Long

'---DATABASE FUNCTIONS

Public Declare Function gethostbyaddr Lib "wsock32.dll" (addr As Long, ByVal addr_len As Long, ByVal addr_type As Long) As Long

Public Declare Function gethostbyname Lib "wsock32.dll" (ByVal host_name As String) As Long

Public Declare Function gethostname Lib "wsock32.dll" (ByVal host_name As String, ByVal namelen As Long) As Long

Public Declare Function getservbyport Lib "wsock32.dll" (ByVal Port As Long, ByVal proto As String) As Long

Public Declare Function getservbyname Lib "wsock32.dll" (ByVal serv_name As String, ByVal proto As String) As Long

Public Declare Function getprotobynumber Lib "wsock32.dll" (ByVal proto As Long) As Long

Public Declare Function getprotobyname Lib "wsock32.dll" (ByVal proto_name As String) As Long

'---WINDOWS EXTENSIONS

Public Declare Function WSAStartup Lib "wsock32.dll" (ByVal wVR As Long, lpWSAD As WSADataType) As Long

Public Declare Function WSACleanup Lib "wsock32.dll" () As Long

Public Declare Sub WSASetLastError Lib "wsock32.dll" (ByVal iError As Long)

Public Declare Function WSAGetLastError Lib "wsock32.dll" () As Long

Public Declare Function WSAIsBlocking Lib "wsock32.dll" () As Long

Public Declare Function WSAUnhookBlockingHook Lib "wsock32.dll" () As Long

Public Declare Function WSASetBlockingHook Lib "wsock32.dll" (ByVal lpBlockFunc As Long) As Long

Public Declare Function WSACancelBlockingCall Lib "wsock32.dll" () As Long

Public Declare Function WSAAsyncGetServByName Lib "wsock32.dll" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal serv_name As String, ByVal proto As String, buf As Any, ByVal buflen As Long) As Long

Public Declare Function WSAAsyncGetServByPort Lib "wsock32.dll" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal Port As Long, ByVal proto As String, buf As Any, ByVal buflen As Long) As Long

Public Declare Function WSAAsyncGetProtoByName Lib "wsock32.dll" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal proto_name As String, buf As Any, ByVal buflen As Long) As Long

Public Declare Function WSAAsyncGetProtoByNumber Lib "wsock32.dll" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal number As Long, buf As Any, ByVal buflen As Long) As Long

Public Declare Function WSAAsyncGetHostByName Lib "wsock32.dll" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal host_name As String, buf As Any, ByVal buflen As Long) As Long

Public Declare Function WSAAsyncGetHostByAddr Lib "wsock32.dll" (ByVal hWnd As Long, ByVal wMsg As Long, addr As Long, ByVal addr_len As Long, ByVal addr_type As Long, buf As Any, ByVal buflen As Long) As Long

Public Declare Function WSACancelAsyncRequest Lib "wsock32.dll" (ByVal hAsyncTaskHandle As Long) As Long

Public Declare Function WSAAsyncSelect Lib "wsock32.dll" (ByVal s As Long, ByVal hWnd As Long, ByVal wMsg As Long, ByVal lEvent As Long) As Long

Public Declare Function WSARecvEx Lib "wsock32.dll" (ByVal s As Long, buf As Any, ByVal buflen As Long, ByVal flags As Long) As Long

#End If





'SOME STUFF I ADDED

Public MySocket%

Public SockReadBuffer$

Public Const WSA_NoName = "Unknown"

Public WSAStartedUp As Boolean 'Flag to keep track of whether winsock WSAStartup wascalled

Public glngCount As Long


Public Function WSAGetAsyncBufLen(ByVal lParam As Long) As Long

If (lParam And &HFFFF&) > &H7FFF Then

WSAGetAsyncBufLen = (lParam And &HFFFF&) - &H10000

Else

WSAGetAsyncBufLen = lParam And &HFFFF&

End If

End Function



Public Function WSAGetSelectEvent(ByVal lParam As Long) As Integer

If (lParam And &HFFFF&) > &H7FFF Then

WSAGetSelectEvent = (lParam And &HFFFF&) - &H10000

Else

WSAGetSelectEvent = lParam And &HFFFF&

End If

End Function







Public Function WSAGetAsyncError(ByVal lParam As Long) As Integer

WSAGetAsyncError = (lParam And &HFFFF0000) \ &H10000

End Function







Public Function AddrToIP(ByVal AddrOrIP$) As String

AddrToIP$ = GetAscIP(GetHostByNameAlias(AddrOrIP$))

End Function



'this function should work on 16 and 32 bit systems

#If Win16 Then

Function ConnectSock(ByVal Host$, ByVal Port%, retIpPort$, ByVal HWndToMsg%, ByVal Async%) As Integer

Dim s%, SelectOps%, dummy%

#ElseIf Win32 Then

Function ConnectSock(ByVal Host$, ByVal Port&, retIpPort$, ByVal HWndToMsg&, ByVal Async%) As Long

Dim s&, SelectOps&, dummy&

#End If

Dim sockin As sockaddr

SockReadBuffer$ = ""

sockin = saZero

sockin.sin_family = AF_INET

sockin.sin_port = htons(Port)

If sockin.sin_port = INVALID_SOCKET Then

ConnectSock = INVALID_SOCKET

Exit Function

End If



sockin.sin_addr = GetHostByNameAlias(Host$)

If sockin.sin_addr = INADDR_NONE Then

ConnectSock = INVALID_SOCKET

Exit Function

End If

retIpPort$ = GetAscIP$(sockin.sin_addr) & ":" & ntohs(sockin.sin_port)



s = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)

If s < 0 Then

ConnectSock = INVALID_SOCKET

Exit Function

End If

If SetSockLinger(s, 1, 0) = SOCKET_ERROR Then

If s > 0 Then

dummy = closesocket(s)

End If

ConnectSock = INVALID_SOCKET

Exit Function

End If

If Not Async Then

If Not Connect(s, sockin, sockaddr_size) = 0 Then

If s > 0 Then

dummy = closesocket(s)

End If

ConnectSock = INVALID_SOCKET

Exit Function

End If

If HWndToMsg <> 0 Then

'SelectOps = FD_READ Or FD_WRITE Or FD_CONNECT Or FD_CLOSE
SelectOps = FD_CONNECT Or FD_CLOSE

'If WSAAsyncSelect(s, HWndToMsg, ByVal 1025, ByVal SelectOps) Then
If WSAAsyncSelect(s, HWndToMsg, ByVal &H200, ByVal SelectOps) Then

If s > 0 Then

dummy = closesocket(s)

End If

ConnectSock = INVALID_SOCKET

Exit Function

End If

End If

Else

SelectOps = FD_READ Or FD_WRITE Or FD_CONNECT Or FD_CLOSE
SelectOps = FD_CONNECT Or FD_CLOSE

'If WSAAsyncSelect(s, HWndToMsg, ByVal 1025, ByVal SelectOps) Then
If WSAAsyncSelect(s, HWndToMsg, ByVal &H200, ByVal SelectOps) Then

If s > 0 Then

dummy = closesocket(s)

End If

ConnectSock = INVALID_SOCKET

Exit Function

End If

If Connect(s, sockin, sockaddr_size) <> -1 Then

If s > 0 Then

dummy = closesocket(s)

End If

ConnectSock = INVALID_SOCKET

Exit Function

End If

End If

ConnectSock = s

End Function



#If Win32 Then

Public Function SetSockLinger(ByVal SockNum&, ByVal OnOff%, ByVal LingerTime%) As Long

#Else

Public Function SetSockLinger(ByVal SockNum%, ByVal OnOff%, ByVal LingerTime%) As Integer

#End If

Dim Linger As LingerType

Linger.l_onoff = OnOff

Linger.l_linger = LingerTime

If setsockopt(SockNum, SOL_SOCKET, SO_LINGER, Linger, 4) Then

'Debug.Print "Error setting linger info: " & WSAGetLastError()

SetSockLinger = SOCKET_ERROR

Else

If getsockopt(SockNum, SOL_SOCKET, SO_LINGER, Linger, 4) Then

'Debug.Print "Error getting linger info: " & WSAGetLastError()

SetSockLinger = SOCKET_ERROR

Else

'Debug.Print "Linger is on if nonzero: "; Linger.l_onoff

'Debug.Print "Linger time if linger is on: "; Linger.l_linger

End If

End If

End Function



Sub EndWinsock()

Dim ret&

If WSAIsBlocking() Then

ret = WSACancelBlockingCall()

End If

ret = WSACleanup()

WSAStartedUp = False

End Sub



Public Function GetAscIP(ByVal inn As Long) As String

#If Win32 Then

Dim nStr&

#Else

Dim nStr%

#End If

Dim lpStr&

Dim retString$

retString = String(32, 0)

lpStr = inet_ntoa(inn)

If lpStr Then

nStr = lstrlen(lpStr)

If nStr > 32 Then nStr = 32

MemCopy ByVal retString, ByVal lpStr, nStr

retString = Left(retString, nStr)

GetAscIP = retString

Else

GetAscIP = "255.255.255.255"

End If

End Function



Public Function GetHostByAddress(ByVal addr As Long) As String

Dim phe&, ret&

Dim heDestHost As HostEnt

Dim HostName$

phe = gethostbyaddr(addr, 4, PF_INET)

If phe Then

MemCopy heDestHost, ByVal phe, hostent_size

HostName = String(256, 0)

MemCopy ByVal HostName, ByVal heDestHost.h_name, 256

GetHostByAddress = Left(HostName, InStr(HostName, Chr(0)) - 1)

Else

GetHostByAddress = WSA_NoName

End If

End Function



'returns IP as long, in network byte order

Public Function GetHostByNameAlias(ByVal HostName$) As Long

'Return IP address as a long, in network byte order

Dim phe&

Dim heDestHost As HostEnt

Dim addrList&

Dim retIP&

retIP = inet_addr(HostName$)

If retIP = INADDR_NONE Then

phe = gethostbyname(HostName$)

If phe <> 0 Then

MemCopy heDestHost, ByVal phe, hostent_size

MemCopy addrList, ByVal heDestHost.h_addr_list, 4

MemCopy retIP, ByVal addrList, heDestHost.h_length

Else

retIP = INADDR_NONE

End If

End If

GetHostByNameAlias = retIP

End Function



'returns your local machines name

Public Function GetLocalHostName() As String

Dim sName$

sName = String(256, 0)

If gethostname(sName, 256) Then

sName = WSA_NoName

Else

If InStr(sName, Chr(0)) Then

sName = Left(sName, InStr(sName, Chr(0)) - 1)

End If

End If

GetLocalHostName = sName

End Function



#If Win16 Then

Public Function GetPeerAddress(ByVal s%) As String

Dim addrlen%

#ElseIf Win32 Then

Public Function GetPeerAddress(ByVal s&) As String

Dim addrlen&

#End If

Dim sa As sockaddr

addrlen = sockaddr_size

If getpeername(s, sa, addrlen) Then

GetPeerAddress = ""

Else

GetPeerAddress = SockAddressToString(sa)

End If

End Function



#If Win16 Then

Public Function GetPortFromString(ByVal PortStr$) As Integer

#ElseIf Win32 Then

Public Function GetPortFromString(ByVal PortStr$) As Long

#End If

'sometimes users provide ports outside the range of a VB

'integer, so this function returns an integer for a string

'just to keep an error from happening, it converts the

'number to a negative if needed

If Val(PortStr$) > 32767 Then

GetPortFromString = CInt(Val(PortStr$) - &H10000)

Else

GetPortFromString = Val(PortStr$)

End If

If Err Then GetPortFromString = 0

End Function



#If Win16 Then

Function GetProtocolByName(ByVal protocol$) As Integer

Dim tmpShort%

#ElseIf Win32 Then

Function GetProtocolByName(ByVal protocol$) As Long

Dim tmpShort&

#End If

Dim ppe&

Dim peDestProt As protoent

ppe = getprotobyname(protocol)

If ppe Then

MemCopy peDestProt, ByVal ppe, protoent_size

GetProtocolByName = peDestProt.p_proto

Else

tmpShort = Val(protocol)

If tmpShort Then

GetProtocolByName = htons(tmpShort)

Else

GetProtocolByName = SOCKET_ERROR

End If

End If

End Function



#If Win16 Then

Function GetServiceByName(ByVal service$, ByVal protocol$) As Integer

Dim serv%

#ElseIf Win32 Then

Function GetServiceByName(ByVal service$, ByVal protocol$) As Long

Dim serv&

#End If

Dim pse&

Dim seDestServ As servent

pse = getservbyname(service, protocol)

If pse Then

MemCopy seDestServ, ByVal pse, servent_size

GetServiceByName = seDestServ.s_port

Else

serv = Val(service)

If serv Then

GetServiceByName = htons(serv)

Else

GetServiceByName = INVALID_SOCKET

End If

End If

End Function



'this function DOES work on 16 and 32 bit systems

#If Win16 Then

Function GetSockAddress(ByVal s%) As String

Dim addrlen%

Dim ret%

#ElseIf Win32 Then

Function GetSockAddress(ByVal s&) As String

Dim addrlen&

Dim ret&

#End If

Dim sa As sockaddr

Dim szRet$

szRet = String(32, 0)

addrlen = sockaddr_size

If getsockname(s, sa, addrlen) Then

GetSockAddress = ""

Else

GetSockAddress = SockAddressToString(sa)

End If

End Function



'this function should work on 16 and 32 bit systems

Function GetWSAErrorString(ByVal errnum&) As String

On Error Resume Next

Select Case errnum

Case 10004: GetWSAErrorString = "Interrupted system call."

Case 10009: GetWSAErrorString = "Bad file number."

Case 10013: GetWSAErrorString = "Permission Denied."

Case 10014: GetWSAErrorString = "Bad Address."

Case 10022: GetWSAErrorString = "Invalid Argument."

Case 10024: GetWSAErrorString = "Too many open files."

Case 10035: GetWSAErrorString = "Operation would block."

Case 10036: GetWSAErrorString = "Operation now in progress."

Case 10037: GetWSAErrorString = "Operation already in progress."

Case 10038: GetWSAErrorString = "Socket operation on nonsocket."

Case 10039: GetWSAErrorString = "Destination address required."

Case 10040: GetWSAErrorString = "Message too long."

Case 10041: GetWSAErrorString = "Protocol wrong type for socket."

Case 10042: GetWSAErrorString = "Protocol not available."

Case 10043: GetWSAErrorString = "Protocol not supported."

Case 10044: GetWSAErrorString = "Socket type not supported."

Case 10045: GetWSAErrorString = "Operation not supported on socket."

Case 10046: GetWSAErrorString = "Protocol family not supported."

Case 10047: GetWSAErrorString = "Address family not supported by protocol family."

Case 10048: GetWSAErrorString = "Address already in use."

Case 10049: GetWSAErrorString = "Can't assign requested address."

Case 10050: GetWSAErrorString = "Network is down."

Case 10051: GetWSAErrorString = "Network is unreachable."

Case 10052: GetWSAErrorString = "Network dropped connection."

Case 10053: GetWSAErrorString = "Software caused connection abort."

Case 10054: GetWSAErrorString = "Connection reset by peer."

Case 10055: GetWSAErrorString = "No buffer space available."

Case 10056: GetWSAErrorString = "Socket is already connected."

Case 10057: GetWSAErrorString = "Socket is not connected."

Case 10058: GetWSAErrorString = "Can't send after socket shutdown."

Case 10059: GetWSAErrorString = "Too many references: can't splice."

Case 10060: GetWSAErrorString = "Connection timed out."

Case 10061: GetWSAErrorString = "Connection refused."

Case 10062: GetWSAErrorString = "Too many levels of symbolic links."

Case 10063: GetWSAErrorString = "File name too long."

Case 10064: GetWSAErrorString = "Host is down."

Case 10065: GetWSAErrorString = "No route to host."

Case 10066: GetWSAErrorString = "Directory not empty."

Case 10067: GetWSAErrorString = "Too many processes."

Case 10068: GetWSAErrorString = "Too many users."

Case 10069: GetWSAErrorString = "Disk quota exceeded."

Case 10070: GetWSAErrorString = "Stale NFS file handle."

Case 10071: GetWSAErrorString = "Too many levels of remote in path."

Case 10091: GetWSAErrorString = "Network subsystem is unusable."

Case 10092: GetWSAErrorString = "Winsock DLL cannot support this application."

Case 10093: GetWSAErrorString = "Winsock not initialized."

Case 10101: GetWSAErrorString = "Disconnect."

Case 11001: GetWSAErrorString = "Host not found."

Case 11002: GetWSAErrorString = "Nonauthoritative host not found."

Case 11003: GetWSAErrorString = "Nonrecoverable error."

Case 11004: GetWSAErrorString = "Valid name, no data record of requested type."

Case Else: GetWSAErrorString = "Unexpert Error!"

End Select

End Function



'this function DOES work on 16 and 32 bit systems

Function IpToAddr(ByVal AddrOrIP$) As String

On Error Resume Next

IpToAddr = GetHostByAddress(GetHostByNameAlias(AddrOrIP$))

If Err Then IpToAddr = WSA_NoName

End Function



'this function DOES work on 16 and 32 bit systems

Function IrcGetAscIp(ByVal IPL$) As String

'this function is IRC specific, it expects a long ip stored in Network byte order, in a string

'the kind that would be parsed out of a DCC command string

On Error GoTo IrcGetAscIPError:

Dim lpStr&

#If Win16 Then

Dim nStr%

#ElseIf Win32 Then

Dim nStr&

#End If

Dim retString$

Dim inn&

If Val(IPL) > 2147483647 Then

inn = Val(IPL) - 4294967296#

Else

inn = Val(IPL)

End If

inn = ntohl(inn)

retString = String(32, 0)

lpStr = inet_ntoa(inn)

If lpStr = 0 Then

IrcGetAscIp = "0.0.0.0"

Exit Function

End If

nStr = lstrlen(lpStr)

If nStr > 32 Then nStr = 32

MemCopy ByVal retString, ByVal lpStr, nStr

retString = Left(retString, nStr)

IrcGetAscIp = retString

Exit Function

IrcGetAscIPError:

IrcGetAscIp = "0.0.0.0"

Exit Function

Resume

End Function



'this function DOES work on 16 and 32 bit systems

Function IrcGetLongIp(ByVal AscIp$) As String

'this function converts an ascii ip string into a long ip in network byte order

'and stick it in a string suitable for use in a DCC command.

On Error GoTo IrcGetLongIpError:

Dim inn&

inn = inet_addr(AscIp)

inn = htonl(inn)

If inn < 0 Then

IrcGetLongIp = CVar(inn + 4294967296#)

Exit Function

Else

IrcGetLongIp = CVar(inn)

Exit Function

End If

Exit Function

IrcGetLongIpError:

IrcGetLongIp = "0"

Exit Function

Resume

End Function



'this function should work on 16 and 32 bit systems

#If Win16 Then

Public Function ListenForConnect(ByVal Port%, ByVal HWndToMsg%) As Integer

Dim s%, dummy%

Dim SelectOps%

#ElseIf Win32 Then

Public Function ListenForConnect(ByVal Port&, ByVal HWndToMsg&) As Long

Dim s&, dummy&

Dim SelectOps&

#End If

Dim sockin As sockaddr

sockin = saZero 'zero out the structure

sockin.sin_family = AF_INET

sockin.sin_port = htons(Port)

If sockin.sin_port = INVALID_SOCKET Then

ListenForConnect = INVALID_SOCKET

Exit Function

End If

sockin.sin_addr = htonl(INADDR_ANY)

If sockin.sin_addr = INADDR_NONE Then

ListenForConnect = INVALID_SOCKET

Exit Function

End If

s = socket(PF_INET, SOCK_STREAM, 0)

If s < 0 Then

ListenForConnect = INVALID_SOCKET

Exit Function

End If

If bind(s, sockin, sockaddr_size) Then

If s > 0 Then

dummy = closesocket(s)

End If

ListenForConnect = INVALID_SOCKET

Exit Function

End If

SelectOps = FD_READ Or FD_WRITE Or FD_CLOSE Or FD_ACCEPT
SelectOps = FD_CLOSE Or FD_ACCEPT

'If WSAAsyncSelect(s, HWndToMsg, ByVal 1025, ByVal SelectOps) Then
If WSAAsyncSelect(s, HWndToMsg, ByVal &H200, ByVal SelectOps) Then

If s > 0 Then

dummy = closesocket(s)

End If

ListenForConnect = SOCKET_ERROR

Exit Function

End If



If Listen(s, 1) Then

If s > 0 Then

dummy = closesocket(s)

End If

ListenForConnect = INVALID_SOCKET

Exit Function

End If

ListenForConnect = s

End Function



'this function should work on 16 and 32 bit systems

#If Win16 Then

Public Function SendData(ByVal s%, vMessage As Variant) As Integer

#ElseIf Win32 Then

Public Function SendData(ByVal s&, vMessage As Variant) As Long

#End If

Dim TheMsg() As Byte, sTemp$

Select Case VarType(vMessage)

Case 8209 'byte array

sTemp = vMessage

Case 8 'string, if we recieve a string, its assumed we are linemode

sTemp = StrConv(vMessage, vbFromUnicode)
'sTemp = vMessage ', vbFromUnicode)
Case Else

sTemp = CStr(vMessage)

End Select

TheMsg = sTemp

If UBound(TheMsg) > -1 Then

SendData = send(s, TheMsg(0), UBound(TheMsg) + 1, 0)

End If

End Function



Public Function SockAddressToString(sa As sockaddr) As String

SockAddressToString = GetAscIP(sa.sin_addr) & ":" & ntohs(sa.sin_port)

End Function



Public Function StartWinsock(sDescription As String) As Boolean

Dim StartupData As WSADataType

If Not WSAStartedUp Then

If Not WSAStartup(&H101, StartupData) Then

WSAStartedUp = True

' Debug.Print "wVersion="; StartupData.wVersion, "wHighVersion="; StartupData.wHighVersion
'
' Debug.Print "If wVersion == 257 then everything is kewl"
'
' Debug.Print "szDescription="; StartupData.szDescription
'
' Debug.Print "szSystemStatus="; StartupData.szSystemStatus
'
' Debug.Print "iMaxSockets="; StartupData.iMaxSockets, "iMaxUdpDg="; StartupData.iMaxUdpDg

sDescription = StartupData.szDescription

Else

WSAStartedUp = False

End If

End If

StartWinsock = WSAStartedUp

End Function



Public Function WSAMakeSelectReply(TheEvent%, TheError%) As Long

WSAMakeSelectReply = (TheError * &H10000) + (TheEvent And &HFFFF&)

End Function

1,486

社区成员

发帖
与我相关
我的任务
社区描述
VB API
社区管理员
  • API
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧