私は基本的に自分のサーバーに投稿を送信しています。私が書いている文字列は @"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 を返すべきではありませんか?)。 == bufLen)(これが意図された機能でない限り、アップルは何も見逃さないと私が想定する別のフラグ)。次に、bufLen またはバッファー (rawstring) は変更されず、繰り返し 1500 を返し、終わりのないサイクルを開始します。したがって、これを説明するために、bufLen を 0 に設定し、書き込まれたバイトを 0 に設定する else を追加して、コードが KCFStreamStatusAtEnd に達したときにチェックするためにループするようにしました。これをステップ実行すると、CFWriteStreamWrite を実行すると、ステータスが 2 (CFStreamStatusOpen) までになり、別の終わらないサイクルになることに気付きました。
しかし、サーバーの apache アクセス ログを確認すると、次のようになります。
... "-" 408 -
動作中の呼び出し (動作中の Java コードから行われる) は、次のようになり
ます ... "POST /api?f=blahblah" 200 ##
少なくとも何かが書かれようとしているような気がします。408 ステータスはリクエストのタイムアウトですが。これは、ストリームを開いた状態でデバッグしている間、ストリームがそこにあることが原因である可能性がありますか? または、デバッグして停止したときにストリームを閉じないためですか?
アイデアや提案は大歓迎です。(私はiOS/objective-cが初めてです)