Добрый день всем посетителям форума.
Вот столкнулся с проблемой. Есть исходник проги под Линукс, я пытаюсь портировать её под Фрю 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?
Заранее спасибо.
поподробнее, чего именно Вы хотите добиться ?
просто SO_ORIGINAL_DST в Линуксе относится с пакетному фильтру и определен в ядерных хидерах, что вряд-ли позволит вот так вот просто взять и портировать в BSD..
>поподробнее, чего именно Вы хотите добиться ?
>просто 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.
>>поподробнее, чего именно Вы хотите добиться ?
>>просто 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))
и будет Вам счастье ;-)а автору оригинального кода надо поучиться не пораждать непереносимость на пустом месте
>если я правильно понял, то приведенный код - просто обратный вызов..
>в этом случае getsockopt - вообще лишняя операция, вполне достаточно информации полученной
>при accept..
>
>вместо connect(fd1, (struct sockaddr*)&SAddr, sizeof(SAddr))
>поставьте connect(fd1, (struct sockaddr*)&addr, sizeof(SAddr))
>и будет Вам счастье ;-)
>
>а автору оригинального кода надо поучиться не пораждать непереносимость на пустом месте
>
Максим, спасибо за совет. Я тоже подумывал о таком решении и скорее всего так и поступлю. Но прога, которую я портирую выглядит достаточно "стройной" и я хотел просто обойтись, что называется "малой кровью".
Ещё раз спасибо.