Mac OSX Lion 10.7.2操作系统绑定/监听端口失败



我正在尝试在MacOSX 10.7.2 (Lion)下设置SilverLight策略服务器。这需要我创建一个套接字并将其绑定到端口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 %dn", 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];
}

只有root具有1024以下端口的权限。试着用sudo运行你的代码,看看是否能解决你的问题。

编辑:

另外,查看man strerror。它将接收那些相对无意义的错误代码,并为您提供一个(稍微)更有用的字符串。

#include <stdio.h>
#include <string.h>
int main (int argc, char const *argv[])
{
  printf("%sn", strerror(49) );
  return 0;
}

给:

Can't assign requested address

相关内容

  • 没有找到相关文章

最新更新