Что нового

Помогите разобраться с созданием мини-веб сервера на AutoIt

kasper_sky

Antivirus
Сообщения
116
Репутация
1
Доброго времени суток.

Захотелось на днях дурью помаяться - написал мини-вебсервер на автоите.
Вот только незадача - работает он то через раз, то через два раза.
Видимо, проблема заключается в недостачи знаний о TCP и HTTP.
Поможете привести в рабочее состояние?

К серверу, как видите, нужно обращаться через браузер по IP 127.0.0.1

Код:
Код:
Global $ip = '127.0.0.1', $port = 80

GuiCreate('web server', 700, 500)
$edit = GUICtrlCreateEdit('', 0, 0, 700, 500)
GUISetState()

TCPStartup()

$socket = TCPListen($ip, $port)
If $socket = -1 Then Exit

$conn_socket = -1
GUICtrlSetData($edit, GUICtrlRead($edit) & '$socket = ' & $socket & @CRLF & @CRLF)

Do
	$conn_socket = TCPAccept($socket)
	If $conn_socket <> -1 Then
		Do
			$recv = TCPRecv($conn_socket, 10240)
			If $recv <> '' Then
				GUICtrlSetData($edit, GUICtrlRead($edit) & 'Received: <<' & $recv & '>>' & @CRLF)
				If _ProcessRequestedPage($recv) Then
					If FileRead(_ProcessRequestedPage($recv)) <> '' Then
						$read = FileRead(_ProcessRequestedPage($recv))
						$size = FileGetSize(_ProcessRequestedPage($recv))
						TCPSend($conn_socket, _HttpHead($size) & $read)
						GUICtrlSetData($edit, GUICtrlRead($edit) & 'Send: <<' & _HttpHead($size) & '>>' & @CRLF)
					Else
						TCPSend($conn_socket, 'HTTP/1.1 404')
					EndIf
				EndIf
				TCPCloseSocket($conn_socket)
				GUICtrlSetData($edit, GUICtrlRead($edit) & '$conn_socket = ' & $conn_socket & @CRLF)

				$conn_socket = -1
			EndIf
		Until $conn_socket = -1

		GUICtrlSetData($edit, GUICtrlRead($edit) & '$conn_socket = -1' & @CRLF & @CRLF)
	EndIf
Until False


Func _ProcessRequestedPage($data)
	$sre = StringRegExp($data, '(GET /)(.*?)( HTTP)', 1)
	If IsArray($sre) Then
		If $sre[1] = '' Then
			Return 'index.html'
		Else
			Return $sre[1] & '.html'
		EndIf
	Else
		Return 0
	EndIf
EndFunc


Func _HttpHead($s)
	Return 'HTTP/1.1 200 OK' & @CRLF & 'Server: AutoIt' & @CRLF & 'Content-Type: text/html' & _
	@CRLF & 'Connection: Close' & @CRLF & 'Content-Length: ' & $s & @CRLF & @CRLF
EndFunc
 
Автор
K

kasper_sky

Antivirus
Сообщения
116
Репутация
1
Неужели никто не обладает нужными знаниями о протоколе HTTP? :smile:


Добавлено:
Сообщение автоматически объединено:

Если кому-нибудь понадобится:

Кажется, проблема заключалась в неприменении элементарного
Код:
TCPShutdown()
, ведь даже в документации написано
There must be a TCPShutdown() call to avoid memory consomption.
и
A script must call one TCPShutdown() call for every successful TCPStartup() call.

Итог: перечитывайте внимательнее документацию, даже если полностью уверены в своих возможностях и памяти.
 
Верх