Открыть сокет, отправить данные, закрыть сокет = усеченные данные - PullRequest
1 голос
/ 31 мая 2011

У меня проблемы с отправкой данных в гнездо из приложения iphone, которое я разрабатываю. Короче говоря, я хочу подключиться к tcp-серверу через определенный порт, отправить данные и затем закрыть сокет.

Похоже, что сокет не сбрасывает данных, ожидающих в буфере перед закрытием.

Вот мой код:

int port = 1234;
CFReadStreamRef readStream;
CFWriteStreamRef writeStream;
CFStreamCreatePairWithSocketToHost(kCFAllocatorDefault, (CFStringRef)host, port, &readStream, &writeStream);
if (readStream && writeStream) {
    //CFReadStreamSetProperty(readStream, kCFStreamPropertyShouldCloseNativeSocket, kCFBooleanTrue);
    CFWriteStreamSetProperty(writeStream, kCFStreamPropertyShouldCloseNativeSocket, kCFBooleanTrue);

    inputStream = (NSInputStream *)readStream;
    [inputStream retain];
    [inputStream setDelegate:self];
    [inputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
    [inputStream open];

    outputStream = (NSOutputStream *)writeStream;
    [outputStream retain];
    [outputStream setDelegate:self];
    [outputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
    [outputStream open];
}

[outputStream write:(void *)&len maxLength:4];
[outputStream write:[data bytes] maxLength:[data length]];

if (inputStream) {
    CFReadStreamClose((CFReadStreamRef)inputStream);
    CFRelease(inputStream);
}
if (outputStream) {
    CFWriteStreamClose((CFWriteStreamRef)outputStream);
    CFRelease(outputStream);
}   

Все идеи ценятся

Jens

1 Ответ

0 голосов
/ 31 мая 2011

Вы можете попробовать подождать, пока CFWriteStreamGetStatus вернет kCFStreamStatusAtEnd, прежде чем закрыть его. Я думаю, что проблема в том, что CFWriteStreamClose автоматически освобождает строку из любого места, где она используется, в том числе из тех случаев, когда данные фактически передаются в сеть, что означает, что при освобождении они оставляют невыгруженные данные в буфере. Это должно гарантировать, что все данные были выгружены до того, как они сброшены.

http://developer.apple.com/library/mac/#documentation/CoreFoundation/Reference/CFWriteStreamRef/Reference/reference.html

...