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];
}
谢谢!是的,如果我用sudo运行它,它不会再失败。另外,我发现我必须首先将sockaddr_in结构清零并设置sin_len字段。然后,在使用sudo运行之前,我实际上正在获取errno = 13,这被拒绝。再次感谢您的回复。 –
没问题 - 因为这对你有用,你可以接受我的答案,以便其他人更容易找到解决方案。 – James
绝对......我选择了绿色复选标记,我认为这是一个窍门。但是,我想知道是否有办法在没有root权限的情况下完成此操作。例如,也许通过将端口943转发到某个不需要root访问权限的端口? –