Технические вопросы и ответы QA1165

Интернет-скорость соединения

Q: На Mac OS X, как я получаю скорость модемного соединения? Я хочу получить то же значение то интернет-Подключение дисплеи.

A: Можно получить эту информацию от динамической памяти платформы Конфигурации системы. Когда модем соединяется, контроллер PPP хранит скорость соединения в kSCPropNetModemConnectSpeed свойство kSCEntNetModem объект состояния сетевой службы. Код в Перечислении 1 распечатывает эту информацию для каждой службы подключенного модема.

Перечисление 1  , Получающее скорость модемного соединения

static void PrintConnectionSpeed(const void *key, 
                                 const void *value, 
                                 void *context)
    // A CFDictionaryApplyFunction callback. The key is the SCF 
    // dynamic store key for a modem network service entity. The 
    // value is the entity dictionary. This extracts the connection 
    // speed property from that entity and prints it.
{
    CFStringRef       dynStoreKey;
    CFDictionaryRef   entityDict;
    CFNumberRef       connectionSpeed;
    #pragma unused(context)

    dynStoreKey = (CFStringRef) key;
    entityDict  = (CFDictionaryRef) value;

    assert( CFGetTypeID(dynStoreKey) == CFStringGetTypeID() );
    assert( CFGetTypeID(entityDict) == CFDictionaryGetTypeID() );

    connectionSpeed = (CFNumberRef) CFDictionaryGetValue(entityDict, 
                                       kSCPropNetModemConnectSpeed);
    if (connectionSpeed == NULL) {
        // A disconnected modem entity has no connection speed 
        // property. In this example, we simply ignore it.
    } else {
        CFStringRef str;

        assert( CFGetTypeID(connectionSpeed) == CFNumberGetTypeID() );

        str = CFStringCreateWithFormat(NULL, NULL, 
                                       CFSTR("%@ = %@"), 
                                       dynStoreKey, 
                                       connectionSpeed);
        assert(str != NULL);

        CFShow(str);

        CFQRelease(str);
    }
}

int main (int argc, const char * argv[])
{
    OSStatus            err;
    SCDynamicStoreRef   store;
    CFStringRef         pattern;
    CFArrayRef          patterns;
    CFDictionaryRef     dictOfModemEntities;

    dictOfModemEntities = NULL;
    pattern  = NULL;
    patterns = NULL;

    // Connect to the dynamic store.

    store = SCDynamicStoreCreate(NULL, CFSTR("ConnectionSpeedTest"), 
                                                        NULL, NULL);
    err = MoreSCError(store);

    // Set pattern to "State:/Network/Service/[^/]+/Modem" and 
    // then put it into a CFArray.

    if (err == noErr) {
        pattern = SCDynamicStoreKeyCreateNetworkServiceEntity(NULL, 
                                        kSCDynamicStoreDomainState, 
                                        kSCCompAnyRegex,
                                        kSCEntNetModem);
        err = MoreSCError(pattern);
    }
    if (err == noErr) {
        patterns = CFArrayCreate(NULL, (const void **) &pattern, 1, 
                                            &kCFTypeArrayCallBacks);
        err = CFQError(patterns);
    }

    // Get all of the modem network service entities from the 
    // dynamic store and print the results.

    if (err == noErr) {
        dictOfModemEntities = SCDynamicStoreCopyMultiple(store, 
                                                    NULL, patterns);
        err = MoreSCError(dictOfModemEntities);
    }
    if (err == noErr) {
        CFDictionaryApplyFunction(dictOfModemEntities, 
                                        PrintConnectionSpeed, NULL);
    }

    // Clean up.

    CFQRelease(store);
    CFQRelease(pattern);
    CFQRelease(patterns);
    CFQRelease(dictOfModemEntities);

    return (err != noErr);
}

Этот код использует три функции помощника (CFQError, CFQRelease, MoreSCError) от примера кода DTS «MoreSCF».



История версии документа


ДатаПримечания
01.08.2011

Переформатированное содержание и внесло незначительные редакционные изменения.

26.03.2003

Новый документ, описывающий, как получить скорость модемного соединения от динамической памяти платформы Конфигурации системы.