私はソケットのメッセージを処理するAsyncProgressWorkerスレッドを使用してノードのアドオンを作った。その後、私はいくつかのメッセージが戻っノードにそれをすることはありませんことに気づいいくつかprogress.Send呼び出しnodejs土地にしないでください
class ProgressWorker : public AsyncProgressWorker {
public:
ProgressWorker(
Callback *callback
, Callback *progress)
: AsyncProgressWorker(callback), progress(progress) {}
~ProgressWorker() {}
void Execute (const AsyncProgressWorker::ExecutionProgress& progress) {
char response[4096];
int result;
int connected = 1;
int timeout = 0;
int pending = 0;
while(connected) {
result = sctp_recvmsg(sock, (void *)&response, (size_t)sizeof(response), NULL, 0, 0, 0);
if (result > 0 && result < 4095) {
if (debug) {
printf("Server replied (size %d)\n", result);
}
pending = 0;
progress.Send((const char *)response, size_t(result));
result = 0;
}
else {
// Don't mind my timeout mechanism. :))
if ((result == -1 && errno != EWOULDBLOCK) || pending) {
if (timeout == 0) {
printf("Can't receive from other end. Waiting for 3 seconds. Error code: %d\n", errno);
pending = 1;
}
if (timeout >= 3000) {
connected = 0;
close(sock);
}
else {
timeout += 5;
usleep(5000);
}
}
else {
usleep(5000);
}
}
}
}
void HandleProgressCallback(const char *data, size_t count) {
HandleScope scope;
v8::Local<v8::Value> argv[] = {
CopyBuffer(const_cast<char*>(data), count).ToLocalChecked()
};
progress->Call(1, argv); // This is the callback to nodejs
}
private:
Callback *progress;
};
は、今私は今夜までこのことを強調し、テストしていません。ここに私のコードです。私の "Server replied"デバッグログは出力されますが、デバッグログはログに記録されません。私はここに何かを逃していますか前もって感謝します。
ACKを実装しないのはなぜですか?
package.json
は、 (ちょうどパケットが落ちる時を確かめるために) – EMX@EMX答えに申し訳ありませんが、私はACKについてよく分かりません。私が言うことができるのは、これがSCTPソケット実装であることだけです。私はsctp_recvmsg戻り値に頼っています。欠落しているメッセージがデバッグログを渡しましたが、進捗コールバックは呼び出されません。ありがとう。 – Phenelo
':: v8 :: Isolate'へのポインタを' HandleScope'コンストラクタに渡すべきではありませんか? – VTT