URL: https://www.opennet.ru/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 7161
[ Назад ]

Исходное сообщение
"Пример работы с raw-socket'ом"

Отправлено Susanin , 06-Фев-08 15:43 
Добрый день.
У меня возникли проблемы с приемом и передачей пакета через raw-socket. Мне в проге нужно сформировать IP-пакет весте с заголовком и передать его через raw-socket, и соответственно потом принять его, остальные подробности задаче думаю не важны. Я уже 4 дня вдоль и попрек перерываю статьи, сообщения форума, но пока безрезультатно((
Если у кого есть работающий пример передачи пакета под FreeBSD, скиньте пожалуйста.
Заранее благодарен.

Содержание

Сообщения в этом обсуждении
"Пример работы с raw-socket'ом"
Отправлено stolik , 06-Фев-08 16:40 
>Добрый день.
>У меня возникли проблемы с приемом и передачей пакета через raw-socket. Мне
>в проге нужно сформировать IP-пакет весте с заголовком и передать его
>через raw-socket, и соответственно потом принять его, остальные подробности задаче думаю
>не важны. Я уже 4 дня вдоль и попрек перерываю статьи,
>сообщения форума, но пока безрезультатно((
>Если у кого есть работающий пример передачи пакета под FreeBSD, скиньте пожалуйста.
>
>Заранее благодарен.

Не ясно в чем же все таки проблемма. Не знаю как во FreeBSD, но в Линуксе поступаем как обычно, заводим сокет, формируем пакет, и проталкиваем его в сокет. :)
В чем проблемма то


"Пример работы с raw-socket'ом"
Отправлено Susanin , 06-Фев-08 16:58 
>Не ясно в чем же все таки проблемма. Не знаю как во
>FreeBSD, но в Линуксе поступаем как обычно, заводим сокет, формируем пакет,
>и проталкиваем его в сокет. :)
>В чем проблемма то

Принцип то ясен. Проблема в том, что Sendto() не отправляет пакет((
Может я что-то не так делаю. Поэтому и прошу скинуть уже проверенный пример, а дальше я думаю с без проблем разберусь. Если есть, скиньте пожалуйста


"Пример работы с raw-socket'ом"
Отправлено stolik , 06-Фев-08 18:24 
>Принцип то ясен. Проблема в том, что Sendto() не отправляет пакет((
>Может я что-то не так делаю. Поэтому и прошу скинуть уже проверенный
>пример, а дальше я думаю с без проблем разберусь. Если есть,
>скиньте пожалуйста

Ну вот например в Линуксе, реально рабочий пример с пакетными сокетами. Разница в том, что для пакетного сокета вы формируете пакет полностью

if( (sd = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_ALL))) < 0 )
{
  perror("socket()");
  exit(EXIT_FAILURE); //либо throw
}

......
//формируем пакет
......

if(ioctl(sd, SIOCGIFINDEX, &ifr) < 0)
{
  perror("ioctl()");
  close(sd);
}

s_ll.sll_family = AF_PACKET;
s_ll.sll_ifindex = ifr.ifr_ifru.ifru_ivalue;

/* в бесконечном цикле отправляем пакеты */
int Tsend = 3000;

while(1)
{
if(sendto(sd,sendpacket1,len_sendpacket1,0,(struct sockaddr*)&s_ll,sizeof(struct sockaddr_ll)) < 0)
{
   perror("sendto()");
}
usleep((Tsend));
}


"Пример работы с raw-socket'ом"
Отправлено Susanin , 07-Фев-08 00:42 
Большое спасибо за помощь. И еще вот только хочу уточнить...
При формировании пакета нужно формировать только IP-заголовок, или заголовок канального уровня тоже (Ethernet-заголовок)?


"Пример работы с raw-socket'ом"
Отправлено jd2 , 08-Фев-08 04:07 
В Линухе можно и так, и так. Во фре - наверняка тоже.

"Пример работы с raw-socket'ом"
Отправлено stolik , 08-Фев-08 10:33 
Для raw-сокетов достаточно формировать только ip-заголовок, для пакетных сокетов, надо делать весь пакет полностью, включая и ethernet заголовок.
Однако, если я не ошибаюсь, пакетные сокеты есть только в Линуксе.

"Пример работы с raw-socket'ом"
Отправлено Susanin , 08-Фев-08 12:41 
>Для raw-сокетов достаточно формировать только ip-заголовок, для пакетных сокетов, надо делать весь
>пакет полностью, включая и ethernet заголовок.
> Однако, если я не ошибаюсь, пакетные сокеты есть только в Линуксе.
>

Спасибо большое за помощь


"Пример работы с raw-socket'ом"
Отправлено L1ker , 26-Мрт-09 19:32 
Подскажите а как на фре собрать пакет включая ethrnet заголовок?