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] |
|
|