Ошибка привязки/прослушивания порта в Mac OSX Lion 10.7.2

Я пытаюсь настроить сервер политик SilverLight под MacOSX 10.7.2 (Lion). Для этого необходимо создать и привязать сокет к порту 943, так как SilverLight запрашивает файл политики на этом порту. К сожалению, похоже, я не могу выполнить привязку к этому порту, так как вызов привязки завершается с ошибкой errno=49.. Я полагаю, что у меня нет доступа к этому порту. Возможно, мне нужны root-права? Или мне нужно перенаправить этот порт на другой, который я могу привязать? Я немного новичок в сетевом программировании, поэтому любая помощь приветствуется! Я также прикрепил исходный код. Возможно, я делаю что-то не так, хотя все работает нормально, если я использую ограниченные порты SilverLight 4502-4532, через которые SilverLight связывается после успешного обслуживания файла политики.

- (void) start {
    CFSocketRef socket = CFSocketCreate(kCFAllocatorDefault, PF_INET, SOCK_STREAM, IPPROTO_TCP, 0, NULL, NULL);
    if (!socket) {
        [self errorWithName:@"Unable to create socket."];
        return;
    }

    int reuse = true;
    CFSocketNativeHandle fileDescriptor = CFSocketGetNative(socket);
    if (setsockopt(fileDescriptor, SOL_SOCKET, SO_REUSEADDR,
                   (void *)&reuse, sizeof(int)) != 0) {
        NSLog(@"Unable to set socket options.");
        return;
    }

    struct sockaddr_in address;
    memset(&address, 0, sizeof(address));
    address.sin_len = sizeof(address);
    address.sin_family = AF_INET;
    address.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
    address.sin_port = htons(943);
    CFDataRef addressData = CFDataCreate(NULL, (const UInt8 *)&address, sizeof(address));
    [(id)addressData autorelease];

    CFSocketError error = CFSocketSetAddress(socket, addressData);
    if (error < 0) {
        NSLog(@"Error bind %d\n", errno);  //fails here for port 943.
        return;
    }

    NSFileHandle *listeningHandle = [[NSFileHandle alloc]
                   initWithFileDescriptor:fileDescriptor
                   closeOnDealloc:YES];

    [[NSNotificationCenter defaultCenter]
          addObserver:self
             selector:@selector(receiveIncomingConnectionNotification:)
                 name:NSFileHandleConnectionAcceptedNotification
               object:nil];

    [listeningHandle acceptConnectionInBackgroundAndNotify];
}

person Peter Jacobs    schedule 20.11.2011    source источник


Ответы (1)


Только root имеет привилегии для портов ниже 1024. Попробуйте запустить свой код с sudo и посмотрите, решит ли это вашу проблему.

Изменить:

Кроме того, проверьте man strerror. Он возьмет этот относительно бессмысленный код ошибки и даст вам (немного) более полезную строку.

#include <stdio.h>
#include <string.h>

int main (int argc, char const *argv[])
{
  printf("%s\n", strerror(49) );
  return 0;
}

Дает:

Can't assign requested address
person James    schedule 20.11.2011
comment
Спасибо! Да, если я запускаю его с помощью sudo, он больше не дает сбоев. Кроме того, я обнаружил, что сначала нужно обнулить структуру sockaddr_in и установить поле sin_len. Затем, прежде чем запускать его с помощью sudo, я фактически получал errno=13, что означает отказ в доступе. Еще раз спасибо за Ваш ответ. - person Peter Jacobs; 20.11.2011
comment
Нет проблем - поскольку это сработало для вас, вы можете принять мой ответ, чтобы другим было легче найти решение. - person James; 20.11.2011
comment
Абсолютно... Я выбрал зеленую галочку, которая, как я полагаю, помогает. Однако мне интересно, есть ли способ сделать это без root-доступа. Например, возможно, путем перенаправления порта 943 на тот, который не требует root-доступа? - person Peter Jacobs; 20.11.2011