views:

85

answers:

0

Hello. I have a problem with my program. I created a socket with "kCFSocketReadCallBack. My intention was to call the "acceptCallback" only when it receives a string to the socket. Instead my program does not just accept the connection always goes into "startReceive" stop doing so and sometimes crash the program. Can anybody help? Thanks

readSocket = CFSocketCreateWithNative(
                                                      NULL,
                                                      fd,
                                                      kCFSocketReadCallBack,
                                                      AcceptCallback,
                                                      &context
                                                      );


    static void AcceptCallback(CFSocketRef s, CFSocketCallBackType type, CFDataRef address, const void *data, void *info)
    // Called by CFSocket when someone connects to our listening socket.  
    // This implementation just bounces the request up to Objective-C.
    {

         ServerVistaController *  obj;

        #pragma unused(address)
        // assert(address == NULL);
        assert(data != NULL);

        obj = (ServerVistaController *) info;
        assert(obj != nil);

        #pragma unused(s)
        assert(s == obj->listeningSocket);           

        if (type & kCFSocketAcceptCallBack){
            [obj acceptConnection:*(int *)data];
        }

        if (type & kCFSocketAcceptCallBack){
            [obj startReceive:*(int *)data];
        }       
    }



    -(void)startReceive:(int)fd
    {

        CFReadStreamRef readStream = NULL;
        CFIndex bytes;
        UInt8 buffer[MAXLENGTH];


        CFStreamCreatePairWithSocket(
                                     kCFAllocatorDefault,
                                     fd,
                                     &readStream,
                                     NULL);
        if(!readStream){
            close(fd);
            [self   updateLabel:@"No readStream"];
        }

        CFReadStreamOpen(readStream);

        [self   updateLabel:@"OpenStream"];

        bytes = CFReadStreamRead(
                                     readStream,
                                     buffer,
                                     sizeof(buffer));

        if (bytes < 0) {
            [self   updateLabel:(NSString*)buffer];
            close(fd);
        }


        CFReadStreamClose(readStream);


    }