我基本上是在向我的服务器发送一个帖子。我正在写的字符串是@"POST /api?f=### HTTP/1.1\r\nHost: http://server.loc.a.tion \r\nContent-Type: application/x-www- form-urlencoded\r\nContent-Length: ##\r\n\r\ndata=somedataandstuff"。在此之后,服务器应该给我发回一条消息。(并不是说我已经走到了那一步。)
我正在遵循apple列出的基本轮询代码,但我做了一些更改。
请注意以下是我打开流之后的情况),data_to_send.buffer 是 (char *),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)(另一个标志,因为我认为苹果不会错过任何东西,除非这是预期的功能)。反过来,bufLen 或缓冲区(原始字符串)不会被修改,我们只是重复返回 1500,并开始一个永无止境的循环。因此,为了解决这个问题,我添加了将 bufLen 设置为 0 并将字节写入 0 的 else,以便代码将循环检查何时到达 KCFStreamStatusAtEnd。现在,当我逐步执行此操作时,我注意到一旦执行 CFWriteStreamWrite,状态将持续到 2 (CFStreamStatusOpen),因此又是一个永无止境的循环。
但是,现在如果我们检查我们拥有的服务器上的 apache 访问日志:
...“-” 408 -
工作调用(由工作 Java 代码制成)看起来像
...“POST /api?f=blahblah” 200 ##
所以我觉得至少在尝试写一些东西。虽然 408 状态是请求超时。这可能是因为当我在打开流的情况下进行调试时,流就在那里?还是因为当我调试和停止时我从不关闭流?
任何想法或建议将不胜感激。(我是 iOS/objective-c 的新手)