Свързването/слушането на порт в Mac OSX Lion 10.7.2 е неуспешно

Опитвам се да настроя сървър за правила SilverLight под MacOSX 10.7.2 (Lion). Това изисква да създам и обвържа сокет към порт 943, тъй като SilverLight изисква файла с политики на този порт. За съжаление, изглежда, че не мога да се обвържа на този порт, тъй като извикването за свързване е неуспешно с errno=49. Предполагам, че нямам достъп до този порт. Може би имам нужда от root привилегии? Или трябва да препратя този порт към друг, който мога да обвържа? Аз съм малко нов в мрежовото програмиране, така че всяка помощ е високо ценена! Прикачих и своя изходен код. Може би правя нещо нередно, въпреки че работи добре, ако използвам ограничените портове 4502-4532 на SilverLight, по които 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