2011-11-20 93 views
1

我试图在MacOSX 10.7.2(Lion)下设置一个SilverLight策略服务器。这要求我创建一个套接字并将其绑定到端口943,因为SilverLight会在此端口上请求策略文件。不幸的是,似乎我无法在该端口绑定,因为绑定调用失败,我想我无法访问此端口。也许我需要root权限?或者我需要将这个端口转发给另一个我可以绑定的端口?我对网络编程有点新,所以任何帮助都非常感谢!我也附上我的源代码。也许我做错了什么,但如果我使用SilverLight受限制的端口4502-4532,SilverLight在策略文件成功提供后进行通信时就可以正常工作。在Mac OSX Lion 10.7.2中绑定/侦听端口失败

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

回答

2

只有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 
+0

谢谢!是的,如果我用sudo运行它,它不会再失败。另外,我发现我必须首先将sockaddr_in结构清零并设置sin_len字段。然后,在使用sudo运行之前,我实际上正在获取errno = 13,这被拒绝。再次感谢您的回复。 –

+0

没问题 - 因为这对你有用,你可以接受我的答案,以便其他人更容易找到解决方案。 – James

+0

绝对......我选择了绿色复选标记,我认为这是一个窍门。但是,我想知道是否有办法在没有root权限的情况下完成此操作。例如,也许通过将端口943转发到某个不需要root访问权限的端口? –