2012-04-13 7 views
0

Wie kann ich die RTT (Round Trip Time) zwischen Client und Server berechnen oder schätzen?SUN RPC (ONC/RPC): Berechnung der Umlaufzeit (oder Pinging) mit Null-Prozedur in C

Ein Tutorial oder eine Beispieladressierung kann ebenfalls helfen.

+0

http://mattgememm.com/2008/12/08/what-have-you-tried/ –

+0

Joachim Hallo. Danke, dass du versucht hast zu helfen, selbst auf unhöfliche Weise. Hier ist, was ich als Neuling zu der Zeit getan habe, als ich die Frage stellte (ich bin immer noch ein Neuling): Ich suchte im Internet mit jeder möglichen Kombination der Titel Schlüsselwörter (Schlüsselwörter sind: SUN + RPC + ONC + RTT + Rundreise + Umlaufzeit + Ping + Nullprozedur + C + Schätzung + Client + Server). Ich lese jede Dokumentation, die ich über RPC gefunden habe. Ich habe sogar ein paar RFC-Standardblätter gelesen. (Ich erinnere mich, dass sie mir in den Sinn kamen.) Ich hatte nichts gefunden. Die Antwort unten ist die einzige Lösung, die ich jemals finden konnte. Das ist ... – duru

+0

... warum es wertvoll ist. Danke für deinen wertvollen aber unhöflichen Beitrag. – duru

Antwort

0

Hier ist, was ich tue:

#include <rpc/rpc.h> 
#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> 
#include <sys/times.h> 
#include <fcntl.h> 
#include <time.h> 

int main(int argc, char *argv[]) { 

    enum clnt_stat status; 
    CLIENT *handle; 
    struct timeval t; 
    clock_t rtime; 
    struct tms dumm; 
    int count = 100000; 
    int i; 
    time_t now; 
    char stamp[27]; 
    int programm; 
    int version; 

    if (argc != 4) { 
     printf("Usage: rpcping <host> <program> <version>\n"); 
     exit(1); 
    } 

    /* 
    * Create Client Handle 
    */ 
    programm = atoi(argv[2]); 
    version = atoi(argv[3]); 
    handle = clnt_create(argv[1], programm, version, "tcp"); 
    if (handle == NULL) { 
     printf("clnt failed\n"); 
     exit(1); 
    } 

    /* 
    * use 30 seconds timeout 
    */ 
    t.tv_sec = 30; 
    t.tv_usec = 0; 

    while (1) { 
     rtime = times(&dumm); 
     for (i = 0; i < count; i++) { 
      status = clnt_call(handle, 0, (xdrproc_t) xdr_void, 
       NULL, (xdrproc_t) xdr_void, NULL, t); 

      if (status == RPC_SUCCESS) { /* NOP */ } 
     } 
     now = time(NULL); 
     ctime_r(&now, stamp); 
     stamp[strlen(stamp) - 1] = '\0'; 
     fprintf(stdout, "[%s]: Speed: %2.4fs.\n", stamp, 
      count/((double) (times(&dumm) - rtime)/(double) sysconf(_SC_CLK_TCK))); 
     fflush(stdout); 
    } 

    clnt_destroy(handle); 
} 

Ich habe eine Multi-Thread-Version als auch

https://gist.github.com/2401404

tigran.

+0

Vielen Dank Tigran. Dies ist wahrscheinlich eines der wenigen Beispiele im gesamten www. Ich konnte noch keine Zeit haben, es zu versuchen, aber ich werde versuchen, es als bald beantwortet zu markieren. Nochmals vielen Dank. – duru

+0

Tigran, danke nochmal, das macht es. – duru