Вход на сайт
TCP изнутри
352
NEW 20.02.07 19:12
Как известно, соединение TCP происходит в три этапа:

Есть ли возможность программно определить, что первые 2 этапа состоялись? Или даже лучше, чтобы это событие как-то программно сигнализировалось под Линуксом.
В общем суть проблемы в том, что есть 2 компа, каждый из которых может в любой момент стать клиентом или сервером. Но 2-х соединений допустить нельзя.

Есть ли возможность программно определить, что первые 2 этапа состоялись? Или даже лучше, чтобы это событие как-то программно сигнализировалось под Линуксом.
В общем суть проблемы в том, что есть 2 компа, каждый из которых может в любой момент стать клиентом или сервером. Но 2-х соединений допустить нельзя.
http://denis-aristov.ucoz.com
NEW 08.03.07 15:55
в ответ scorpi_ 26.02.07 02:51
Спасибо за совет! Книга дает очень подробное описание протокола TCP и программирования сокетов. Вот только не нашел одного - как можно заставить функцию connect() отсылать только один пакет SYN. Возможно ли это вообще? В моей реализации надо включать таймер после каждой попытки соединения, т.е. после отсылки пакета SYN.
http://denis-aristov.ucoz.com
08.03.07 16:21
в ответ kashej 08.03.07 15:55
как можно заставить функцию connect() отсылать только один пакет SYN.
В моей реализации надо включать таймер после каждой попытки соединения, т.е. после отсылки пакета SYN.
------
Так тебе придется переписывать чуть ли не всю реализацию сокетов.
Насколько я помню, в мелкософтовских сокетах есть событие, возникающее при запросе соединения с ремотного хоста. В нем же можно отказаться от соединения. Так что подумай над постановкой задачи...
В моей реализации надо включать таймер после каждой попытки соединения, т.е. после отсылки пакета SYN.
------
Так тебе придется переписывать чуть ли не всю реализацию сокетов.
Насколько я помню, в мелкософтовских сокетах есть событие, возникающее при запросе соединения с ремотного хоста. В нем же можно отказаться от соединения. Так что подумай над постановкой задачи...
NEW 11.03.07 14:41
в ответ Murr 08.03.07 16:21
Вот в постановке задачи я как раз сильно стеснен, вернее, задача уже поставлена и дело сейчас за реализацией. А моя реализация должна опираться на вот этот draft:
http://www3.ietf.org/internet-drafts/draft-ietf-pce-pcep-07.txt
http://www3.ietf.org/internet-drafts/draft-ietf-pce-pcep-07.txt
http://denis-aristov.ucoz.com
NEW 30.03.07 16:09
в ответ kashej 25.02.07 16:49
>В общем суть проблемы в том, что есть 2 компа, каждый из которых может в любой момент стать клиентом или сервером. Но 2-х соединений допустить нельзя.
Я так сут проблеми и не понял.
> каждый из которых может в любой момент стать клиентом или сервером
В любом случае работа сервера отли4ается от работи клиента, с точки зрения программирования сокетов.
>Но 2-х соединений допустить нельзя
Что ти имееш ввиду. По определению Сервер обызан имет возмозност одновременно обслузиват более одного клиента.
на с4ет функции connect, то 4то она делает (сколко SYN-ов отправляет) не известно, на сокети мозно настроит при помос4и функций: getsockopt() и setsockopt() .
>надо стэк TCP вроде перепрограммировать
Ест такая тема RAW-Сокет, деталеи не знаю, но слишал позволяет на более низком уровне работат с Пакетами, чут ли не вручную формироват его.
Работая просто со стандартними сокетами вся работа TCP-IP у UDP от тебя скрiта
Я так сут проблеми и не понял.
> каждый из которых может в любой момент стать клиентом или сервером
В любом случае работа сервера отли4ается от работи клиента, с точки зрения программирования сокетов.
>Но 2-х соединений допустить нельзя
Что ти имееш ввиду. По определению Сервер обызан имет возмозност одновременно обслузиват более одного клиента.
на с4ет функции connect, то 4то она делает (сколко SYN-ов отправляет) не известно, на сокети мозно настроит при помос4и функций: getsockopt() и setsockopt() .
>надо стэк TCP вроде перепрограммировать
Ест такая тема RAW-Сокет, деталеи не знаю, но слишал позволяет на более низком уровне работат с Пакетами, чут ли не вручную формироват его.
Работая просто со стандартними сокетами вся работа TCP-IP у UDP от тебя скрiта
NEW 03.04.07 18:32
в ответ VseNikiZanyati 30.03.07 16:09
Спасибо за интерес!
Дело в том, что на тот момент я еще был на начальной стадии. Врабатывался в проект, так сказать.
Сейчас могу задать вопрос более конкретно:
Есть ли возможножность, при получении запроса на соединение TCP, определить IP адрес и номер порта (для идентификации клиента), и если нужно, то впоследствии отклонить запрос на это соединение используя сокеты под линуксом?
Дело в том, что на тот момент я еще был на начальной стадии. Врабатывался в проект, так сказать.
Сейчас могу задать вопрос более конкретно:
Есть ли возможножность, при получении запроса на соединение TCP, определить IP адрес и номер порта (для идентификации клиента), и если нужно, то впоследствии отклонить запрос на это соединение используя сокеты под линуксом?
http://denis-aristov.ucoz.com
NEW 04.04.07 10:34
в ответ Murr 03.04.07 20:17
> Есть ли возможножность, при получении запроса на соединение TCP, определить IP адрес и номер порта (для идентификации клиента), и если нужно, то впоследствии отклонить запрос на это соединение используя сокеты под линуксом?
Я работаю сеи4ас косвенно (4ерез интерфеис классов) с библиотекои WinSock - 4аст этои библиотеки составляут стандартние socket-и, поетому думаю, 4то ответ будет актуален и для Unix:
> при получении запроса на соединение TCP
Полу4ат будет однозна4но Сервер, а по сему: после визова функции "listen" - прослушивание порта Сервером, предварително свызав его зестко функцией "bind", будет визвана функция "accept", которая 2-м виходним параметром имеет указател на структуру, где будет информация о подклю4ившемся клиенте (IP + Port). Функция "accept" создает ес4о один сокет и возврас4ает на него ссилку, а исходни сокет (котори при помос4и "bind" бил с портом связан) остается далше прослушиват порт.
> впоследствии отклонить запрос на это соединение
Ессесно, просто проверяеш (в зависимости от условий) "хороши" клиент - работаем с ним, "плохои" клиент - закриваем socket, котори бил создан при помос4и "accept": сна4ала функция "shutdown" а потом "closesocket".
А вообс4е по4итай следуюс4ее:
1) http://delphikingdom.ru/asp/viewitem.asp?catalogid=1021
2) http://book.itep.ru/7/sock_71.htm
Я работаю сеи4ас косвенно (4ерез интерфеис классов) с библиотекои WinSock - 4аст этои библиотеки составляут стандартние socket-и, поетому думаю, 4то ответ будет актуален и для Unix:
> при получении запроса на соединение TCP
Полу4ат будет однозна4но Сервер, а по сему: после визова функции "listen" - прослушивание порта Сервером, предварително свызав его зестко функцией "bind", будет визвана функция "accept", которая 2-м виходним параметром имеет указател на структуру, где будет информация о подклю4ившемся клиенте (IP + Port). Функция "accept" создает ес4о один сокет и возврас4ает на него ссилку, а исходни сокет (котори при помос4и "bind" бил с портом связан) остается далше прослушиват порт.
> впоследствии отклонить запрос на это соединение
Ессесно, просто проверяеш (в зависимости от условий) "хороши" клиент - работаем с ним, "плохои" клиент - закриваем socket, котори бил создан при помос4и "accept": сна4ала функция "shutdown" а потом "closesocket".
А вообс4е по4итай следуюс4ее:
1) http://delphikingdom.ru/asp/viewitem.asp?catalogid=1021
2) http://book.itep.ru/7/sock_71.htm
NEW 04.04.07 22:34
В плане бреда. Если порты и адреса по которым нужно послать "отлуп" известны заранее - почему бы передать эту функциональность встроенному файрволу Netfilter/Iptables ? Конечно некий гимор с правами, но с помошью sudo можно и это обойти.
В ответ на:
Есть ли возможножность, при получении запроса на соединение TCP, определить IP адрес и номер порта (для идентификации клиента), и если нужно, то впоследствии отклонить запрос на это соединение используя сокеты под линуксом?
Есть ли возможножность, при получении запроса на соединение TCP, определить IP адрес и номер порта (для идентификации клиента), и если нужно, то впоследствии отклонить запрос на это соединение используя сокеты под линуксом?
В плане бреда. Если порты и адреса по которым нужно послать "отлуп" известны заранее - почему бы передать эту функциональность встроенному файрволу Netfilter/Iptables ? Конечно некий гимор с правами, но с помошью sudo можно и это обойти.
*Ъ...