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
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.