10048
От: xentry  
Дата: 24.06.05 08:32
Оценка:
Добрый день!
Имеется IP-камера со встроенным web-сервером, с которой необходимо
периодически получать
Jpeg через http. После получения запроса камера передает данные и сама
рвет соединение со своей стороны.
Клиент посылает http запросы несколько раз в минуту, т.е:
connect -> send -> recv -> closesocket.

Имеется такая проблема — клиент должен иметь возможность задавать порт, с
которого поступает запрос. Но через несколько секунд повторить запрос
невозможно, так как предыдущее соединение в состоянии TIME-WAIT. (номер
порта тот-же).

SO_REUSEADDR не поможет, так как сокет не прослушивающий.
с SO_LINGER игрался, тоже не помогает.
Как выкрутится ? Или это в принцепе не будет работать ?

PS. Ногами не пинайте — delphi.

procedure THTTPCam.Shot;
var
lSocket: TSocket;
lAddr, lLocal: TSockAddr;
lRequest: string;
lResponse: array[0..10 * 1024] of byte;
lCount: integer;
begin
lSocket := socket(AF_Inet, Sock_Stream, IPProto_TCP);
if lSocket = INVALID_SOCKET then
ThrowSocketError('Ошибка при создании сокета');
try

lAddr.sin_family := PF_Inet;
lAddr.sin_addr.S_addr := Inet_Addr(PChar(FIp));
lAddr.sin_port := HtoNS(80);
FillChar(lAddr.sin_zero, SizeOf(lAddr.sin_zero), 0);

lLocal.sin_family := PF_Inet;
lLocal.sin_addr.S_addr := InAddr_Any;
lLocal.sin_port := HtoNS(5758) //0;
FillChar(lLocal.sin_zero, SizeOf(lLocal.sin_zero), 0);

if bind(lSocket, lLocal, SizeOf(lLocal)) = Socket_Error then
ThrowSocketError('Ошибка вызова Bind');

if connect(lSocket, lAddr, SizeOf(TSockAddr)) = Socket_Error then << —
10048 при втором проходе.
ThrowSocketError('Ошибка вызова Connect');

lRequest := HttpRequestString;
if send(lSocket, PChar(lRequest)^, Length(lRequest), 0) = Socket_Error
then
ThrowSocketError('Ошибка вызова Send');

if shutdown(lSocket, SD_SEND) = Socket_Error then
ThrowSocketError('Ошибка вызова Shutdown');

lCount := recv(lSocket, lResponse, SizeOf(lResponse) — 1, 0);
if lCount <= 0 then
ThrowSocketError('Ошибка вызова Recv')
else
begin
// ......
// дочитываем ответ до получения 0
// ......
end;
finally
if closesocket(lSocket) = SOCKET_ERROR then
ThrowSocketError('Ошибка вызова closesocket');
end;
end;

--
Posted via RSDN NNTP Server 1.9
Re: 10048
От: Аноним  
Дата: 24.06.05 08:53
Оценка:
а попробуй не делать shutdown(lSocket, SD_SEND) после посылки а только
shutdown(lSocket, SD_BOTH) перед closesocket()
Re[2]: 10048
От: xentry  
Дата: 24.06.05 09:24
Оценка:
On Fri, 24 Jun 2005 12:53:24 +0400, wrote:

> а попробуй не делать shutdown(lSocket, SD_SEND) после посылки а только

> shutdown(lSocket, SD_BOTH) перед closesocket()

Спасибо, помогло.
Posted via RSDN NNTP Server 1.9
Re[3]: 10048
От: Аноним  
Дата: 27.06.05 06:49
Оценка:
Здравствуйте, xentry, Вы писали:

X>On Fri, 24 Jun 2005 12:53:24 +0400, wrote:


>> а попробуй не делать shutdown(lSocket, SD_SEND) после посылки а только

>> shutdown(lSocket, SD_BOTH) перед closesocket()

X>Спасибо, помогло.


Ага. И ваще, со слов товарисча Шнейдера в виндах с shutdown надо поосторожней,
лучше всего пользовать shutdown(hSocket, SD_BOTH) только...
Re[4]: 10048
От: xentry  
Дата: 28.06.05 07:52
Оценка:
On Mon, 27 Jun 2005 10:49:18 +0400, wrote:

> Ага. И ваще, со слов товарисча Шнейдера в виндах с shutdown надо

> поосторожней,
> лучше всего пользовать shutdown(hSocket, SD_BOTH) только...

Это про " в некоторых реализациях Winsock вызов closesocket работает
неправильно, если предварительно не было обращения к shutdown с how=2" в
совете 16 упомянутого товарисча ??
Posted via RSDN NNTP Server 1.9
Re[5]: 10048
От: Аноним  
Дата: 28.06.05 08:27
Оценка:
Здравствуйте, xentry, Вы писали:

X>On Mon, 27 Jun 2005 10:49:18 +0400, wrote:


>> Ага. И ваще, со слов товарисча Шнейдера в виндах с shutdown надо

>> поосторожней,
>> лучше всего пользовать shutdown(hSocket, SD_BOTH) только...

X>Это про " в некоторых реализациях Winsock вызов closesocket работает

X>неправильно, если предварительно не было обращения к shutdown с how=2" в
X>совете 16 упомянутого товарисча ??

да, и что-то там про семантику вызовов с how=0 и how=1 в противоположность .NIX,
в общем я сильно не заморачивался никогда а всегда делал только shutdown(socket, 2)
перед самым closesocket(), и вобщем-то проблем с этим не знал.
Re: 10048
От: Аноним  
Дата: 28.06.05 11:31
Оценка:
Здравствуйте, xentry, Вы писали:

X>Добрый день!

X>Имеется IP-камера со встроенным web-сервером, с которой необходимо
Сори маленько не по теме, а что за камера?
Re[2]: 10048
От: xentry  
Дата: 29.06.05 08:24
Оценка:
On Tue, 28 Jun 2005 15:31:21 +0400, wrote:

> X>Добрый день!

> X>Имеется IP-камера со встроенным web-сервером, с которой необходимо
> Сори маленько не по теме, а что за камера?

Это тест для проверки MJPEG камер. Камеры две:
Aviosys IP v9000 / v9000A Plus
DLINK DCS-900
Posted via RSDN NNTP Server 1.9
Re[3]: 10048
От: Аноним  
Дата: 29.06.05 09:32
Оценка:
Здравствуйте, xentry, Вы писали:

X>On Tue, 28 Jun 2005 15:31:21 +0400, wrote:


>> X>Добрый день!

>> X>Имеется IP-камера со встроенным web-сервером, с которой необходимо
>> Сори маленько не по теме, а что за камера?

X>Это тест для проверки MJPEG камер. Камеры две:

X>Aviosys IP v9000 / v9000A Plus
X>DLINK DCS-900
dlink знаю, а Aviosys что за аппарат? есть какая нить ссылка на него. и вообще как впечатления от работы с ней?
Re[4]: 10048
От: xentry  
Дата: 29.06.05 11:00
Оценка:
On Wed, 29 Jun 2005 13:32:17 +0400, wrote:

> dlink знаю, а Aviosys что за аппарат? есть какая нить ссылка на него. и

> вообще как впечатления от работы с ней?
Сугубо положительные. Для ориентировки захват кадра сейчас занимает на
DLINK-900 ~ 1560 msec,
c Aviosys ~ 78 msec. Пинг в 4 раза быстрее.
http://www.aviosys.ru
http://www.landos.ru/computers/surv/ipcam9000.htm
http://www.aviosys.com
Posted via RSDN NNTP Server 1.9
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.