Или как отключить подключенного клиента? С исходящим все понятно, а вот с входящим - нет. И в интернете ни одного примера. Может кто имел дело? В какую сторону смотреть?
Один может перечислять входящие таким путём, например: Код (Text): MPR_SERVER_HANDLE local; MprAdminServerConnect(NULL, &local); RAS_CONNECTION_0* conns = NULL; DWORD nConsRead, nConsTotal; DWORD ResumeHandle = 0; MprAdminConnectionEnum(local, 0, (LPBYTE*)&conns, 0, &nConsRead, &nConsTotal, &ResumeHandle); <...> Отключать, вероятно, можно с помощью MprAdminPortDisconnect.
функция MprAdminServerConnect возвращает хэндл 0. как я понял из документации эта функция подключается к маршрутиризатору для последующей работы с ним. или я не правильно понял? дело в том, что у меня прямое соединение по последовательному порту.
В таких необходимость смотреть код возвращаемой ошибки, ага? Впрочем, судя по докам, причин может быть две: либо не бежит служба Routing and Remote Access (RemoteAccess), либо мало прав (у нас работало из-под системной службы; вероятно, достаточно какого-нибудь подмножества прав администратора). Мы пользовали для перечисления входящих подключений к обыкновенному модему. Никогда детально не разбирали это. По идее dial-in есть dial-in. Поэкспериментируй — расскажешь.
Sol_Ksacap, ты с самого начала был прав. Это то, что мне было нужно. а хэндл я получал 0, потому что действительно не работала служба маршрутиризации и удаленного доступа. На компе завелся вирус и у меня подозрения, что он как-то косвенно на нее влияет, служба либо запускается, потом сразу останавливается, либо не запускается вообще. Не суть, этот вопрос решен. Вот мой вариант кода, правда на делфи. Код (Text): type RAS_PORT_0 = record hPort:THandle; hConnection:THandle; dwPortCondition:DWORD; dwTotalNumberOfCalls:DWORD; dwConnectDuration:DWORD; wszPortName:array[0..16] of WCHAR; wszMediaName:array[0..16] of WCHAR; wszDeviceName:array[0..128] of WCHAR; wszDeviceType:array[0..16] of WCHAR; end; type RAS_CONNECTION_0 = record hConnection:THandle; hInterface:THandle; dwConnectDuration:DWORD; dwInterfaceType:DWORD; dwConnectionFlags:DWORD; wszInterfaceName:array[0..256] of WCHAR; wszUserName:array[0..256] of WCHAR; wszLogonDomain:array[0..15] of WCHAR; wszRemoteComputer:array[0..16] of WCHAR; end; function MprAdminServerConnect(lpwsServerName:PWideString;phMprServer:PHandle):LongInt;stdcall; external 'mprapi.dll' name 'MprAdminServerConnect'; function MprAdminPortEnum(hRasServer:THandle; dwLevel:DWORD; hConnection:THandle; var lplpBuffer:Pointer; dwPrefMaxLen:DWORD; lpdwEntriesRead:PDWORD; lpdwTotalEntries:PDWORD; lpdwResumeHandle:PDWORD):LongInt; stdcall; external 'mprapi.dll' name 'MprAdminPortEnum'; function MprAdminConnectionEnum(hRasServer:THandle; dwLevel:DWORD; var lplpBuffer:Pointer; dwPrefMaxLen:DWORD; lpdwEntriesRead:PDWORD; lpdwTotalEntries:PDWORD; lpdwResumeHandle:PDWORD):LongInt;stdcall; external 'mprapi.dll' name 'MprAdminConnectionEnum'; function MprAdminPortDisconnect(hRasServer:THandle;hPort:THandle):LongInt; stdcall; external 'mprapi.dll' name 'MprAdminPortDisconnect'; function MprAdminServerDisconnect(hMprServer:THandle):LongInt;stdcall; external 'mprapi.dll' name 'MprAdminServerDisconnect'; procedure ResetClient; var local:THandle; conns:RAS_CONNECTION_0; CRead,CTotal,CResumeH:DWORD; z,c:pointer; ports:RAS_PORT_0; ERead,ETotal,EResumeH:DWORD; rez:integer; begin CResumeH:=0; EResumeH:=0; local:=0; MprAdminServerConnect(nil,@local); MprAdminConnectionEnum(local,0,z,DWORD(-1),@CRead,@CTotal,@CResumeH); conns:=RAS_CONNECTION_0(z^); rez:=MprAdminPortEnum(local,0,conns.hConnection,c,DWORD(-1),@ERead,@ETotal,@EResumeH); if rez = 0 then begin ports:=RAS_PORT_0(c^); MprAdminPortDisconnect(local,ports.hPort); end; MprAdminServerDisconnect(local); end;