是否要用多线程,
是否一个Socket发,一个Socket收,
是否可以ping指定端口IP地址组方已存放在
CString addr[255];
ss = ::socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);?//用哪个协议
sockaddr_in servAddr; 
servAddr.sin_family = AF_INET;
servAddr.sin_port = htons(8989);
servAddr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
if(::connect(ss, (sockaddr*)&servAddr, sizeof(servAddr)) == -1)
能否用此种方法PING。此种方法我已经掌握。
主要不明白的就是,对方没有SOCKET在了listen,这边的SOCKET如何才connect并判断对方主机是否开机.
求教,万分感谢

解决方案 »

  1.   

    用端口判断的结果不准,因为你不知道一台活动主机哪个端口打开。最好是向网段内所有主机发送ARP广播
      

  2.   


    void CTestDlg::FindAllComputer(CStringArray& MyList)
    {
    MyList.RemoveAll();
    CString StrTemp;
    struct hostent *host;
    struct in_addr *ptr;
    DWORD dwScope = RESOURCE_CONTEXT;
    NETRESOURCE *NetResource = NULL;
    HANDLE hEnum;
    WNetOpenEnum( dwScope, NULL, NULL, NULL, &hEnum );
    WSADATA wsaData;
    //开始搜索网络资源
    WSAStartup(MAKEWORD(1,1),&wsaData);
    //如果句柄有效
    if ( hEnum )    
    {
    DWORD Count = 0xFFFFFFFF;
    DWORD BufferSize = 2048;
    LPVOID Buffer = new char[2048];
    //调用WSAStartup后调用WNetEnumResource做进一步的搜索工作
    WNetEnumResource( hEnum, &Count, Buffer, &BufferSize );
    NetResource = (NETRESOURCE*)Buffer;
    char StrHostName[200];
    for ( unsigned int i = 0; i < BufferSize/sizeof(NETRESOURCE); i++, NetResource++ )
    {
    if ( NetResource->dwUsage == RESOURCEUSAGE_CONTAINER && NetResource->dwType == RESOURCETYPE_ANY ) {
    if ( NetResource->lpRemoteName )
    {
    CString strFullName = NetResource->lpRemoteName;
    if ( 0 == strFullName.Left(2).Compare("\\\\") )
    strFullName = strFullName.Right(strFullName.GetLength()-2);                    
    //获得主机名
    gethostname( StrHostName, strlen( StrHostName ) );
    //由主机名获得跟它对应的主机信息
    host = gethostbyname(strFullName);
    if(host == NULL) continue; 
    ptr = (struct in_addr *) host->h_addr_list[0];
    // 提取IP地址信息,地址形式如下: 211.40.35.76 
    int a = ptr->S_un.S_un_b.s_b1;  // 211
    int b = ptr->S_un.S_un_b.s_b2;  // 40
    int c = ptr->S_un.S_un_b.s_b3;  // 35
    int d = ptr->S_un.S_un_b.s_b4;  // 76
    StrTemp.Format("%s : %d.%d.%d.%d",strFullName,a,b,c,d);
    // 加入到链表中
    MyList.Add(StrTemp);
    }
    }
    }
    delete Buffer;
    // 结束搜索工作
    WNetCloseEnum( hEnum );
    }
    // 卸载Winsock.dll
    WSACleanup();
    }
      

  3.   


    // SendARP.cpp文件#include <windows.h>
    #include <stdio.h>#include <Iphlpapi.h>
    #pragma comment(lib, "Iphlpapi.lib")
    #pragma comment(lib, "WS2_32.lib")
    void main()
    {
    char szDestIP[] = "192.168.0.151"; // 发送ARP请求
    u_char arDestMac[6] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };
    ULONG ulLen = 6;
    if(::SendARP(::inet_addr(szDestIP), 0, (ULONG*)arDestMac, &ulLen) == NO_ERROR)
    {
    // 已开机 则打印出结果
    u_char *p = arDestMac;
    printf("   pEtherh->shost: %02X-%02X-%02X-%02X-%02X-%02X \n", p[0], p[1], p[2], p[3], p[4], p[5]);
    }
    }