Добрый день!
Имеется 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
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
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
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
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.comPosted via RSDN NNTP Server 1.9