iphone socket开发

Q: Given that +getStreamsToHost:port:inputStream:outputStream: is not supported on iPhone OS, how can I create NSStreams for a TCP connection to a named host?

A: You can do this by exploiting the toll-free bridge between NSStream and CFStream. UseCFStreamCreatePairWithSocketToHost to create CFStreams to the host, and then cast the resulting CFStreams to NSStreams.

Listing 1 shows an example of this. It adds a category to NSStream that implements a replacement for+getStreamsToHost:port:inputStream:outputStream:.

Listing 1: A category to creates TCP streams to a named host

@interface NSStream (MyAdditions)

+ (void)getStreamsToHostNamed:(NSString *)hostName 
    port:(NSInteger)port 
    inputStream:(NSInputStream **)inputStreamPtr 
    outputStream:(NSOutputStream **)outputStreamPtr;

@end

@implementation NSStream (MyAdditions)

+ (void)getStreamsToHostNamed:(NSString *)hostName 
    port:(NSInteger)port 
    inputStream:(NSInputStream **)inputStreamPtr 
    outputStream:(NSOutputStream **)outputStreamPtr
{
    CFReadStreamRef     readStream;
    CFWriteStreamRef    writeStream;

    assert(hostName != nil);
    assert( (port > 0) && (port < 65536) );
    assert( (inputStreamPtr != NULL) || (outputStreamPtr != NULL) );

    readStream = NULL;
    writeStream = NULL;

    CFStreamCreatePairWithSocketToHost(
        NULL, 
        (CFStringRef) hostName, 
        port, 
        ((inputStreamPtr  != nil) ? &readStream : NULL),
        ((outputStreamPtr != nil) ? &writeStream : NULL)
    );

    if (inputStreamPtr != NULL) {
        *inputStreamPtr  = [NSMakeCollectable(readStream) autorelease];
    }
    if (outputStreamPtr != NULL) {
        *outputStreamPtr = [NSMakeCollectable(writeStream) autorelease];
    }
}

@end

原文地址:https://www.cnblogs.com/zzxap/p/2175893.html