1

MacOSX 10.7.2(Lion)でSilverLightポリシーサーバーをセットアップしようとしています。これには、SilverLightがこのポートでポリシーファイルを要求するため、ソケットを作成してポート943にバインドする必要があります。残念ながら、errno=49. このポートにアクセスできないと思われるため、バインド呼び出しが失敗するため、そのポートでバインドできないようです。おそらく私はroot特権が必要ですか?または、このポートをバインドできる別のポートに転送する必要がありますか?私はネットワークプログラミングに少し慣れていないので、どんな助けでも大歓迎です!ソースコードも添付しました。おそらく私は何か間違ったことをしていますが、ポリシーファイルが正常に提供されるとSilverLightが通信するSilverLight制限付きポート4502-4532を使用すると正常に機能します。

- (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];
}
4

1 に答える 1

3

root1024 未満のポートに対する権限のみがあります。コードを実行してみて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
于 2011-11-20T00:46:27.077 に答える