【问题标题】:MacOSX: creating a CFStream/NSStream with specific client and server portsMacOSX:创建具有特定客户端和服务器端口的 CFStream/NSStream
【发布时间】:2013-06-07 09:03:20
【问题描述】:

我正在尝试将(POSIX/winsocks)基于套接字的 TCP/IP 协议的客户端转换为本地 Mac OS X 框架。在这个协议下,一个客户端端口被设置在一个指定的端口,然后这个套接字在另一个端口连接到服务器。基本上(删除了错误检查):

InitCommClient( SOCK *clnt, char *address, unsigned short serverPortNr, unsigned short clientPortNr, int timeOutMS )
{
    CreateClient( clnt, clientPortNr );
    ConnectToServer( *clnt, serverPortNr, address, timeOutMS );
}

CreateClient(SOCK *s, unsigned short port )
{ int yes=1;
    *s = socket( AF_INET, SOCK_STREAM, 0 );
    setsockopt( *s, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(yes) );
    // set up lsock - htons(port), AF_INIT
    bind( *s, (SOCKADDR*)&lsock, sizeof(SOCKADDR_IN) );
    { int delay_flag = fcntl(*s, F_GETFL, 0);
      delay_flag |= O_NONBLOCK;
        fcntl( *s, F_SETFL, delay_flag );
    }
}

CreateServer(SOCK *s, unsigned short port )
{ int yes=1;
    *s = socket( AF_INET, SOCK_STREAM, 0 );
    // set up lsock - htons(port), AF_INIT
    bind( *s, (SOCKADDR*)&lsock, sizeof(SOCKADDR_IN) );
    listen( *s, 3 );
    { int delay_flag = fcntl(*s, F_GETFL, 0);
      delay_flag |= O_NONBLOCK;
        fcntl( *s, F_SETFL, delay_flag );
    }
}

ConnectToServer(SOCK s, unsigned short port, const char *address, int timeOutms)
{
    // set up fsock - inet_addr(address), htons(port), AF_INET
    errSock = connect( s, (SOCKADDR*)&fsock, sizeof(SOCKADDR_IN) );
    // handle EINPROGRESS, EWOULDBLOCK, EISCONN and ECONNREFUSED, waiting for socket to become writable
}

当我使用这些功能时,我与运行在 MS Windows 上(或在 Wine 下)的服务器建立了有效连接(尽管看起来我需要以与在 winsocks 下的方式有所不同的方式处理 ECONNREFUSED)。

我也可以将创建的socket传递给CFStreamCreatePairWithSocket来获得一个功能性的NSInputStream、NSOutputStream对:

InitCommClient( &sServer, ipAddress, ServerPortNr, ClientPortNr, 50 );
CFStreamCreatePairWithSocket( NULL, sServer, (CFReadStreamRef*) &nsReadServer, (CFWriteStreamRef*) &nsWriteServer );

是否可以直接创建该对,如果可以,如何创建?目前我只设法使用

获得功能性 NSInputStream
CFStreamCreatePairWithSocketToHost( NULL, (CFStringRef) [NSString stringWithUTF8String:ipAddress], ServerPortNr,
                                (CFReadStreamRef*) &nsReadServer, (CFWriteStreamRef*) &nsWriteServer );

是否有可能使用高级 CFStream/NSStream 框架无法提供精细控制(客户端和服务器端口规范、超时规范等)?

【问题讨论】:

  • 你有没有成功,因为我现在也有同样的问题。

标签: macos sockets nsstream cfstream


【解决方案1】:

我必须承认它有点(年...)老了,对我来说从来都不是一个真正的高优先级问题,而且我的代码还没有看到任何实际使用情况。这就是我最终的结果

NSInputStream *nsReadServer = NULL;
NSOutputStream *nsWriteServer = NULL;

void commsInit(const char *ipAddress)
{
    InitCommClient( &sServer, ipAddress, ServerPortNr, ClientPortNr, 50 );
    if( sServer != NULLSOCKET ){
        CFStreamCreatePairWithSocket( NULL, sServer, (CFReadStreamRef*) &nsReadServer, (CFWriteStreamRef*) &nsWriteServer );
        [nsReadServer retain]; [nsWriteServer retain];
        [nsReadServer setDelegate:[[OurStreamDelegate alloc] init] ];
        [nsReadServer scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
        [nsReadServer open]; [nsWriteServer open];
    }
}

我看到代码有点乱,因为 InitCommClient 在 C++ 模块中,但显然它在我继续之前所做的测试期间运行良好。

希望这会有所帮助 - 请随时通过 full code 挖掘。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-16
    • 2016-02-15
    • 1970-01-01
    • 2021-08-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多