Магазин имеет дисплей покупателя, подключенный к 192.168.1.68 в локальной сети. Он использует длительный опрос для получения отображаемых данных с использованием http POST.
Он отображает отправленные данные, но для возврата HttpSendRequest требуется 5 отправок. Я установил тайм-ауты на 60 мс и количество повторных попыток на 1, но все равно требуется 5 секунд, прежде чем HttpSendRequest компилируется.
Если тайм-аут имеет большее значение, HttpSendRequest ожидает большее время, как и ожидалось.
Почему HttpSendRequest не может ждать менее 5 секунд?
Как завершить вызов сразу после отправки данных, чтобы однопоточное приложение могло продолжить работу. Команда
curl -d "@duedata.json" -H "Content-Type: application/json; charset=utf-8" --max-time 2 -X POST http://192.168.1.92:8082/poll-command
занимает 2 секунды и показывает данные в PCU. Отправка данных на дисплей занимает 1,2 секунды.
FUNCTION HTTPGetEx
LPARAMETERS tcPage, tcBuffer, tnBufferSize, tcHeaders, tcFileName, lpost
DECLARE INTEGER HttpOpenRequest ;
IN WININET.DLL ;
INTEGER hHTTPHandle,;
STRING lpzReqMethod,;
STRING lpzPage,;
STRING lpzVersion,;
STRING lpzReferer,;
STRING lpzAcceptTypes,;
INTEGER dwFlags,;
INTEGER dwContextw
hHTTPResult=HttpOpenRequest(THIS.hhttpsession,;
Icase(VARTYPE(lpost)='C', lpost, lpost or tnPostSize > 0, "POST","GET"),;
tcPage,;
NULL,NULL,NULL,;
INTERNET_FLAG_RELOAD + ;
IIF(THIS.lsecurelink,INTERNET_FLAG_SECURE,0) + ;
this.nHTTPServiceFlags,0)
*** Apply timeout to the HTTP connection handle
THIS.wininetsettimeout(THIS.nConnectTimeOut,hHTTPResult)
THIS.wininetsettimeout(THIS.nConnectTimeOut)
THIS.hhttpsession=hHTTPResult
DECLARE INTEGER HttpSendRequest ;
IN WININET.DLL ;
INTEGER hHTTPHandle,;
STRING lpzHeaders,;
INTEGER cbHeaders,;
STRING lpzPost,;
INTEGER cbPost
dwTimeoutSecs = 60
llRetVal=InternetSetOption(hHTTPResult,;
INTERNET_OPTION_RECEIVE_TIMEOUT,;
@dwTimeoutSecs,4)
llRetVal=InternetSetOption(hHTTPResult,;
INTERNET_OPTION_SEND_TIMEOUT,;
@dwTimeoutSecs,4)
dwTimeoutSecs=1 &&// Retry only 1 time
llRetVal=InternetSetOption( hHTTPResult,;
INTERNET_OPTION_CONNECT_RETRIES,;
@dwTimeoutSecs,4)
? 'Before HttpSendRequest'
* Todo: why HttpSendRequest takes 5 seconds ?
lnRetval=HttpSendRequest(hHTTPResult,tcHeaders,LEN(tcHeaders),lcPostBuffer,tnPostSize)
? 'After HttpSendRequest'