我做一个client的socket连接,
使用CFSocketCreate创建socket连接,
CFSocektConnectToAddress建立连接然后分别创建CFReadStream和CFWriteStream
使用CFStreamCreatePairWithSocket把输入输出流关联到socket上
CFReadStreamOpen和CFWriteStreamOpen打开流
然后执行CFReadStreamScheduleWithRunLoop和CFWriteStreamScheduleWithRunLoop但是当我使用CFReadStreamRead或CFWriteStreamWrite进行读写的时候,会block掉.
使用CFWriteStreamCanAcceptBytes和CFReadStreamHasBytesAvailable查看readStream和writeStream状态
返回的都是false,说明他们不能被读写.请问是什么原因呀        socket = CFSocketCreate(kCFAllocatorDefault, 
                                PF_INET, SOCK_STREAM, IPPROTO_TCP, 
                                0, NULL, NULL);
        struct sockaddr_in sin;
        
        memset(&sin, 0, sizeof(sin));
        sin.sin_len = sizeof(sin);
        sin.sin_family = AF_INET;
        sin.sin_port = htons(****); // port we want to connect on
        sin.sin_addr.s_addr = inet_addr("***.***.***.****");
        
        CFDataRef address = CFDataCreate(NULL,(unsigned char*)&sin,sizeof(sin));
        CFTimeInterval timeout = 10 ; // how long to wait before returning
        
        CFSocketError e = CFSocketConnectToAddress(socket,address,timeout);
        
        if(e != kCFSocketSuccess )
        {
            NSLog(@"Could not bind to address");
        }
        else
        {
            NSLog(@"Bind to address succeeded");
            
            char joke[] = "Why did the chicken cross the road?";
            CFDataRef data_test = CFDataCreate(NULL, (unsigned char*)&joke, sizeof(joke));
            CFSocketError err = CFSocketSendData(socket, address, data_test, 10);
            if (err == kCFSocketSuccess) {
                NSLog(@"Send Succeeded!");
            }
            
            
            CFReadStreamRef readStream;
            CFWriteStreamRef writeStream;
            
            //Get readStream & writeStream
            CFSocketNativeHandle sock = *(CFSocketNativeHandle *) socket;
            CFStreamCreatePairWithSocket(kCFAllocatorDefault, 
                                         sock, 
                                         &readStream, 
                                         &writeStream);
            
            //Open readStream & writeStream
            if (CFReadStreamOpen (readStream))
            {
                NSLog(@"CFReadStreamOpen Succeeded");
            }
            else
            {
                NSLog(@"CFReadStreamOpen Failed");
            }
            if (CFWriteStreamOpen (writeStream))
            {
                NSLog(@"CFWriteStreamOpen Succeeded");
            }
            else
            {
                NSLog(@"CFWriteStreamOpen Failed");
            }
            
            //Schedule the stream into a run loop
            CFReadStreamScheduleWithRunLoop(readStream, 
                                            CFRunLoopGetCurrent(), 
                                            kCFRunLoopCommonModes);
            CFWriteStreamScheduleWithRunLoop(writeStream, 
                                             CFRunLoopGetCurrent(), 
                                             kCFRunLoopCommonModes);
            //Assigns a client to receive callback for the stream while in the run loop.
            if (CFReadStreamSetClient (readStream, 
                                       kCFStreamEventOpenCompleted | 
                                       kCFStreamEventHasBytesAvailable | 
                                       kCFStreamEventCanAcceptBytes | 
                                       kCFStreamEventErrorOccurred | 
                                       kCFStreamEventEndEncountered,  
                                       mySocketReadCallBack, 
                                       NULL ) )
            {
                NSLog(@"Set read callBack Succeeded");
            }
            else
            {
                NSLog(@"Set read callBack Failed");
            }
            
            if (CFWriteStreamSetClient (writeStream,
                                        kCFStreamEventOpenCompleted | 
                                        kCFStreamEventHasBytesAvailable | 
                                        kCFStreamEventCanAcceptBytes | 
                                        kCFStreamEventErrorOccurred | 
                                        kCFStreamEventEndEncountered, 
                                        mySocketWriteCallBack,
                                        NULL) )
            {
                NSLog(@"Set write callBack Succeeded");
            }
            else
            {
                NSLog(@"Set write callBack Failed");
            }
            
            NSLog(@"CFReadStreamGetStatus=%d", CFReadStreamGetStatus(readStream));
            NSLog(@"CFWriteStreamGetStatus=%d", CFWriteStreamGetStatus(writeStream));
            
            //Write to socket
            char data[] = "Beware the Jabberwocky.\n";
            CFIndex bytes_sent = 0;
            int send_len = 0;
            
            //if (!CFWriteStreamCanAcceptBytes(writeStream))
            //{
            //    NSLog(@"writeStream can not be written to");
            //}
            //else
            //{
            //    NSLog(@"writeStream can be written to");
            /*
                NSLog(@"before send");
                bytes_sent = CFWriteStreamWrite(writeStream, 
                                                data + send_len,
                                                (strlen(data)+1) - send_len);
                if (bytes_sent < 0)
                {
                    NSLog(@"send failed!");
                }
                else
                {
                    NSLog(@"send succeeded!");
                }
             */
            //    send_len += bytes_sent;
            //}
            //Write end
            
            //Read from socket
            //if (!CFReadStreamHasBytesAvailable(readStream))
            //{
            //    NSLog(@"readStream has not byte available");
            //}
            //else
            //{
                NSLog(@"before read");
                char buffer[1024];
                CFIndex bytes_recvd;
                int recv_len = 0;
                memset(buffer, 0, sizeof(buffer));
                while (!strchr(buffer, '\n') && recv_len < sizeof(buffer)) {
                    bytes_recvd = CFReadStreamRead(readStream, 
                                                   (unsigned char*)(buffer + recv_len),
                                                   sizeof(buffer) - recv_len);
                    if (bytes_recvd < 0) {
                        //Error has occurred. Close the socket and return.
                    }
                    recv_len += bytes_recvd;
                }
                NSLog(@"recv_len=%d", recv_len);
            //}
            //Read over        }
        
        CFSocketInvalidate(socket) ;
        CFRelease(address);
        CFRelease(socket);