Что нового

[Сеть, интернет] Проблема с закрытием сокетов

arfey

Новичок
Сообщения
25
Репутация
2
Прошу вашей помощи разобраться со следующими кодами.

Первый код - открывает сокет, принимает входящие подключения и читает входящие данные. А так же в случае разрыва на сокете, в идеале должно закрыть предыдущий TCPAccept и создать новый. На деле новый создается, а старый не закрывается. Для анализа использую утилиту Port Explorer.

Код:
$ip_server = @IPAddress1
$port = 65432

TCPStartup()

$MainSocket = TCPListen($ip_server, $port)
If $MainSocket = -1 Then
	ToolTip('Ошибка чиения сокета', 0, 0)
	TCPCloseSocket($MainSocket)
	$MainSocket = TCPListen($ip_server, $port, 100)
	Sleep(500)
EndIf

While 1
	$ConnectedSocket = TCPAccept($MainSocket)
	If $ConnectedSocket = -1 Then
		ToolTip('Ошибка входящего подключения' & @LF & $ConnectedSocket, 0, 0)
		TCPCloseSocket($ConnectedSocket)
		Sleep(500)
	EndIf
	Do
		$ConnectedSocket = TCPAccept($MainSocket)
	Until $ConnectedSocket <> -1



	While 1

		$recv = TCPRecv($ConnectedSocket, 48, 0)
		If $recv = '' Then
			ToolTip('Пусто :(' & @LF & $MainSocket & @LF & $ConnectedSocket & @LF & $recv, 0, 0)
			Sleep(500)
			ExitLoop
		ElseIf $recv <> '' Then
			ToolTip('Данные получены :)' & @LF & '$recv = ' & '>' & $recv & '<', 0, 0)
			Sleep(500)
		EndIf
		ToolTip('')
	WEnd
WEnd
TCPShutdown()



Второй код создает соединение на открытом сокете и передает информацию 02#ok. В случае обрыва, пересоздает подключение и продолжает дальше передавать информацию.

Код:
$ip_server = @IPAddress1
$port = 65432

;~ Запуск сетевой службы
TCPStartup()

$tcp = TCPConnect($ip_server, $port)

While 1
	If $tcp = -1 Then
		ToolTip('Ошибка соединения с сервером', 0, 80)
		Sleep(1500)
		TCPCloseSocket($tcp)	;В случае сбоя пересоздается подключение
		Sleep(500)
		$tcp = TCPConnect($ip_server, $port)
	Else
		$send = TCPSend($tcp, '02#ok')	;Отправка информации
		If $send = 0 Then
			ToolTip('Ошибка отправки информации на сервер', 0, 80)
			TCPCloseSocket($tcp)	;В случае сбоя пересоздается подключение
			Sleep(500)
			$tcp = TCPConnect($ip_server, $port)
		EndIf
		Sleep(500)
	EndIf
	ToolTip('')
WEnd

;~ Завершение работы сетевой службы
TCPShutdown()


Должно быть так. На 10 компьютерах запущен второй скрипт, а на 11-м первый скрипт, идет прием входящих данных. Если этот 11й будет работать круглосуточно, а остальные машины будут перезагружаться и прочие разрывы, то на 11м будет открыто огромное количество сокетов.

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

amel27

Продвинутый
Сообщения
146
Репутация
55
на базе твоего кода пример сервера без ограничения количества коннектов:

Код:
$ip_server = @IPAddress1
$port = 65432

TCPStartup()

$MainSocket = TCPListen($ip_server, $port)
If $MainSocket = -1 Then Exit MsgBox(16, "Ошибка", 'Ошибка создания сокета.')

Dim $aSockets[1]=[0]

While 1
    $ConnectedSocket = TCPAccept($MainSocket)
    If $ConnectedSocket <> -1 Then
		$aSockets[0]+=1
		ReDim $aSockets[$aSockets[0]+1]
		$aSockets[$aSockets[0]] = $ConnectedSocket
	EndIf

	For $i=1 To $aSockets[0]
		$recv = TCPRecv($aSockets[$i], 48, 0)
		If @error Then
			TCPCloseSocket($aSockets[$i])
			
			For $j=$i To $aSockets[0]-1
				$aSockets[$j]=$aSockets[$j+1]
			Next
			$aSockets[0]-=1
			ReDim $aSockets[$aSockets[0]+1]
		
			ContinueLoop 2
		EndIf
		
		If $recv = '' Then
			ToolTip('Пусто :(' & @LF & $MainSocket & @LF & $ConnectedSocket & @LF & $recv, 0, 0)
		ElseIf $recv <> '' Then
			ToolTip('Данные получены :)' & @LF & '$recv = ' & '>' & $recv & '<', 0, 0)
		EndIf
	Next
	
	Sleep(500)
	ToolTip('')
WEnd

TCPShutdown()
 
Верх