Форум » [x]Harbour » Медленное получения ответа сокета » Ответить

Медленное получения ответа сокета

SkyNET: Здравствуйте ! Нужно написать программу для получения информации с сервера. Сервер находится на моём компьютере, в hosts добавлена строчка 127.0.0.1 update.domen.debug Пользовался стандартной функцией из примера. Вот мой код: [quote] #define CRLF Chr(13)+Chr(10) PROCEDURE Main LOCAL cBuffer, cRequest, cResponse, nBytes, pSocket LOCAL nTime1 := SECONDS(), nTime2, nSeconds // send HTTP request to server cRequest := "GET /check HTTP/1.1" + CRLF + ; "Host: update.domen.debug" + CRLF + ; "User-Agent: HTTP-Test-Program" + CRLF + ; CRLF cResponse := SendPacket("update.domen.debug",cRequest,80) RETURN FUNCTION SendPacket(cURL,cRequest,nPort) LOCAL cBuffer, cResponse, nBytes, pSocket LOCAL nTime1, nTime2 // initialize sockets system and connect to server INetInit() pSocket := INetConnect( cUrl,nPort ) IF INetErrorCode( pSocket ) <> 0 ? "Socket error:", INetErrorDesc( pSocket ) INetCleanUp() QUIT ENDIF nBytes := INetSend( pSocket, cRequest ) cBuffer := Space(4096) cResponse:= "" nTime1 := SECONDS() // get HTTP response from server DO WHILE ( nBytes > 0 ) nBytes := INetRecv( pSocket, @cBuffer ) cResponse += Left( cBuffer, nBytes ) cBuffer := Space(4096) ENDDO // disconnect and cleanup memory ? SECONDS() - nTime1 INetClose( pSocket ) INetCleanUp() RETURN cResponse[/quote] Проблема состоит в том, что получение ответа сервера занимает целых пять с половиной секунд (5.5) ! Если я обращаюсь к этому сайту вручную, то это занимает 0.03 (30 мс) секунды. Вот медленный код: [quote] // get HTTP response from server DO WHILE ( nBytes > 0 ) nBytes := INetRecv( pSocket, @cBuffer ) cResponse += Left( cBuffer, nBytes ) cBuffer := Space(4096) ENDDO [/quote] В чём проблема ? Как его ускорить ?

Ответов - 2

gfilatov2002: SkyNET пишет: Как его ускорить ? Попробуй уменьшить таймаут для этого сокета InetSetTimeout( pSocket, 500 )

SkyNET: Спасибо большое ! Это хорошо работает, но проблема оказалось в другом. Просто http сервер ожидает получение остальных команд и удерживает соединение открытым. Добавление в cRequest заголовка "Connection: close" решило проблему.



полная версия страницы