2011-05-30 91 views
1

我無法從正在開發的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); 
} 

所有的想法都讚賞

+0

你怎麼知道outputStream不發送任何東西?嘗試檢查'write:maxLength'的返回值。如果它是-1,則可以獲得調用'[outputStream streamError]''的更多細節。 – Saphrosit 2011-05-30 22:52:13

+0

@PavelChuchuva它大部分時間都有效。我認爲,99%的發送通過我的服務器,但也許1%我連接到我的服務器,但沒有收到數據。 @ThomasMinor給了我下面的一些提示,這讓我最終在關閉套接字之前嘗試等待NSStreamEventHasSpaceAvailable事件,但是我不確定它是否有副作用。也許它會在發送大塊數據時關閉套接字?感謝您的幫助 – 2011-06-01 22:54:16

回答

0

你可以嘗試等到CFWriteStreamGetStatus關閉前返回kCFStreamStatusAtEnd。我認爲問題在於CFWriteStreamClose從使用它的任何地方自動釋放字符串,包括數據實際被推送到網絡的位置,這意味着它在釋放緩衝區時會留下未釋放的數據。這應該保證所有數據在被刷新之前已經被推出。

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

+0

謝謝,但它沒有工作, 我添加了1秒的睡眠,以確保數據實際發送。然後檢查CFWriteStreamGetStatus&kCFStreamStatusAtEnd是否返回正值,但是沒有。對我來說,它似乎是如果kCFStreamStatusAtEnd是輸入流? 然後,我試圖添加一個委託給流,並在委託中實現了 - (void)stream:(NSStream *)stream handleEvent:(NSStreamEvent)eventCode。現在,當我收到NSStreamEventHasSpaceAvailable的事件代碼時關閉套接字,但是這樣做是正確的嗎?如果不是整個緩衝區是空的,我猜這個事件可能會觸發? – 2011-06-01 22:47:25

+0

查看同一站點上的FTP示例。他們完全按照原來的方式關閉它。問題可以在別處嗎?嘗試使用您可以監控的緩衝區創建流,並在關閉緩衝區時轉儲緩衝區。 – 2011-06-01 23:51:01

+0

我決定讓服務器關閉套接字,而它的工作效果很好。雖然沒有發現客戶端代碼實際上有什麼問題。感謝所有的好輸入 – 2011-06-17 17:12:25