Ошибка rawto сокета sendto () в OS X - PullRequest
2 голосов
/ 12 марта 2010

Когда я открываю необработанный сокет OS X, создаю свой собственный пакет udp (заголовки и данные) и вызываю sendto (), я получаю ошибку «Недопустимый аргумент». Вот пример программы "rawudp.c" с веб-сайта http://www.tenouk.com/Module43a.html, которая демонстрирует эту проблему. Программа (после добавления строки и stdlib #includes) запускается в Fedora 10, но завершается неудачно с «Invalid Argument» в OS X. Кто-нибудь может подсказать, почему это не удается в OS X? Я посмотрел и посмотрел и посмотрел на вызов sendto (), но все параметры выглядят хорошо. Я запускаю код от имени пользователя root и т. Д. Возможно, есть параметр ядра, который не позволяет даже исполняемым файлам uid 0 отправлять пакеты через необработанные сокеты в OS X Snow Leopard? Спасибо.

Ответы [ 3 ]

6 голосов
/ 23 августа 2011

Возможно, я раскрыл тайну. Я также создал пример необработанного сокета, который отлично работает в Linux, но получил ошибку «Недопустимый аргумент» в OS X 10.6.
Я наткнулся на эту страницу " Ошибки и особенности сокетов FreeBSD ", когда гуглил для ответа. И это говорит:

Запись в RAW сокеты


- ip_len и ip_off должны быть в порядке байтов хоста

Так что я заменяю

ip.ip_len = htons(len);

с

ip.ip_len = len;

на OS X. И это работает, как ни странно.

3 голосов
/ 17 сентября 2010

user37278, я запустил ту же программу на Mac OS X (Snow Leopard) и получил то же сообщение об ошибке. Я обнаружил, что проблема заключается в том, что пользовательская структура заголовка IP не соответствует формату заголовка IP. (Может быть, есть какая-то разница в машинах ... Я не уверен).

Я удалил его пользовательскую структуру заголовка IP и использовал структуру заголовка IP, включенную в Mac OS X. Информация заголовка определяется в <netinet/ip.h>, а структура - struct ip. Я также нашел другую структуру под названием struct iphdr, и я не уверен, что разница.

Заголовки, которые я включил, <netinet/ip.h> <netinet/udp.h> <netinet/in.h> <arpa/inet.h>

Надеюсь, это поможет.

0 голосов
/ 23 июня 2010

FreeBSD использует другой подход. Он никогда не передает пакеты TCP или UDP в raw Розетки. Такие пакеты необходимо читать непосредственно на уровне канала передачи данных, используя библиотеки, такие как libpcap или bpf API. Он также никогда не передает фрагментированный дейтаграммы. Каждая датаграмма должна быть полностью собрана до того, как она будет передана в сырую розетку.

это может пойти и на OSX

Источник: http://sock -raw.org / документы / SOCK_RAW

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...