簡體   English   中英

MacOSX:使用特定的客戶端和服務器端口創建CFStream / NSStream

[英]MacOSX: creating a CFStream/NSStream with specific client and server ports

我正在嘗試將(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)。

我還可以將創建的套接字傳遞給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框架可能無法使用精細控制(客戶端和服務器端口規范,超時規范等)嗎?

我必須承認它已經使用了一年,對於我來說從來沒有一個真正的高優先級問題,而且我的代碼尚未見過任何實際用法。 這就是我最終得到的

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 ++模塊中一樣,但是顯然在繼續之前的測試過程中,它的工作情況足夠好。

希望這對您有所幫助-並可以隨意瀏覽全部代碼

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM