русский
Germany.ruForen → Архив Досок→ Programmierung

TCP изнутри

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

Есть ли возможность программно определить, что первые 2 этапа состоялись? Или даже лучше, чтобы это событие как-то программно сигнализировалось под Линуксом.
В общем суть проблемы в том, что есть 2 компа, каждый из которых может в любой момент стать клиентом или сервером. Но 2-х соединений допустить нельзя.
http://denis-aristov.ucoz.com
#1 
kashej завсегдатай25.02.07 16:49
kashej
NEW 25.02.07 16:49 
in Antwort kashej 20.02.07 19:12
Что-то совсем тихо...
Я слышал, что надо стэк TCP вроде перепрограммировать. Делал кто-нибудь что-то подобное? Долго ли надо врабатываться в эту тему?
http://denis-aristov.ucoz.com
#2 
  scorpi_ скептик26.02.07 02:51
NEW 26.02.07 02:51 
in Antwort kashej 20.02.07 19:12
Странные вопросы ты задаёшь, вот никто и не отвечает. Почитай Стивенса - "Unix network programming", может поможет.
Если у тебя на клиенте функция connect вернула 0 - вот твои два этапа и состоялись.
#3 
kashej завсегдатай08.03.07 15:55
kashej
NEW 08.03.07 15:55 
in Antwort scorpi_ 26.02.07 02:51
Спасибо за совет! Книга дает очень подробное описание протокола TCP и программирования сокетов. Вот только не нашел одного - как можно заставить функцию connect() отсылать только один пакет SYN. Возможно ли это вообще? В моей реализации надо включать таймер после каждой попытки соединения, т.е. после отсылки пакета SYN.
http://denis-aristov.ucoz.com
#4 
Murr коренной житель08.03.07 16:21
Murr
NEW 08.03.07 16:21 
in Antwort kashej 08.03.07 15:55
как можно заставить функцию connect() отсылать только один пакет SYN.
В моей реализации надо включать таймер после каждой попытки соединения, т.е. после отсылки пакета SYN.
------
Так тебе придется переписывать чуть ли не всю реализацию сокетов.
Насколько я помню, в мелкософтовских сокетах есть событие, возникающее при запросе соединения с ремотного хоста. В нем же можно отказаться от соединения. Так что подумай над постановкой задачи...
#5 
kashej завсегдатай11.03.07 14:41
kashej
NEW 11.03.07 14:41 
in Antwort Murr 08.03.07 16:21
Вот в постановке задачи я как раз сильно стеснен, вернее, задача уже поставлена и дело сейчас за реализацией. А моя реализация должна опираться на вот этот draft:
http://www3.ietf.org/internet-drafts/draft-ietf-pce-pcep-07.txt
http://denis-aristov.ucoz.com
#6 
VseNikiZanyati гость30.03.07 16:09
NEW 30.03.07 16:09 
in Antwort kashej 25.02.07 16:49
>В общем суть проблемы в том, что есть 2 компа, каждый из которых может в любой момент стать клиентом или сервером. Но 2-х соединений допустить нельзя.
Я так сут проблеми и не понял.
> каждый из которых может в любой момент стать клиентом или сервером
В любом случае работа сервера отли4ается от работи клиента, с точки зрения программирования сокетов.
>Но 2-х соединений допустить нельзя
Что ти имееш ввиду. По определению Сервер обызан имет возмозност одновременно обслузиват более одного клиента.
на с4ет функции connect, то 4то она делает (сколко SYN-ов отправляет) не известно, на сокети мозно настроит при помос4и функций: getsockopt() и setsockopt() .
>надо стэк TCP вроде перепрограммировать
Ест такая тема RAW-Сокет, деталеи не знаю, но слишал позволяет на более низком уровне работат с Пакетами, чут ли не вручную формироват его.
Работая просто со стандартними сокетами вся работа TCP-IP у UDP от тебя скрiта
#7 
kashej постоялец03.04.07 18:32
kashej
NEW 03.04.07 18:32 
in Antwort VseNikiZanyati 30.03.07 16:09
Спасибо за интерес!
Дело в том, что на тот момент я еще был на начальной стадии. Врабатывался в проект, так сказать.
Сейчас могу задать вопрос более конкретно:
Есть ли возможножность, при получении запроса на соединение TCP, определить IP адрес и номер порта (для идентификации клиента), и если нужно, то впоследствии отклонить запрос на это соединение используя сокеты под линуксом?
http://denis-aristov.ucoz.com
#8 
Murr коренной житель03.04.07 20:17
Murr
NEW 03.04.07 20:17 
in Antwort kashej 03.04.07 18:32
Есть ли возможножность... ...используя сокеты под линуксом?
------
MAN SOCKET?
#9 
  vadim прохожий04.04.07 04:31
NEW 04.04.07 04:31 
in Antwort Murr 03.04.07 20:17
В ответ на:
MAN SOCKET?

Нет, man accept - для адреса, man bind - для порта.
#10 
VseNikiZanyati гость04.04.07 10:34
NEW 04.04.07 10:34 
in Antwort 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
#11 
Murr коренной житель04.04.07 11:38
Murr
NEW 04.04.07 11:38 
in Antwort vadim 04.04.07 04:31
Ну на смайлики то иногда надо смотреть...
#12 
Murr коренной житель04.04.07 11:40
Murr
NEW 04.04.07 11:40 
in Antwort VseNikiZanyati 04.04.07 10:34
Все правильно, но немного не по адресу...
#13 
kashej постоялец04.04.07 11:57
kashej
04.04.07 11:57 
in Antwort VseNikiZanyati 04.04.07 10:34
Вот в том то и проблема, что после возврата из функции accept соединение уже установлено, а еще точнее - клиент оповещен об установлении соединения, что мне совсем не нужно.
http://denis-aristov.ucoz.com
#14 
VseNikiZanyati гость04.04.07 13:25
NEW 04.04.07 13:25 
in Antwort kashej 04.04.07 11:57
>Так тебе придется переписывать чуть ли не всю реализацию сокетов.
Как выше сказано, прид╦тся пару (а может и пару десятков) функций переписывать.
#15 
AlterEgo Чеширръ04.04.07 22:34
AlterEgo
NEW 04.04.07 22:34 
in Antwort kashej 03.04.07 18:32, Zuletzt geändert 05.04.07 22:38 (AlterEgo)
В ответ на:
Есть ли возможножность, при получении запроса на соединение TCP, определить IP адрес и номер порта (для идентификации клиента), и если нужно, то впоследствии отклонить запрос на это соединение используя сокеты под линуксом?

В плане бреда. Если порты и адреса по которым нужно послать "отлуп" известны заранее - почему бы передать эту функциональность встроенному файрволу Netfilter/Iptables ? Конечно некий гимор с правами, но с помошью sudo можно и это обойти.
*Ъ...
#16