刚学winsock api看了#include <Winsock2.h>
#include <stdio.h>void main()
{
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD( 1, 1 );
err = WSAStartup( wVersionRequested, &wsaData );
if ( err != 0 ) {
return;
}
if ( LOBYTE( wsaData.wVersion ) != 1 ||
HIBYTE( wsaData.wVersion ) != 1 ) {
WSACleanup( );
return;
} SOCKET sockClient=socket(AF_INET,SOCK_DGRAM,0);
SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");
addrSrv.sin_family=AF_INET;
addrSrv.sin_port=htons(6000); sendto(sockClient,"Hello",strlen("Hello")+1,0,
(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));
closesocket(sockClient);
WSACleanup();
}
然后vb使用Private Sub RemoteControl(Dictate As String) Dim ret, sock As sockaddr If SocketsInitialize() Then Dim sSave$ s = socket(AF_INET, SOCK_DGRAM, 0) sock.sin_family = AF_INET
sock.sin_addr = inet_addr("127.0.0.1")
sock.sin_port = htons(6000) '设置用于发送数据的本地端口
sock.sin_zero =vbnullstring
ret = sendto(s, "qq", 3, 0, sock, Len(sock)) End If WSACleanupEnd Sub sock.sin_zero =vbnullstring这里看见c++说是保留,但是我在vb不设置或设置为vbnullstring看见防火墙访问的不是("127.0.0.1") 的6000端口,究竟是哪里错了??
#include <stdio.h>void main()
{
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD( 1, 1 );
err = WSAStartup( wVersionRequested, &wsaData );
if ( err != 0 ) {
return;
}
if ( LOBYTE( wsaData.wVersion ) != 1 ||
HIBYTE( wsaData.wVersion ) != 1 ) {
WSACleanup( );
return;
} SOCKET sockClient=socket(AF_INET,SOCK_DGRAM,0);
SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");
addrSrv.sin_family=AF_INET;
addrSrv.sin_port=htons(6000); sendto(sockClient,"Hello",strlen("Hello")+1,0,
(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));
closesocket(sockClient);
WSACleanup();
}
然后vb使用Private Sub RemoteControl(Dictate As String) Dim ret, sock As sockaddr If SocketsInitialize() Then Dim sSave$ s = socket(AF_INET, SOCK_DGRAM, 0) sock.sin_family = AF_INET
sock.sin_addr = inet_addr("127.0.0.1")
sock.sin_port = htons(6000) '设置用于发送数据的本地端口
sock.sin_zero =vbnullstring
ret = sendto(s, "qq", 3, 0, sock, Len(sock)) End If WSACleanupEnd Sub sock.sin_zero =vbnullstring这里看见c++说是保留,但是我在vb不设置或设置为vbnullstring看见防火墙访问的不是("127.0.0.1") 的6000端口,究竟是哪里错了??
Type SOCKADDR
sin_family As Integer
sin_port As Integer
sin_addr As Long
sin_zero As String * 8
End Typesock.sin_zero = string(8,0) '填充8个字节的0,或者不用赋值都可以
Private Const PF_INET = AF_INET
Private Const SOCK_DGRAM = 2
Private Const IPPROTO_UDP = 17
Private Declare Function socket Lib "ws2_32.dll" (ByVal af As Long, ByVal lType As Long, ByVal protocol As Long) As Long
Private Declare Function bind Lib "ws2_32.dll" (ByVal s As Long, ByRef addr As sockaddr, ByVal namelen As Long) As Long
Private Type sockaddr
sin_family As Integer
sin_zero As String * 8
sin_addr As Long
sin_port As Integer
End Type
Private Declare Function WSAStartupInfo Lib "WSOCK32" Alias "WSAStartup" (ByVal wVersionRequested As Integer, lpWSADATA As WSADataInfo) As Long
Private Const WSADESCRIPTION_LEN = 256
Private Const WSASYS_STATUS_LEN = 128Private Const WS_VERSION_REQD As Long = &H101
Private Type WSADataInfo
wVersion As Integer
wHighVersion As Integer
szDescription As String * WSADESCRIPTION_LEN
szSystemStatus As String * WSASYS_STATUS_LEN
iMaxSockets As Integer
iMaxUdpDg As Integer
lpVendorInfo As String
End TypePrivate Declare Function htonl Lib "ws2_32.dll" (ByVal hostlong As Long) As Long
Private Const INADDR_ANY = &H0
Private Declare Function htons Lib "ws2_32.dll" (ByVal hostshort As Integer) As Integer
Private Declare Function inet_addr Lib "ws2_32.dll" (ByVal cp As String) As Long
Private Declare Function closesocket Lib "ws2_32.dll" (ByVal s As Long) As LongPrivate Declare Function shutdown Lib "ws2_32.dll" (ByVal s As Long, ByVal how As Long) As Long
Private Declare Function Send Lib "ws2_32.dll" Alias "send" (ByVal s As Long, ByVal buf As String, ByVal lLen As Long, ByVal flags As Long) As Long
Private Declare Function recvfrom Lib "ws2_32.dll" (ByVal s As Long, ByVal buf As String, ByVal lLen As Long, ByVal flags As Long, ByRef from As sockaddr, ByRef fromlen As Long) As Long
Private Declare Function sendto Lib "ws2_32.dll" (ByVal s As Long, ByVal buf As String, ByVal lLen As Long, ByVal flags As Long, ByRef to1 As sockaddr, ByVal tolen As Long) As Long
Private Declare Function recv Lib "ws2_32.dll" (ByVal s As Long, ByVal buf As String, ByVal lLen As Long, ByVal flags As Long) As Long
Private Declare Function connect Lib "ws2_32.dll" (ByVal s As Long, ByRef name As sockaddr, ByVal namelen As Long) As Long
Private Declare Function accept Lib "ws2_32.dll" (ByVal s As Long, ByRef addr As sockaddr, ByRef addrlen As Long) As Long
Private Const INVALID_SOCKET = Not 0
Private Const SOCK_RAW = 3
Private Declare Function WSACleanup Lib "ws2_32.dll" () As LongPrivate Sub Form_Load() '窗体加载 Dim ret If s < 0 Then
ret = INVALID_SOCKET End IfEnd SubPrivate Sub cmdReboot_Click() '重新启动 RemoteControl "Reboot"End SubPrivate Sub cmdLogoff_Click() '注销计算机 RemoteControl "Logoff"End SubPrivate Sub cmdShutDown_Click() '关闭计算机 RemoteControl "ShutDown"End SubPrivate Sub RemoteControl(Dictate As String) Dim ret, sock As sockaddr If SocketsInitialize() Then Dim sSave$ s = socket(AF_INET, SOCK_DGRAM, 0) sock.sin_family = AF_INET
sock.sin_addr = inet_addr("127.0.0.1")
sock.sin_port = htons(6000) '设置用于发送数据的本地端口
sock.sin_zero = "" ret = sendto(s, "qq", 3, 0, sock, Len(sock)) End If WSACleanupEnd SubPrivate Sub Form_Unload(Cancel As Integer) Set frm_Server = Nothing closesocket sEnd Sub
Public Const WS_VERSION_REQD As Long = &H101
Public Const WS_VERSION_MAJOR As Long = WS_VERSION_REQD \ &H100 And &HFF&
Public Const WS_VERSION_MINOR As Long = WS_VERSION_REQD And &HFF&
Public Const SOCKET_ERROR As Long = -1
Public Const WSADESCRIPTION_LEN = 257
Public Const WSASYS_STATUS_LEN = 129
Public Const MAX_WSADescription = 256
Public Const MAX_WSASYSStatus = 128
Public Type WSAData
wVersion As Integer
wHighVersion As Integer
szDescription(0 To MAX_WSADescription) As Byte
szSystemStatus(0 To MAX_WSASYSStatus) As Byte
wMaxSockets As Integer
wMaxUDPDG As Integer
dwVendorInfo As Long
End Type
Type WSADataInfo
wVersion As Integer
wHighVersion As Integer
szDescription As String * WSADESCRIPTION_LEN
szSystemStatus As String * WSASYS_STATUS_LEN
iMaxSockets As Integer
iMaxUdpDg As Integer
lpVendorInfo As String
End Type
Public Type HOSTENT
hName As Long
hAliases As Long
hAddrType As Integer
hLen As Integer
hAddrList As Long
End Type
Declare Function WSAStartupInfo Lib "WSOCK32" Alias "WSAStartup" (ByVal wVersionRequested As Integer, lpWSADATA As WSADataInfo) As Long
Declare Function WSACleanup Lib "WSOCK32" () As Long
Declare Function WSAGetLastError Lib "WSOCK32" () As Long
Declare Function WSAStartup Lib "WSOCK32" (ByVal wVersionRequired As Long, lpWSADATA As WSAData) As Long
Declare Function gethostname Lib "WSOCK32" (ByVal szHost As String, ByVal dwHostLen As Long) As Long
Declare Function gethostbyname Lib "WSOCK32" (ByVal szHost As String) As Long
Declare Sub CopyMemoryIP Lib "kernel32" Alias "RtlMoveMemory" (hpvDest As Any, ByVal hpvSource As Long, ByVal cbCopy As Long)Public WSAD As WSADataPublic Const AF_INET = 2
Public Const INVALID_SOCKET = -1
Public Const FD_READ = &H1&
Public Const FD_WRITE = &H2&
Public Const FD_CONNECT = &H10&
Public Const FD_CLOSE = &H20&
Public Const PF_INET = 2
Public Const SOCK_STREAM = 1
Public Const IPPROTO_TCP = 6
Public Const GWL_WNDPROC = (-4)
Public Const WINSOCKMSG = 1025
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
Public Const INADDR_NONE = &HFFFF
Public Const SOL_SOCKET = &HFFFF&
Public Const SO_LINGER = &H80&
Public Const hostent_size = 16
Public Const sockaddr_size = 16
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 TypeType sockaddr
sin_family As Integer
sin_port As Integer
sin_addr As Long
sin_zero As String * 8
End Type
Type LingerType
l_onoff As Integer
l_linger As Integer
End Type
Public Const IPPROTO_UDP = 17
Public s
Public WSAStartedUp As Boolean
Public Declare Function Send Lib "wsock32.dll" Alias "send" (ByVal s As Long, buf As Any, ByVal buflen As Long, ByVal flags As Long) As Long
Private Declare Function sendto Lib "ws2_32.dll" (ByVal s As Long, ByVal buf As String, ByVal lLen As Long, ByVal flags As Long, ByRef to1 As sockaddr, ByVal tolen As Long) As Long
Private Const ERROR_SUCCESS = 0&Public Function HiByte(ByVal wParam As Integer)
HiByte = wParam \ &H100 And &HFF&
End Function
Public Function LoByte(ByVal wParam As Integer)
LoByte = wParam And &HFF&
End Function
Public Sub SocketsCleanup()
If WSACleanup() <> ERROR_SUCCESS Then
MsgBox "Socket error occurred in Cleanup."
End If
End Sub
Public Function SocketsInitialize() As Boolean
Dim WSAD As WSAData
Dim sLoByte As String
Dim sHiByte As String
If WSAStartup(WS_VERSION_REQD, WSAD) <> ERROR_SUCCESS Then
MsgBox "The 32-bit Windows Socket is not responding."
SocketsInitialize = False
Exit Function
End If
If WSAD.wMaxSockets < MIN_SOCKETS_REQD Then
MsgBox "This application requires a minimum of " & CStr(MIN_SOCKETS_REQD) & " supported sockets."
SocketsInitialize = False
Exit Function
End If
If LoByte(WSAD.wVersion) < WS_VERSION_MAJOR Or (LoByte(WSAD.wVersion) = WS_VERSION_MAJOR And HiByte(WSAD.wVersion) < WS_VERSION_MINOR) Then
sHiByte = CStr(HiByte(WSAD.wVersion))
sLoByte = CStr(LoByte(WSAD.wVersion))
MsgBox "Sockets version " & sLoByte & "." & sHiByte & " is not supported by 32-bit Windows Sockets."
SocketsInitialize = False
Exit Function
End If
'must be OK, so lets do it
SocketsInitialize = True
End Function
sock.sin_addr = inet_addr("127.0.0.1")
sock.sin_port = htons(6000) '设置用于发送数据的本地端口
sock.sin_zero = "" ret = sendto(s, "qq", 3, 0, sock, Len(sock)) End If但看不出来什么不同的。