2011-05-30 92 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