LINUX.ORG.RU

Почему не читаются пакеты из raw socket?

 ,


1

1

Вот простой пример программы чтения из raw socket. Ищется в инете чуть-ли самый первый.

/*** IPPROTO_RAW receiver ***/
#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/ip.h>
#include <arpa/inet.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>


int main(void)
{
	int s;
	struct sockaddr_in saddr;
	char packet[50];

	if ((s = socket(AF_INET, SOCK_RAW, IPPROTO_RAW)) < 0) {
		perror("error:");
		exit(EXIT_FAILURE);
	}

	memset(packet, 0, sizeof(packet));
	socklen_t *len = (socklen_t *)sizeof(saddr);
	int fromlen = sizeof(saddr);

	while(1) {
		if (recvfrom(s, (char *)&packet, sizeof(packet), 0,
			(struct sockaddr *)&saddr, &fromlen) < 0)
			perror("packet receive error:");

		int i = sizeof(struct iphdr);	/* print the payload */
		while (i < sizeof(packet)) {
			fprintf(stderr, "%c", packet[i]);
			i++;
		}
		printf("\n");
	}
	exit(EXIT_SUCCESS);
}



Работает, но только когда пакеты посылаются на петлевой интерфейс (127.0.0.1). А если послать их по реальной физичской сети, то программка ничего не читает из сокета. В чем может быть дело? tcpdump пакеты ловит, проверено, т.е. физически они передаются.

Во-первых..

char packet[50];

Хотя бы 1500 поставь лол. А во-вторых, сделай setsockopt(s, SOL_SOCKET, SO_BINDTODEVICE, iface, strlen(iface)); где iface – имя твоего интерфейса. Например, «eth0».

Можешь тут почитать подробнее: https://stackoverflow.com/questions/3998569/how-to-bind-raw-socket-to-specific-interface

hateyoufeel ★★★★★
()
Последнее исправление: hateyoufeel (всего исправлений: 1)