Привязка / прослушивание порта в Mac OSX Lion 10.7.2 завершается неудачно
Я пытаюсь настроить сервер политики SilverLight под MacOSX 10.7.2 (Lion). Для этого необходимо, чтобы я создал и привязал сокет к порту 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 %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];
}
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