Ich habe ein Programm, das die Zeit zum Senden oder Empfangen einer Menge von Daten zählt. Wenn ich die Daten erhalte, sagt die Uhr, dass sie nur etwa die Hälfte der Zeit benötigt, die sie tatsächlich benötigt.Falsche Zeit von Uhr
Ausgabe von dem Terminal, das die Daten recives:
Amount of data recived: 60296112/300000000
Time: 4
Start time: 3269
End time: 4849790
Clocks per sec: 1000000
und die Ausgabe von dem Endgerät, das die Daten sendet:
Sent 300000000 bytes of data
Time to send was 10.793425
Das Terminal, das die Daten sendet, wird ein Stoppsignal senden, nachdem Es hat alle anderen Daten gesendet. Wenn ich das Terminal beobachte, das die Daten empfängt, kann ich sehen, dass es zu zählen beginnt, wenn das andere Terminal beginnt, Daten zu senden, und ich kann sehen, dass es die Ausgabe von clock()
viel länger ausgibt, als die Ausgabe sagt.
Mein Code für den Empfangsteil:
static void recive_sock(int socket_fd,char *buffert, size_t buffert_size, struct sockaddr *other, socklen_t *other_size){
clock_t start_t, end_t;
long int total_time = 0;
printf("Listning for data\n");
fflush(stdout);
int run = 1;
char start = 1;
int amount = 0;
int recive_length;
while(run){
recive_length = recvfrom(socket_fd, buffert, buffert_size, 0, other, other_size);
if(recive_length < 0){
die("Recvfrom failed");
}
if(strncmp(buffert, "HELLO!", 6) == 0){
amount += recive_length;
if(start == 1){
start = 0;
start_t = clock();
printf("Start: %ld\n",start_t);
}
printf("%ld\n",clock());
}
else if (strncmp(buffert, "die", 3) == 0) {
run = 0;
end_t = clock();
printf("End %ld\n",end_t);
total_time = (end_t - start_t)/CLOCKS_PER_SEC;
printf("Amount of data recived: %d/%d\nTime: %ld\nStart time: %ld\nEnd time: %ld\n,Clocks per sec: %ld", amount, AMOUNT, total_time, start_t, end_t, CLOCKS_PER_SEC);
}
}
}
'clock()' gibt die Prozessorzeit zurück, nicht die verstrichene Zeit. Mehr hier: http://pubs.opengroup.org/onlinepubs/9699919799/functions/clock.html#tag_16_62 – alk
Sind Sie sicher, dass die Daten tatsächlich sofort nach dem Senden gesendet werden? Möglicherweise gibt es eine interne Pufferung, die das Senden verzögert, bis genügend Daten zum Senden vorhanden sind. Ich denke, dass Code, der die Daten sendet, hier extrem relevant ist. – user694733
1) 'if (recive_length <0) {' Prüfe auf EAGAIN hier 2) 'if (strncmp (buffert," die ", 3) == 0) {' TCP ist strombasiert, es bewahrt keine Nachrichtengrenzen ' , Ihr "Die" -Schlüssel könnte irgendwo im Puffer liegen, vielleicht sogar über Segmente hinweg. – joop