【问题标题】:Open Socket, Send Data, Close Socket = Truncated data打开套接字,发送数据,关闭套接字 = 截断数据
【发布时间】:2011-09-05 02:20:32
【问题描述】:

我在从我正在开发的 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);
}   

感谢所有想法

詹斯

【问题讨论】:

  • 你怎么知道 outputStream 没有发送任何东西?尝试检查write:maxLength 的返回值。如果是 -1,您可以致电 [outputStream streamError] 获取更多详细信息。
  • @PavelChuchuva 大多数时候它都有效。我认为 99% 的发送通过我的服务器发送,但可能有 1% 我连接到我的服务器但没有收到数据。 @ThomasMinor 在下面给了我一些提示,这使我最终尝试在关闭套接字之前等待 NSStreamEventHasSpaceAvailable 事件,但是我不确定它是否有副作用。也许它会在发送大量数据时关闭套接字?感谢您的帮助

标签: objective-c sockets ios4 flush


【解决方案1】:

您可以尝试等到 CFWriteStreamGetStatus 返回 kCFStreamStatusAtEnd 后再关闭它。我认为问题在于 CFWriteStreamClose 会自动从使用它的任何地方释放字符串,包括数据实际被推送到网络的位置,这意味着它在释放时将未推送的数据留在缓冲区中。这应该保证所有数据在刷新之前都已被推出。

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

【讨论】:

  • 谢谢,但它不起作用,我添加了 1 秒睡眠以确保实际发送数据。然后我检查 CFWriteStreamGetStatus 和 kCFStreamStatusAtEnd 是否返回正值,但没有。在我看来,如果 kCFStreamStatusAtEnd 用于输入流?然后我尝试向流中添加一个委托,并在委托中实现了 - (void)stream:(NSStream *)stream handleEvent:(NSStreamEvent)eventCode。现在我在收到 NSStreamEventHasSpaceAvailable 的 eventCode 时关闭套接字,但是这样做是否正确?如果不是整个缓冲区为空,我猜这个事件可能会触发?
  • 查看同一站点上的 FTP 示例。他们完全按照您最初的方式关闭它。问题可能出在其他地方吗?尝试使用可以监控的自己的缓冲区创建流,并在关闭缓冲区时转储缓冲区。
  • 我决定让服务器关闭套接字,它工作得很好。虽然没有发现客户端代码实际上有什么问题。感谢所有的好意见
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-08
  • 2014-04-15
  • 1970-01-01
  • 1970-01-01
  • 2017-09-28
  • 1970-01-01
相关资源
最近更新 更多