【发布时间】: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