Sockets
Модератор: Модераторы
- shade
- энтузиаст
- Сообщения: 879
- Зарегистрирован: 21.02.2006 19:15:48
- Откуда: http://shamangrad.net/
- Контактная информация:
Можно начать от сюда: Использование интерфейса сокетов
Коммунар писал(а):Теперь уже прикладной вопрос
Recv вернул -1 (то бишь, произошла ошибка). В RTL написано, что в случае ошибки подробности будут в SocketError, однако там ноль (в прямом смысле). Что это значит?
В своем проект по -1 определяю как потерю связи.
В свое время методом экспериментов получил что -1 появляется:
1. При закрытии сокета если в этот момент сокет ожидал данные.
В моем случае - в потоке recv ожидает данные, а в основной программе закрываю сокет (приэтом я знаю что я закрыл сокет и -1 не обрабатываю).
2. При попытке передать данные через сокет и в этот момент сокет ожидал данные и самое главное связь была потеряна (иногда связь пропадает так что сокет этого не замечает, обычно если соединение через NAT т.е. этом случае ни сервер ни клиент не определяют потерю связи.
В моем случае - в потоке recv ожидает данные, а программа пытается что-то передать через сокет (-1 использую как признак потери связи)
Вот, как мне показалось, не плохие примеры использования сокетов - Internet Programming with Pascal
http://www.bastisoft.de/pascal/pasinet.html
Сам пока не использовал.
http://www.bastisoft.de/pascal/pasinet.html
Сам пока не использовал.
- Коммунар
- новенький
- Сообщения: 13
- Зарегистрирован: 04.06.2008 23:23:36
- Откуда: ССКР
- Контактная информация:
yser
В моём случае ни первое, ни второе невозможно, поскольку я подключаюсь к локальному (localhost) FTP серверу и жду от него строчку в ~20 символов, которую помещаю в string[255].
Вадим
Спасибо большое! Приведённые примеры не проверял, но поставив Sock2Text вместо recv получил то, что хотел
В моём случае ни первое, ни второе невозможно, поскольку я подключаюсь к локальному (localhost) FTP серверу и жду от него строчку в ~20 символов, которую помещаю в string[255].
Вадим
Спасибо большое! Приведённые примеры не проверял, но поставив Sock2Text вместо recv получил то, что хотел
Я проверил примеры (ссылку на которые указал) - с небольшими изменениями работают.
А сам столкнулся с проблемой, когда после остановки TCP-сервера не могу вновь его запустить в течении некоторого времени - система отвечает ошибкой на команду Bind, говоря, что порт уже занят. Все дело оказалось в том, что если к серверу был подключен клиент и сервер остановили, то слушающий сокет переходит в состояние TIME_WAIT и находится в нем от 30 сек до 30 минут в зависимости от типа системы, то есть дефолтовых настроек.
Что бы избежать такой проблемы нужно после создания сокета установить опцию SO_REUSEADDR командой SetSocketOptions.
По поводу выявления ситуации потери связи - никак не обнаружишь пока не попытаешся передать данные.
А сам столкнулся с проблемой, когда после остановки TCP-сервера не могу вновь его запустить в течении некоторого времени - система отвечает ошибкой на команду Bind, говоря, что порт уже занят. Все дело оказалось в том, что если к серверу был подключен клиент и сервер остановили, то слушающий сокет переходит в состояние TIME_WAIT и находится в нем от 30 сек до 30 минут в зависимости от типа системы, то есть дефолтовых настроек.
Что бы избежать такой проблемы нужно после создания сокета установить опцию SO_REUSEADDR командой SetSocketOptions.
По поводу выявления ситуации потери связи - никак не обнаружишь пока не попытаешся передать данные.
Вадим писал(а):Вот, как мне показалось, не плохие примеры использования сокетов - Internet Programming with Pascal
http://www.bastisoft.de/pascal/pasinet.html
Сам пока не использовал.
Ссылка изменилась. Теперь правильно так:
http://www.bastisoft.de/programmierung/ ... sinet.html
