objective-c - 使用 CFWriteStream 将文件传输到套接字

标签 objective-c ios sockets ios4 streaming

我创建了一个小应用程序,它应该向我的服务器发送一个 NSString。我有一个在那里运行的应用程序,它监听一个确切的端口并像垃圾箱一样工作:它保存从那里进来的所有数据。

我创建的 iPhone 应用程序使用了这个:

-(IBAction)pressButton:(id)sender {
    NSString *iHostname = [NSString stringWithFormat:@"xxx.xxx.xxx.xxx"];
    NSString *iPort = [NSString stringWithFormat:@"9100"];

    CFWriteStreamRef writeStream;
    static const CFOptionFlags kWriteNetworkEvents = kCFStreamEventEndEncountered |
    kCFStreamEventErrorOccurred |
    kCFStreamEventCanAcceptBytes |
    kCFStreamEventOpenCompleted |
    kCFStreamEventNone;
    CFStreamClientContext ctxt = {0,(void*)NULL,NULL,NULL,NULL};
    CFHostRef hostRef = CFHostCreateWithName(kCFAllocatorDefault,(CFStringRef)iHostname);

    CFStreamCreatePairWithSocketToCFHost(kCFAllocatorDefault, hostRef, [iPort intValue],
                                         NULL, &writeStream);

    CFWriteStreamSetClient(writeStream, kWriteNetworkEvents, WriteStreamClientCallBack, &ctxt);
    CFWriteStreamScheduleWithRunLoop(writeStream, CFRunLoopGetCurrent(), kCFRunLoopDefaultMode);

所以,我调用一个 runloop 方法:

static void WriteStreamClientCallBack( CFWriteStreamRef stream, CFStreamEventType type, void *clientCallBackInfo ) {
    NSLog(@"%lu", type);
    switch (type)
    {
        case kCFStreamEventEndEncountered:
        {
            NSLog(@"Closing");
            CFWriteStreamClose(stream);
            break;
        }
        case kCFStreamEventErrorOccurred:
        {
            NSLog(@"Crap, error!");
            break;
        }
        case kCFStreamEventCanAcceptBytes:
        {
            NSLog(@"Stream can accept more bytes");
            NSString *reqStr = [NSString stringWithFormat: @"ConReq"];
            const UInt8 *rawstring = (const UInt8 *)[reqStr UTF8String];
            CFWriteStreamWrite(stream, rawstring, strlen((char *)rawstring));
        }
        case kCFStreamEventNone:
        {
            NSLog(@"Nothing is happening");
            break;
        }
        case kCFStreamEventOpenCompleted:
        {
            NSLog(@"Opened stream!");
            break;
        }
    }
}

问题来了:当我按下按钮时,它一直循环在那里。日志记录显示案例 kCFStreamEventCanAcceptBytes 一直在被调用。事实上,当我强制退出程序时,服务器收到了一个包含很多 ConReq 的文件。我应该怎么做,或者我做错了什么?

附言。我从 here 得到代码.

最佳答案

“可以接受”事件表明,如果您有更多数据要发送,您可以无阻塞地发送(部分)数据。你的问题是你没有跟踪你发送了多少数据,还有多少数据要发送,以及套接字当前是否可以接受数据。相反,每次有空间发送更多数据时,您每次都会发送完全相同的数据。数据不多,因此您应该会很快看到大量“准备好接收更多数据”事件。

关于objective-c - 使用 CFWriteStream 将文件传输到套接字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6466775/

相关文章:

objective-c - 将 NSMutableDictionary 的键/值存储到另一个 NSMutableDictionary

ios - 将 MKMapSnapshotter 作为 NSData 保存在内存中 - Swift

LINUX tcpdump - UDP数据包监控时关于IPS和端口

c# - 将套接字句柄从 .NET 传递到非托 pipe 进程

iphone - 消息发送到已释放的实例

iphone - 如何在 iOS 中设置事件指示器 View

objective-c - OSX 中的数据加密和解密

ios - Swift:抬起键盘时 View 会反弹

c++ - Telnet 客户端控制台 : SEND invalid command - Only for Spanish version

objective-c - 将事件保存到 CalCalendar 是否只存储指向 CalEvent 的指针,而不是副本?