2

Node.js を使用してあるクライアントから別のクライアントにデータを送信する pub/sub モデルがあります。さらに、サーバーは受信したすべてを記録し、新しいクライアントに送信します。

ただし、転送時に一部のデータが破損し、次のようなエラーが発生しました。

Error with socket!
{ [Error: write EPIPE] code: 'EPIPE', errno: 'EPIPE', syscall: 'write' }
Error with socket!
{ [Error: read ETIMEDOUT] code: 'ETIMEDOUT', errno: 'ETIMEDOUT', syscall: 'read' }

これらのエラーを適切に処理する方法がわかりません。クライアントがダウンしているようです。

サーバーはサーバーのようなプロキシにすぎないため、データが何を意味するかは実際にはわかりません。これらのエラーに遭遇する前に、すべてのデータ パックを検証する方法がわかりません。

これが私のコードです:

// server is an object inheriting from net.Server
server.on('listening', function() {
    var port = server.address().port;
}).on('connection', function(cli) {
    cli.socketBuf = new Buffers();
    cli.commandStarted = false;
    cli.dataSize = 0;
    cli.setKeepAlive(true, 10*1000);
    cli.setNoDelay(true);
    cli.on('connect', function() {
        server.clients.push(cli);
    }).on('close', function() {
        var index = server.clients.indexOf(cli);
        server.clients.splice(index, 1);
    }).on('data', function (buf) {
        server.emit('data', cli, buf);
        if(op.autoBroadcast) {
            _.each(server.clients, function(c) {
                if(c != cli) c.write(buf);
            });
        }
    }).on('error', function(err) {
        console.log('Error with socket!');
        console.log(err);
    });
}).on('error', function(err) {
    console.log('Error with server!');
    console.log(err);
});

// ...

// room.dataSocket is an instance of server beyond
room.dataSocket.on('data', function(cli, d) {
    // bf is a buffered file
    bf.append(d);
    room.dataFileSize += d.length;
    
}).on('connection', function(con){
    bf.readAll(function(da) {
        con.write(da);
    });
});
4

1 に答える 1

2

書き込み時に EPIPE または実際に何らかのエラーが発生した場合は、ピアが閉じているか、接続が切断されています。したがって、その時点で接続を閉じる必要があります。

読み取りタイムアウトが発生した場合、非現実的なほど短いタイムアウトを設定したか、ピアが時間内に配信できなかったことが推測されます。

于 2013-02-20T04:36:51.863 に答える