Ich schreibe ein Tool in C für die Protokollierung der Datennutzung von verschiedenen Anwendungen auf meinem Linux-System. Dafür habe ich einen rohen Socket erstellt und dann binde ich ihn mit "eth0", was der Name meiner Schnittstelle ist. Aber mein Problem ist, dass diese Sockets nur eingehende Pakete erfassen (dh: Pakete mit Ziel-MAC-Adresse als MAC-Adresse meines Systems). Ich kann keine Pakete finden, deren Quell-MAC-Adresse die MAC-Adresse meines Systems ist. Es bedeutet also, dass Pakete, die von meiner eigenen Maschine geschrieben wurden, nicht vom rohen Socket erfasst werden. Aber ich möchte Pakete in beiden Richtungen erfassen, um die hochgeladene und heruntergeladene Datengröße zu identifizieren. Kann jemand helfen?Erfassen von eingehenden und ausgehenden Paketen mit Raw-Socket
int main()
{
int rs,len;
struct sockaddr_ll addr;
char buf[65535];
rs = socket(PF_PACKET,SOCK_RAW,htons(ETH_ALL));
setsockopt(rs,SOL_SOCKET,SO_BINDDEVICE,"eth0",4);
while(recvfrom(rs,buf,65535,&addr,&len) > 0){
//print packets
}
return 0;
}
Vielen Dank für Ihre Antwort. Aber es gibt keinen Makro mit dem Namen PACKET_MASK_ANY in meinem/usr/include –
#define PACKET_MASK_ANY 0xffffffff/* Maske für Pakettyp Bits */ #define PACKET_OUTGOING 4/* Abgehende jeglicher Art */ #define PACKET_RECV_TYPE 18 –
Es gibt keine Socket-Operationsmakro namens PACKET_RECV_TYPE. bist du aus Kerala? –