2016-06-23 23 views
2

Ich habe zwei Programme Udp Sender und Consumer auf localhost. Der Absender generiert vier Byte int-Nachrichten mit Höchstgeschwindigkeit, aber der Verbraucher erhält nicht alle von ihnen. Consumer letzte Zeile auf stdout istWie alle UDP-Nachrichten wie Wireshark ohne Tropfen zu fangen?

Wireshark fängt alle Pakete und langsam verarbeitet sie alle. Wie kann ich das gleiche Verhalten in einem C-Programm bekommen?

// sender.c 

#include <sys/socket.h> 
#include <netinet/in.h> 
#include <strings.h> 
#include <arpa/inet.h> 
#include <unistd.h> 
#include <string.h> 

int main() 
{ 
    int sock = socket(AF_INET, SOCK_DGRAM, 0); 
    struct sockaddr_in dest; 
    bzero(&dest, sizeof(dest)); 
    dest.sin_family = AF_INET; 
    dest.sin_port = htons(40500); 
    inet_aton("127.0.0.1", &dest.sin_addr); 
    int i; 
    for (i = 0; i < 2000000; ++i) { 
     sendto(sock, &i, sizeof(i), 0, (const struct sockaddr*)&dest, sizeof(dest)); 
    } 
} 

// consumer.c 

#include <sys/socket.h> 
#include <netinet/in.h> 
#include <strings.h> 
#include <arpa/inet.h> 
#include <stdio.h> 

int main() 
{ 
    int sock = socket(AF_INET, SOCK_DGRAM, 0); 
    struct sockaddr_in dest; 
    bzero(&dest, sizeof(dest)); 
    dest.sin_family = AF_INET; 
    dest.sin_port = htons(40500); 
    inet_aton("127.0.0.1", &dest.sin_addr); 
    bind(sock, (const struct sockaddr*)&dest, sizeof(dest)); 
    int i; 
    int buf; 
    for (i = 0; i < 2000000; ++i) { 
     recv(sock, &buf, sizeof(buf), 0); 
     printf("%d %d\n", i, buf); 
    } 
} 

Antwort

1

Ich denke, Ihr Problem der Server-Seite Prozess langsamer als der Absender ist side.If die Socket-Puffer des Servers empfangen voll ist, dann die zusätzlichen Pakete vom Kernel geliefert wird droped werden. Um die Leistung zu verbessern, denke ich, gibt es mehrere Dinge, die Sie tun können:

1. Erhöhen Sie die Server-Seite Empfangspuffer.

2. Verwenden Sie Batch-Sende- und Empfangsschnittstellen (z. B. sendmmsg(), recvmmsg()). Dies reduziert den Overhead des Systemaufrufs.

3. Rufen Sie printf() nicht jedes Mal auf, wenn Sie einen Datenpuffer erhalten. Es ist zeitaufwendig.

+0

Die Erhöhung der Puffer half. 'int bsize = 32000000; setsockopt (Socken, SOL_SOCKET, SO_RCVBUF, & bsize, sizeof (bsize)); ' – nnovzver