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);
}
}
Die Erhöhung der Puffer half. 'int bsize = 32000000; setsockopt (Socken, SOL_SOCKET, SO_RCVBUF, & bsize, sizeof (bsize)); ' – nnovzver