0

我基本上是在向我的服务器发送一个帖子。我正在写的字符串是@"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 的新手)

4

1 回答 1

0

如果有人对此感兴趣,我基本上放弃并使用 NSMutableURLrequest。

NSString *urlString = @"http://url.ca/api?f=##";
NSMutableURLrequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:url]];
[request setHTTPMethod:@"POST"];
[request setValue:@"##" for HTTPHeaderField@"Contect-Length"];
[request setValue:@"application/x-www-form-urlencoded" for HTTPHeaderField@"Content-Type"];
[request setHTTPBody:@"data=lalalalala" dataUsingEncoding:NSASCIIStringEncoding]];

NSURLResponse *response;
NSError *err;
NSData *responseData = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&err];

//error check & handle data

请记住,如果您想做类似的事情,这是同步的,所以它会延迟您的 UI(所以在它自己的线程中运行或异步执行)。这基本上与我尝试编写的代码相同。

于 2012-08-20T12:54:02.980 回答