gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 13:48:02 28 4
gpt4 key购买 nike

我创建了一个小应用程序,它应该向我的服务器发送一个 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/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com