Очень странный iPhone - проблема с сервером - PullRequest
0 голосов
/ 03 февраля 2010

По сути, я отправляю данные на сервер Java Socket Server из приложения для iPhone, однако происходит нечто довольно странное: они не получают данные, пока приложение для iPhone не будет закрыто!Я уверен, что что-то мне не хватает, но я просто не могу его найти, все это довольно странно.

Вот как создается мое соединение:

-(CFSocketRef)initSocket {
    CFSocketContext context = {
        .version = 0,
        .info = self,
        .retain = NULL,
        .release = NULL,
        .copyDescription = NULL
    };

    sockety = CFSocketCreate(
        kCFAllocatorDefault,
        PF_INET,
        SOCK_STREAM,
        IPPROTO_TCP,
        kCFSocketDataCallBack^kCFSocketConnectCallBack,
        socketCallBack,
        &context
        );
    uint16_t port = 4444;

    struct sockaddr_in addr4;

    memset(&addr4, 0, sizeof(addr4));
    addr4.sin_family = AF_INET;
    addr4.sin_len = sizeof(addr4);
    addr4.sin_port = htons(port);

    const char *ipaddress = "192.168.1.5";

    inet_aton(ipaddress, &addr4.sin_addr);

    NSData *address = [NSData dataWithBytes:&addr4 length:sizeof(addr4)];

    CFSocketError error = CFSocketConnectToAddress(sockety, (CFDataRef)address, 1);

    if(error != kCFSocketSuccess ) 
    { 
        Faliure = YES;
    } 
    else{
        ViewNo = 2;
    }
    CFRunLoopSourceRef source;

    source = CFSocketCreateRunLoopSource(NULL, sockety, 1);
    CFRunLoopAddSource(CFRunLoopGetCurrent(), source, kCFRunLoopDefaultMode);
    CFRelease(source);
    return sockety;
}

Вот как отправляется сообщение:

const char *sendStrUTF = [sentmessage UTF8String];
NSData *dataOut = [NSData dataWithBytes: sendStrUTF length: strlen(sendStrUTF)];
CFSocketSendData(sockety, NULL, (CFDataRef) dataOut, 0);

Любая помощь будет принята с благодарностью!

Заранее спасибо,
Оззи

Ответы [ 2 ]

0 голосов
/ 03 ноября 2010
NSData *dat=[stringToSend dataUsingEncoding:NSASCIIStringEncoding];
CFSocketError w =CFSocketSendData(_socket, NULL,(CFDataRef)dat, 0);
if (w==kCFSocketSuccess) {
   NSLog(@"success");
}
0 голосов
/ 09 февраля 2010

Ваш вызов CFSocketSendData выполняется в (заблокированном) потоке графического интерфейса?

Я бы поэкспериментировал с переносом этих 3 строк в executeSelectorInBackground / или после комбинаций задержки.

...