我基本上是发一个帖子到我的服务器。我正在编写的字符串是@“POST/api?f = ### HTTP/1.1 \ r \ n主机:http://server.loc.a.tion \ r \ n内容类型:application/x-www-form-urlencoded \ r \ n内容长度: ## \ r \ n \ r \ n数据= somedataandstuff”。在此之后,服务器应该发送给我一条消息。 (不是我已经得到了那么多。)iOS写入服务器使用CFWriteStrem不写?
我正在按照基本轮询代码列出apple,但我做了一些更改。
请注意,以下是我已经打开后的流),data_to_send.buffer是(字符*),并data_to_send.buffer_size是1500
//Preform Write operations
bool done = false;
int bufLen = data_to_send.buffer_size;
const uint8_t * rawstring =(const uint8_t *)data_to_send.buffer;
CFIndex bytesWritten;
while (!done) {
CFStreamStatus stat = CFWriteStreamGetStatus(writeStream); //for me while debugging
if (CFWriteStreamCanAcceptBytes(writeStream)) {
//ADDED:
if(bufLen > 0) bytesWritten = CFWriteStreamWrite(writeStream, rawstring, (CFIndex)bufLen);
//ADDED: to check if it ever writes
if(CFWriteStreamGetStatus(writeStream) == kCFStreamStatusWriting){
NSLog(@"lalallaa");
}
if (bytesWritten < 0) {
//error stuff
} else if (bytesWritten == 0) {
if (CFWriteStreamGetStatus(writeStream) == kCFStreamStatusAtEnd) {
done = TRUE;
rawstring = nil;
}
} else if (bytesWritten != bufLen) {
// Determine how much has been written and adjust the buffer
bufLen = bufLen - bytesWritten;
memmove(rawstring, rawstring + bytesWritten, bufLen);
//error stuff
} else { //ADDED
bufLen = 0;
bytesWritten = 0;
//loop and wait until finished
}
}
}
CFWriteStreamClose(writeStream);
CFRelease(writeStream);
writeStream = NULL;
我修改了代码,因为CFWriteStreamWrite返回完整1500(这是我脑海中的一个标志:如果bufLen是1500,它写的都不应该返回0),这在苹果代码中没有说明(即:bytesWritten == bufLen)(另一个标志为I假设苹果不会错过任何东西,除非这是预期的功能)。反过来,bufLen或缓冲区(rawstring)不会被修改,我们只是重复返回1500,并开始一个永不结束的循环。因此,为了解决这个问题,我添加了其他的设置bufLen为0和写入0的字节,以便代码将循环检查它何时到达KCFStreamStatusAtEnd。现在,当我逐步了解这一点时,我注意到一旦它执行了CFWriteStreamWrite,状态就会变为2(CFStreamStatusOpen),因此也是另一个永不结束的循环。我添加的查看它是否写入的命令永远不会被打到,因为据我所知它不会。
但是,现在如果我们检查apache的访问日志服务器上,我们有:
...“ - ” 408 -
中,工作电话(从工作java代码制造)看起来像
.. 。“POST/api?f = blahblah”200 ##
所以我觉得至少有一些东西至少要写出来。虽然408状态是请求超时。这可能是因为在打开流的情况下进行调试时,流位于那里?或者因为当我调试并停止时,我从不关闭流?
任何想法或建议将不胜感激。 (我是iOS/objective-c的新手)
2012-08-15
sherwood