The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  ВХОД  слежка  RSS
"Проблема с getsockopt во FreeBSD 4.4."
Вариант для распечатки  
Пред. тема | След. тема 
Форумы Программирование под UNIX (Public)
Изначальное сообщение [Проследить за развитием треда]

"Проблема с getsockopt во FreeBSD 4.4." 
Сообщение от ZoranIvanovich emailИскать по авторуВ закладки(ok) on 25-Мрт-05, 12:22  (MSK)
Добрый день всем посетителям форума.
Вот столкнулся с проблемой. Есть исходник проги под Линукс, я пытаюсь портировать её под Фрю 4.4. В исходнике есть такой код:
...
struct sockaddr_in SAddr;
...
size = sizeof(SAddr);
if (getsockopt(fd, SOL_IP, SO_ORIGINAL_DST, &SAddr, &size) < 0) {
    perror();
...

Я нашёл что SOL_IP во Фрях это IPPROTO_IP. Но вот аналог для SO_ORIGINAL_DST подобрать не могу.
Суть кода, как я понимаю, заключается в том, чтобы по настроенному ранее идентификатору fd построить структуру SAddr типа sockaddr_in ну и отдать её в дальнешем в connect(), например.
В хидерах Линукса нашёл, что #define SO_ORIGINAL_DST 80 и прописал это в проге. Но во Фрях вовремя выполнения кода возникает ошибка что-то вроде неверный протокол или вроде того. Я понимаю это потому что SO_ORIGINAL_DST 80 непонятен getsockopt во Фрях.
Может есть какой-нибудь способ заставить getsockopt работать и выдавать при этом правильный результать или может быть есть другой вариант как из fd получить SAddr?
Заранее спасибо.

  Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

 Оглавление

Индекс форумов | Темы | Пред. тема | След. тема
Сообщения по теме

1. "Проблема с getsockopt во FreeBSD 4.4." 
Сообщение от MaximKuznetsov Искать по авторуВ закладки on 26-Мрт-05, 07:35  (MSK)
поподробнее, чего именно Вы хотите добиться ?
просто SO_ORIGINAL_DST в Линуксе относится с пакетному фильтру и определен  в ядерных хидерах, что вряд-ли позволит вот так вот просто взять и портировать в BSD..


  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

2. "Проблема с getsockopt во FreeBSD 4.4." 
Сообщение от ZoranIvanovich Искать по авторуВ закладки(??) on 26-Мрт-05, 11:27  (MSK)
>поподробнее, чего именно Вы хотите добиться ?
>просто SO_ORIGINAL_DST в Линуксе относится с пакетному фильтру и определен  в
>ядерных хидерах, что вряд-ли позволит вот так вот просто взять и
>портировать в BSD..


Максим, спасибо за ответ.
Код, естественно, оформлен ввиде функций, но суть такая:

......
struct sockaddr_in addr;
int fd;

if ((fd = accept(serverSocket, (struct sockaddr*)&addr, &length)) < 0) {
    perror("Error on accept() ");
    exit(1);
}
.....

.....
struct sockaddr_in SAddr;
size = sizeof(SAddr);

if (getsockopt(fd, SOL_IP, SO_ORIGINAL_DST, &SAddr, &size) < 0) {
    perror();

...

fd1 = socket(AF_INET, SOCK_STREAM, 0);
...
if (connect(fd1, (struct sockaddr*)&SAddr, sizeof(SAddr)) < 0) {
    perror("Connect to original destination failed.");
    close(fd1);
    exit(1);
}
.....

И как я уже говорил во Фрях это не работает, perror возвращает  - ENOPROTOOPT: Protocol not available.

  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

3. "Проблема с getsockopt во FreeBSD 4.4." 
Сообщение от MaximKuznetsov Искать по авторуВ закладки on 26-Мрт-05, 14:34  (MSK)
>>поподробнее, чего именно Вы хотите добиться ?
>>просто SO_ORIGINAL_DST в Линуксе относится с пакетному фильтру и определен  в
>>ядерных хидерах, что вряд-ли позволит вот так вот просто взять и
>>портировать в BSD..
>
>
>Максим, спасибо за ответ.
>Код, естественно, оформлен ввиде функций, но суть такая:
>
>......
>struct sockaddr_in addr;
>int fd;
>
>if ((fd = accept(serverSocket, (struct sockaddr*)&addr, &length)) < 0) {
>    perror("Error on accept() ");
>    exit(1);
>}
>.....
>
>.....
>struct sockaddr_in SAddr;
>size = sizeof(SAddr);
>
>if (getsockopt(fd, SOL_IP, SO_ORIGINAL_DST, &SAddr, &size) < 0) {
>    perror();
>
>...
>
>fd1 = socket(AF_INET, SOCK_STREAM, 0);
>...
>if (connect(fd1, (struct sockaddr*)&SAddr, sizeof(SAddr)) < 0) {
>    perror("Connect to original destination failed.");
>    close(fd1);
>    exit(1);
>}
>.....
>
>И как я уже говорил во Фрях это не работает, perror возвращает
> - ENOPROTOOPT: Protocol not available.

если я правильно понял, то приведенный код - просто обратный вызов..
в этом случае getsockopt - вообще лишняя операция, вполне достаточно информации полученной при accept..

вместо connect(fd1, (struct sockaddr*)&SAddr, sizeof(SAddr))
поставьте connect(fd1, (struct sockaddr*)&addr, sizeof(SAddr))
и будет Вам счастье ;-)

а автору оригинального кода надо поучиться не пораждать непереносимость на пустом месте


  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

4. "Проблема с getsockopt во FreeBSD 4.4." 
Сообщение от ZoranIvanovich Искать по авторуВ закладки(??) on 26-Мрт-05, 16:05  (MSK)
>если я правильно понял, то приведенный код - просто обратный вызов..
>в этом случае getsockopt - вообще лишняя операция, вполне достаточно информации полученной
>при accept..
>
>вместо connect(fd1, (struct sockaddr*)&SAddr, sizeof(SAddr))
>поставьте connect(fd1, (struct sockaddr*)&addr, sizeof(SAddr))
>и будет Вам счастье ;-)
>
>а автору оригинального кода надо поучиться не пораждать непереносимость на пустом месте
>


Максим, спасибо за совет. Я тоже подумывал о таком решении и скорее всего так и поступлю. Но прога, которую я портирую выглядит достаточно "стройной" и я хотел просто обойтись, что называется "малой кровью".
Ещё раз спасибо.

  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх


Архив | Удалить

Индекс форумов | Темы | Пред. тема | След. тема
Пожалуйста, прежде чем написать сообщение, ознакомьтесь с данными рекомендациями.




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2025 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру