刚学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端口,究竟是哪里错了??

解决方案 »

  1.   


    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,或者不用赋值都可以
      

  2.   

    我试过了,连接的地址和端口都是0,全0控制端我这样写的窗体部分Option ExplicitPrivate Const AF_INET = 2
    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
      

  3.   

    'modulOption ExplicitPublic Const MIN_SOCKETS_REQD As Long = 1
    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
      

  4.   

    问题应该在这里      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但看不出来什么不同的。