Objective c 绑定套接字时出错:NSPOSIXErrorDomain Code=1;“不允许操作”;

Objective c 绑定套接字时出错:NSPOSIXErrorDomain Code=1;“不允许操作”;,objective-c,gcdasyncsocket,Objective C,Gcdasyncsocket,我正在尝试实现MacOSX(Mojave10.14.3)应用程序来侦听来自localhost:port的数据 问题是,无论我选择哪个端口,我总是会出现以下错误: Error Domain=NSPOSIXErrorDomain Code=1 "Operation not permitted" UserInfo={NSLocalizedDescription=Operation not permitted, NSLocalizedFailureReason=Error in bind() func

我正在尝试实现MacOSX(Mojave10.14.3)应用程序来侦听来自localhost:port的数据

问题是,无论我选择哪个端口,我总是会出现以下错误:

Error Domain=NSPOSIXErrorDomain Code=1 "Operation not permitted"
UserInfo={NSLocalizedDescription=Operation not permitted, 
NSLocalizedFailureReason=Error in bind() function}
我已经试过了,但没用

以下是我在AppDelegate.mm中的实现:

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification {
    listenSocket = [[GCDAsyncSocket alloc] initWithDelegate:(id<GCDAsyncSocketDelegate>) self delegateQueue:dispatch_get_main_queue()];
    connectedSockets = [[NSMutableArray alloc] initWithCapacity:1];
    isRunning = NO;
    NSError *err = nil;
    if (![listenSocket connectToHost:@"localhost" onPort:12345 error:&err]){
        NSLog(@"I goofed: %@", err);
    }
}

-(void)getData{
    if(!isRunning)
    {
        int port = 12345;
        if(port < 0 || port > 65535)
        {
            port = 0;
        }
        NSError *error = nil;
        if(![listenSocket acceptOnPort:port error:&error])
        {
            NSLog(@"error: %@", FORMAT(@"Error starting server: %@", error));
            return;
        }
        NSLog(@"error: %@", FORMAT(@"Echo server started on port %hu", [listenSocket localPort]));
        isRunning = YES;
    }
    else
    {
        // Stop accepting connections
        [listenSocket disconnect];

        // Stop any client connections
        NSUInteger i;
        for(i = 0; i < [connectedSockets count]; i++)
        {
            [[connectedSockets objectAtIndex:i] disconnect];
        }
        NSLog(@"Stopped Echo server");
        isRunning = false;
    }
}

- (void)onSocket:(GCDAsyncSocket *)sock didAcceptNewSocket:(GCDAsyncSocket *)newSocket
{
    [connectedSockets addObject:newSocket];
}

- (void)onSocket:(GCDAsyncSocket *)sock didConnectToHost:(NSString *)host port:(UInt16)port
{
    NSLog(FORMAT(@"Accepted client %@:%hu", host, port));
    NSString *welcomeMsg = @"Welcome to the AsyncSocket Echo Server\r\n";
    NSData *welcomeData = [welcomeMsg dataUsingEncoding:NSUTF8StringEncoding];

    [sock writeData:welcomeData withTimeout:-1 tag:WELCOME_MSG];

    [sock readDataToData:[GCDAsyncSocket CRLFData] withTimeout:READ_TIMEOUT tag:0];
}

- (void)onSocket:(GCDAsyncSocket *)sock didWriteDataWithTag:(long)tag
{
    if(tag == ECHO_MSG)
    {
        [sock readDataToData:[GCDAsyncSocket CRLFData] withTimeout:READ_TIMEOUT tag:0];
    }
}

- (void)onSocket:(GCDAsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag
{
    NSData *strData = [data subdataWithRange:NSMakeRange(0, [data length] - 2)];
    NSString *msg = [[NSString alloc] initWithData:strData encoding:NSUTF8StringEncoding];
    if(msg)
    {
        NSLog(@"msg %@", msg);
    }
    else
    {
        NSLog(@"Error converting received data into UTF-8 String");
    }

    // Even if we were unable to write the incoming data to the log,
    // we're still going to echo it back to the client.
    [sock writeData:data withTimeout:-1 tag:ECHO_MSG];
}

- (NSTimeInterval)onSocket:(GCDAsyncSocket *)sock
  shouldTimeoutReadWithTag:(long)tag
                   elapsed:(NSTimeInterval)elapsed
                 bytesDone:(NSUInteger)length
{
    if(elapsed <= READ_TIMEOUT)
    {
        NSString *warningMsg = @"Are you still there?\r\n";
        NSData *warningData = [warningMsg dataUsingEncoding:NSUTF8StringEncoding];

        [sock writeData:warningData withTimeout:-1 tag:WARNING_MSG];

        return READ_TIMEOUT_EXTENSION;
    }

    return 0.0;
}

- (void)onSocket:(GCDAsyncSocket *)sock willDisconnectWithError:(NSError *)err
{
    NSLog(FORMAT(@"Client Disconnected: %@:%hu", [sock connectedHost], [sock connectedPort]));
}

- (void)onSocketDidDisconnect:(GCDAsyncSocket *)sock
{
    [connectedSockets removeObject:sock];
}
-(无效)应用程序设计完成启动:(NSNotification*)通知{
listenSocket=[[GCDAsyncSocket alloc]initWithDelegate:(id)self delegateQueue:dispatch_get_main_queue();
connectedSockets=[[NSMutableArray alloc]initWithCapacity:1];
isRunning=否;
n错误*err=nil;
如果(![listenSocket connectToHost:@“localhost”on端口:12345错误:&错误]){
NSLog(@“I goofed:%@),err);
}
}
-(void)获取数据{
如果(!正在运行)
{
int端口=12345;
如果(端口<0 | |端口>65535)
{
端口=0;
}
n错误*错误=nil;
if(![listenSocket acceptOnPort:端口错误:&错误])
{
NSLog(@“错误:%@”,格式(@“错误启动服务器:%@”,错误));
返回;
}
NSLog(@“error:%@”,格式(@“Echo server started on port%hu”,[listenSocket localPort]);
isRunning=是;
}
其他的
{
//停止接受连接
[listenSocket disconnect];
//停止任何客户端连接
NSUI;
对于(i=0;i<[connectedSockets计数];i++)
{
[[connectedSockets对象索引:i]断开];
}
NSLog(@“已停止的回显服务器”);
isRunning=false;
}
}
-(void)onSocket:(GCDAsyncSocket*)sock didAcceptNewSocket:(GCDAsyncSocket*)newSocket
{
[connectedSockets添加对象:newSocket];
}
-(void)onSocket:(GCDAsyncSocket*)sock didConnectToHost:(NSString*)主机端口:(UInt16)端口
{
NSLog(格式(@“接受的客户端%@:%hu”,主机,端口));
NSString*welcomeMsg=@“欢迎使用AsyncSocket Echo服务器\r\n”;
NSData*welcomeData=[welcomeMsg dataUsingEncoding:NSUTF8StringEncoding];
[sock writeData:welcomeData with Timeout:-1标记:WELCOME_MSG];
[sock readDataToData:[GCDAsyncSocket CRLFData]带超时:读取超时标记:0];
}
-(void)onSocket:(GCDAsyncSocket*)sock didWriteDataWithTag:(long)标记
{
如果(标记==ECHO\u MSG)
{
[sock readDataToData:[GCDAsyncSocket CRLFData]带超时:读取超时标记:0];
}
}
-(void)onSocket:(GCDAsyncSocket*)sock didReadData:(NSData*)带标记的数据:(long)标记
{
NSData*strData=[数据子数据范围:NSMakeRange(0[数据长度]-2)];
NSString*msg=[[NSString alloc]initWithData:strData编码:NSUTF8StringEncoding];
如果(味精)
{
NSLog(@“msg%@”,msg);
}
其他的
{
NSLog(@“将接收到的数据转换为UTF-8字符串时出错”);
}
//即使我们无法将传入数据写入日志,
//我们仍将把它回显给客户。
[sock writeData:data with timeout:-1标记:ECHO_MSG];
}
-(NSTimeInterval)onSocket:(GCDAsyncSocket*)sock
shouldTimeoutReadWithTag:(长)标记
已用时间:(NSTimeInterval)已用时间
bytesDone:(整数)长度
{

如果(经过您应该启用应用程序沙盒的网络功能

macOS Catalina版本10.15.3

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification {
    listenSocket = [[GCDAsyncSocket alloc] initWithDelegate:(id<GCDAsyncSocketDelegate>) self delegateQueue:dispatch_get_main_queue()];
    connectedSockets = [[NSMutableArray alloc] initWithCapacity:1];
    isRunning = NO;
    NSError *err = nil;
    if (![listenSocket connectToHost:@"localhost" onPort:12345 error:&err]){
        NSLog(@"I goofed: %@", err);
    }
}

-(void)getData{
    if(!isRunning)
    {
        int port = 12345;
        if(port < 0 || port > 65535)
        {
            port = 0;
        }
        NSError *error = nil;
        if(![listenSocket acceptOnPort:port error:&error])
        {
            NSLog(@"error: %@", FORMAT(@"Error starting server: %@", error));
            return;
        }
        NSLog(@"error: %@", FORMAT(@"Echo server started on port %hu", [listenSocket localPort]));
        isRunning = YES;
    }
    else
    {
        // Stop accepting connections
        [listenSocket disconnect];

        // Stop any client connections
        NSUInteger i;
        for(i = 0; i < [connectedSockets count]; i++)
        {
            [[connectedSockets objectAtIndex:i] disconnect];
        }
        NSLog(@"Stopped Echo server");
        isRunning = false;
    }
}

- (void)onSocket:(GCDAsyncSocket *)sock didAcceptNewSocket:(GCDAsyncSocket *)newSocket
{
    [connectedSockets addObject:newSocket];
}

- (void)onSocket:(GCDAsyncSocket *)sock didConnectToHost:(NSString *)host port:(UInt16)port
{
    NSLog(FORMAT(@"Accepted client %@:%hu", host, port));
    NSString *welcomeMsg = @"Welcome to the AsyncSocket Echo Server\r\n";
    NSData *welcomeData = [welcomeMsg dataUsingEncoding:NSUTF8StringEncoding];

    [sock writeData:welcomeData withTimeout:-1 tag:WELCOME_MSG];

    [sock readDataToData:[GCDAsyncSocket CRLFData] withTimeout:READ_TIMEOUT tag:0];
}

- (void)onSocket:(GCDAsyncSocket *)sock didWriteDataWithTag:(long)tag
{
    if(tag == ECHO_MSG)
    {
        [sock readDataToData:[GCDAsyncSocket CRLFData] withTimeout:READ_TIMEOUT tag:0];
    }
}

- (void)onSocket:(GCDAsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag
{
    NSData *strData = [data subdataWithRange:NSMakeRange(0, [data length] - 2)];
    NSString *msg = [[NSString alloc] initWithData:strData encoding:NSUTF8StringEncoding];
    if(msg)
    {
        NSLog(@"msg %@", msg);
    }
    else
    {
        NSLog(@"Error converting received data into UTF-8 String");
    }

    // Even if we were unable to write the incoming data to the log,
    // we're still going to echo it back to the client.
    [sock writeData:data withTimeout:-1 tag:ECHO_MSG];
}

- (NSTimeInterval)onSocket:(GCDAsyncSocket *)sock
  shouldTimeoutReadWithTag:(long)tag
                   elapsed:(NSTimeInterval)elapsed
                 bytesDone:(NSUInteger)length
{
    if(elapsed <= READ_TIMEOUT)
    {
        NSString *warningMsg = @"Are you still there?\r\n";
        NSData *warningData = [warningMsg dataUsingEncoding:NSUTF8StringEncoding];

        [sock writeData:warningData withTimeout:-1 tag:WARNING_MSG];

        return READ_TIMEOUT_EXTENSION;
    }

    return 0.0;
}

- (void)onSocket:(GCDAsyncSocket *)sock willDisconnectWithError:(NSError *)err
{
    NSLog(FORMAT(@"Client Disconnected: %@:%hu", [sock connectedHost], [sock connectedPort]));
}

- (void)onSocketDidDisconnect:(GCDAsyncSocket *)sock
{
    [connectedSockets removeObject:sock];
}