C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Сетевые программы, Как получить список доступных серверов?
CyberMind
Отправлено: 27.09.2005, 12:49


Не зарегистрирован







Пишу сетевое приложение на CBuilder 5.0 (игра). Использую компоненты TServerSocket, TClientSocket. Мое приложение может быть и клиентом и сервером. Хочу, чтобы когда на каких-то машинах приложение было запущено как сервер, вновь подключаемые игроки видели список доступных серверов — ну как в нормальных игрушках. Как с клиента опросить локалку и получить IP серверов?
Guest
Отправлено: 27.09.2005, 12:55


Не зарегистрирован







Посылка широковещательного сообщения и сбор ответов.
Gedeon
Отправлено: 27.09.2005, 13:12


Ветеран

Группа: Модератор
Сообщений: 1742



Поищи в поиске, Георгий выкладывал пример.
gen
Отправлено: 03.10.2005, 16:04


Дежурный стрелочник

Группа: Участник
Сообщений: 36



Привет

Может повторюсь, но по сети бродил такой код (автора, к сожалению, не знаю):
Вызов — Net(). Результат, к напримеру — в ListBox3

CODE

void __fastcall TForm1::Net(void)
{
ListBox3->Clear();
try
{EnumHandler(ListBox3->Handle,0,NULL);}
catch(...)
{ListBox3->Items->Add("Error of retrieving list hosts");}
}
//---------------------------------------------------------------------------

void GetIP(char *Hostname, char *ToStr)
{
struct ipconvert
{
unsigned char ip[4];
char name[100];
}*ipname;
int version=0x101;
HOSTENT *pHostEnt=0;
WSADATA WSAData;
int nAdapter = 0;
WSAStartup(version,&WSAData);
pHostEnt = gethostbyname( Hostname );
if(pHostEnt)
{
strcat(ToStr+strlen(ToStr)," (");
while ( pHostEnt->h_addr_list[nAdapter] ) {
// pHostEnt->h_addr_list[nAdapter] -the current address in host order
ipname =(ipconvert *)pHostEnt->h_addr_list[nAdapter];
wsprintf(ToStr+strlen(ToStr),"%d:%d:%d:%d",
ipname->ip[0],ipname->ip[1],ipname->ip[2],ipname->ip[3]);
nAdapter++;
if(pHostEnt->h_addr_list[nAdapter])
strcat(ToStr+strlen(ToStr),",");
}
strcat(ToStr+strlen(ToStr),")");
}
WSACleanup();
}
// ----------------------------------------------------------------------------

bool TForm1::EnumHandler(HWND hWnd, DWORD dwLevel, LPNETRESOURCE lpNet)
{
//Список хостов
  BOOL ret=TRUE;
  DWORD dwStatus, dwSize, dwEntries, i, j;
  LPSTR lpStr=NULL;
  LPNETRESOURCE lpNewNet=NULL;
  HANDLE hEnum=NULL;

  dwStatus = WNetOpenEnum(RESOURCE_GLOBALNET,RESOURCETYPE_ANY,0, lpNet, &hEnum );
  if( dwStatus != NO_ERROR ){ ret=FALSE; goto mend; }
  dwEntries = 1000;
  dwSize = sizeof(NETRESOURCE) * dwEntries;
  lpNewNet=(LPNETRESOURCE)new char[dwSize];
  if(!lpNewNet){ ret=FALSE; goto mend; }
  dwStatus = WNetEnumResource( hEnum, &dwEntries, (LPVOID)lpNewNet, &dwSize );
  if( dwStatus != NO_ERROR )
  {ret=FALSE; goto mend;}
  WNetCloseEnum(hEnum);
  hEnum=NULL;

  lpStr=new char[512];
  if(!lpStr){ ret=FALSE; goto mend; }
  for( i = 0; i < dwEntries; i++ )
  {
    if( lpNewNet[ i ].dwDisplayType==RESOURCEDISPLAYTYPE_NETWORK)
    {strcpy( lpStr, lpNewNet[ i ].lpProvider );}

     if( lpNewNet[ i ].lpRemoteName )
     {
        if( lpNewNet[ i ].dwDisplayType == RESOURCEDISPLAYTYPE_DOMAIN )
        {strcpy( lpStr, "Domain..." );}
        if( lpNewNet[ i ].dwDisplayType == RESOURCEDISPLAYTYPE_GENERIC )
        {strcpy( lpStr, "Generic.." );}
        if( lpNewNet[ i ].dwDisplayType == RESOURCEDISPLAYTYPE_SERVER )
        {strcpy( lpStr, "Server..." );}
        if( lpNewNet[ i ].dwDisplayType == RESOURCEDISPLAYTYPE_SHARE )
        {strcpy( lpStr, "Share...." );}
        for( j = 0; j < dwLevel; j++ )
        strcat( lpStr, "......" );
        strcat( lpStr, lpNewNet[ i ].lpRemoteName );
       //+ IP к концу сртроки
       if(lpNewNet[i].dwDisplayType == RESOURCEDISPLAYTYPE_SERVER)
        {GetIP(&lpNewNet[i].lpRemoteName[2],lpStr);}
     }
     SendMessage( hWnd, LB_ADDSTRING, 0,(LPARAM)lpStr );
     UpdateWindow(hWnd);
     // уровень детализации
     if(dwLevel < 2) //0=Сеть,1=Domain,2=Host,3=Resource
     {EnumHandler( hWnd, dwLevel + 1, lpNewNet + i );}
  }
mend:
  if(hEnum)WNetCloseEnum( hEnum );
  if(lpStr)delete lpStr;
  if(lpNewNet)delete lpNewNet;
  return ret;
}
//-------------------------------------------------------------
[/CODE][/CODE][/CODE]

Вернуться в Вопросы программирования в C++Builder