Что нового

Клиент сервер с подтверждением отправленных сообщений

joker2d

Новичок
Сообщения
182
Репутация
0
Задача чтобы после отправки клиентом сообщения, сервер слал обратно то же самое сообщение чтобы 100% удостовериться что он сообщение получил, если клиент обратно ничего не получит или получит не то сообщение то значит возникла какая то проблема и нужно выходить с ошибкой

Так же при отправке сообщения сначала шлеться размен сообщения, а потом само сообщение, чтобы отделить сообщения друг от друга

В итоге как я понимаю должен получиться идеальный клиент сервер, которому не страшны любые обрывы связи, клиент или 100% будет понимать что его сообщение дошло, либо будет выполнять какие то действия при ошибке

Написал все сам прошу оценить и может чего посоветовать

Клиент

Код:
TCPStartup()
$iSocket = TCPConnect("127.0.0.1", 65432)

$n = 1
$sData=1
While 1

	TCPsend_main($iSocket, $sData)
	Sleep(1000)
	$n = $n + 1
	$sData = "kk"&$n
	
WEnd

Func TCPsend_main($iSocket, $data)
	$size = BinaryLen($data)
	$data = StringToBinary($data, 4)
	$size = StringToBinary($size, 4)

	TCPSend_s_podtverzdeniem($iSocket, $size, 4)
	TCPSend_s_podtverzdeniem($iSocket, $data, $size)

EndFunc

Func TCPSend_s_podtverzdeniem($iSocket, $sData, $size)
	
	TCPSend($iSocket, $sData)
		
	While 1
		
		$data = TCPRecv($iSocket, $size, 1)
		$data = BinaryToString($data, 4)
		ConsoleWrite("Подтверждение=" & $data & @CRLF)
		If $data <> "" Then
			If $data = $sData Then
				ExitLoop
			EndIf
			
		EndIf
		Sleep(100)
	WEnd
	
EndFunc



Сервер

Код:
Local $hGUI = GUICreate("111", 310, 310)
$iEdit = GUICtrlCreateEdit("", 5, 5, 300, 300)
GUISetState(@SW_SHOW, $hGUI)

TCPStartup()

Local $iListenSocket = TCPListen("127.0.0.1", 65432, 100)

Do
	$iSocket = TCPAccept($iListenSocket)
	
Until $iSocket <> -1 ;if different from -1 a client is connected.




While 1
	TCPRecv_main($iSocket, $iEdit)
	Sleep(100)
WEnd

Func TCPRecv_main($iSocket, $iEdit)
	
	$size = TCPRecv_s_podtverzdeniem($iSocket, 4, $iEdit)
	

	If $size > 0 Then		
		$data = TCPRecv_s_podtverzdeniem($iSocket, $size, $iEdit)
		GUICtrlSetData($iEdit, GUICtrlRead($iEdit) & @CRLF & "Получено=" & $data)
		Return $data
	EndIf
	
EndFunc

Func TCPRecv_s_podtverzdeniem($iSocket, $size, $iEdit)
	
	While 1
		
		$data = TCPRecv($iSocket, $size, 1)
		$data = BinaryToString($data, 4)
		
		If $data <> "" Then
			TCPSend($iSocket, $data)
			ExitLoop
		EndIf
		
	WEnd
	
	Return $data
	
EndFunc
 
Верх