Sockets

Модератор: Модераторы

Ответить
Аватара пользователя
Коммунар
новенький
Сообщения: 13
Зарегистрирован: 04.06.2008 23:23:36
Откуда: ССКР
Контактная информация:

Sockets

Сообщение Коммунар »

Скажите, где можно понятно почитать про модуль Sockets? А то я читаю справочник по RTL и нифига не въезжаю.
Аватара пользователя
shade
энтузиаст
Сообщения: 879
Зарегистрирован: 21.02.2006 19:15:48
Откуда: http://shamangrad.net/
Контактная информация:

Сообщение shade »

Аватара пользователя
Коммунар
новенький
Сообщения: 13
Зарегистрирован: 04.06.2008 23:23:36
Откуда: ССКР
Контактная информация:

Сообщение Коммунар »

shade
Спасибо огромное! Как раз то, что надо!
Аватара пользователя
Коммунар
новенький
Сообщения: 13
Зарегистрирован: 04.06.2008 23:23:36
Откуда: ССКР
Контактная информация:

Сообщение Коммунар »

Теперь уже прикладной вопрос :)
Recv вернул -1 (то бишь, произошла ошибка). В RTL написано, что в случае ошибки подробности будут в SocketError, однако там ноль (в прямом смысле). Что это значит?
yser
новенький
Сообщения: 29
Зарегистрирован: 06.02.2008 10:27:40

Сообщение yser »

Коммунар писал(а):Теперь уже прикладной вопрос :)
Recv вернул -1 (то бишь, произошла ошибка). В RTL написано, что в случае ошибки подробности будут в SocketError, однако там ноль (в прямом смысле). Что это значит?

В своем проект по -1 определяю как потерю связи.
В свое время методом экспериментов получил что -1 появляется:
1. При закрытии сокета если в этот момент сокет ожидал данные.
В моем случае - в потоке recv ожидает данные, а в основной программе закрываю сокет (приэтом я знаю что я закрыл сокет и -1 не обрабатываю).
2. При попытке передать данные через сокет и в этот момент сокет ожидал данные и самое главное связь была потеряна (иногда связь пропадает так что сокет этого не замечает, обычно если соединение через NAT т.е. этом случае ни сервер ни клиент не определяют потерю связи.
В моем случае - в потоке recv ожидает данные, а программа пытается что-то передать через сокет (-1 использую как признак потери связи)
Вадим
новенький
Сообщения: 24
Зарегистрирован: 15.04.2007 12:12:26
Откуда: город-герой Волгоград

Сообщение Вадим »

Вот, как мне показалось, не плохие примеры использования сокетов - Internet Programming with Pascal
http://www.bastisoft.de/pascal/pasinet.html
Сам пока не использовал.
Аватара пользователя
Коммунар
новенький
Сообщения: 13
Зарегистрирован: 04.06.2008 23:23:36
Откуда: ССКР
Контактная информация:

Сообщение Коммунар »

yser
В моём случае ни первое, ни второе невозможно, поскольку я подключаюсь к локальному (localhost) FTP серверу и жду от него строчку в ~20 символов, которую помещаю в string[255].

Вадим
Спасибо большое! Приведённые примеры не проверял, но поставив Sock2Text вместо recv получил то, что хотел :)
Вадим
новенький
Сообщения: 24
Зарегистрирован: 15.04.2007 12:12:26
Откуда: город-герой Волгоград

Сообщение Вадим »

Я проверил примеры (ссылку на которые указал) - с небольшими изменениями работают.
А сам столкнулся с проблемой, когда после остановки TCP-сервера не могу вновь его запустить в течении некоторого времени - система отвечает ошибкой на команду Bind, говоря, что порт уже занят. Все дело оказалось в том, что если к серверу был подключен клиент и сервер остановили, то слушающий сокет переходит в состояние TIME_WAIT и находится в нем от 30 сек до 30 минут в зависимости от типа системы, то есть дефолтовых настроек.
Что бы избежать такой проблемы нужно после создания сокета установить опцию SO_REUSEADDR командой SetSocketOptions.

По поводу выявления ситуации потери связи - никак не обнаружишь пока не попытаешся передать данные.
Аватара пользователя
Verx0Laz
постоялец
Сообщения: 125
Зарегистрирован: 11.09.2007 11:24:07

Сообщение Verx0Laz »

Вадим писал(а):Вот, как мне показалось, не плохие примеры использования сокетов - Internet Programming with Pascal
http://www.bastisoft.de/pascal/pasinet.html
Сам пока не использовал.


Ссылка изменилась. Теперь правильно так:
http://www.bastisoft.de/programmierung/ ... sinet.html
Ответить