Что нового

[Сеть, интернет] TCPRecv срабатывает через раз

merlin333

Новичок
Сообщения
6
Репутация
2
Приветствую всех!

ЧТО ДЕЛАТЬ:smile:?

имеем клиента WinXP, имеем сервер Windows 7 x86
суть в том что клиент скидывает логи серверу (отчет о проделанной работе)

проблема: клиент отсылает нормальные данные, сервер получает когда нормальные данные, когда пустую строку

Код клиента:
Код:
#cs ----------------------------------------------------------------------------

 AutoIt Version: 3.3.6.1
 Author:         Merlin333

 Script Function:
	Замена телефонной книги в eyeBeam и в Bria

#ce ----------------------------------------------------------------------------

$MainSocket = -1

Switch @OSVersion
Case "WIN_7"
	If FileExists (@ProgramFilesDir & "\CounterPath\Bria\bria.exe") Then
		$Res = FileCopy ("\\dc01\ClientApps\voip\contacts-resource-list.xml", @AppDataDir & "\CounterPath Solutions Inc\Bria\default_user\", 1)
		SendMsg ("Windows7, Bria, Address book refreshed")
		;ToolTip ("Windows7, Bria, Address book refreshed", 0, 0)
	Else
		SendMsg ("Windows7, не установлена Bria, адресная книга не обновлена.")
		;ToolTip ("Windows7, не установлена Bria, адресная книга не обновлена.", 0, 0)
	EndIf
Case "WIN_XP"
	If FileExists (@ProgramFilesDir & "\CounterPath\eyeBeam 1.5\eyeBeam.exe") Then
		$Res = FileCopy ("\\dc01\ClientApps\voip\contacts-resource-list.xml", @UserProfileDir & "\Local Settings\Application Data\CounterPath\RegNow Enhanced\default_user\", 1)
		SendMsg ("WindowsXP, EyeBeam, Address book refreshed")
		;ToolTip ("WindowsXP, EyeBeam, Address book refreshed", 0, 0)
	Else
		SendMsg ("WindowsXP, не установлена EyeBeam, обновление адресной книги не произведено.")
		;ToolTip ("WindowsXP, не установлена EyeBeam, обновление адресной книги не произведено.", 0, 0)
	EndIf
Case Else
	SendMsg ("Неподдерживаемая операционная система.")
	;ToolTip ("Неподдерживаемая операционная система.", 0, 0)
EndSwitch

Sleep (3000)

Func SendMsg (Const $SndMsg)
	TCPStartup ()
	$MainSocket = TCPConnect (TCPNameToIP ("fresh-7"), 30000)
	;MsgBox (0, "asd", $MainSocket)
	If $MainSocket <> -1 Then
		$MsgData = @MDAY & "." & @MON & "." & @YEAR & "_" & @HOUR & ":" & @MIN & "_" & @ComputerName & "_" & @IPAddress1 & "_" & @UserName  & "_______" & $SndMsg
		$SendRes = TCPSend ($MainSocket, $msgData)
		;MsgBox (0, "asd", $msgData)
		Sleep (1000)
	EndIf
	TCPShutdown ()
EndFunc

код сервера:
Код:
#cs ----------------------------------------------------------------------------

 AutoIt Version: 3.3.6.1
 Author:         myName

 Script Function:
	Template AutoIt script.

#ce ----------------------------------------------------------------------------

; Script Start - Add your code below here

#include <GuiEdit.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#Region ### START Koda GUI section ### Form=
$Form1 = GUICreate("Form1", 506, 163, 192, 124)
$edtLiveLog = GUICtrlCreateEdit("", 8, 8, 489, 145, BitOR($ES_AUTOVSCROLL,$ES_AUTOHSCROLL,$ES_WANTRETURN,$WS_BORDER))
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###

;;; инициализация переменных
$LogFileName = @YEAR & @MON & @MDAY & ".txt"
$LogFile = FileOpen ($LogFileName, 1)
Dim $ConnRes = -1

TCPStartup ()
$MainSocket = TCPListen (@ipaddress1, 30000)

While 1	
	$nMsg = GUIGetMsg()
	
	$ConnectedSocket = -1
	$ConnectedSocket = TCPAccept ($MainSocket)
	If $ConnectedSocket <> -1 Then
		_GUICtrlEdit_AppendText ($edtLiveLog, "Подключение" & @CRLF)
		$Data = TCPRecv ($ConnectedSocket, 2048)
		TCPCloseSocket ($ConnectedSocket)
		If $Data <> "" Then
			_GUICtrlEdit_AppendText ($edtLiveLog, $Data & @CRLF)
			FileWriteLine ($logfile, $Data)
			$ConnectedSocket = -1
		Else
			;MsgBox (64, "Fuck", "Error - " & @error)
			_GUICtrlEdit_AppendText ($edtLiveLog, "Ошибка: " & $Data & ", " & @error & @CRLF)
		EndIf
	ElseIf @error Then
		TCPCloseSocket ($ConnectedSocket)
	EndIf
	
	
	
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			TCPShutdown ()
			FileClose ($LogFile)
			Exit

	EndSwitch
WEnd

п.с. скрипт отрабатывает через GPO при старте - всегда с пустой пересылкой данных
 

Redline

AutoIT Гуру
Сообщения
506
Репутация
375
По-моему, вполне рабочие скрипты.
Сам сталкивался с проблемой, когда скрипт не мог записать данные в базу на Win7 - была проблема с параноидальной защитой этой оси, перенес скрипт из Program Files в несистемную папку и все нормализовалось.
Ну и выдержка из моего сервера:
Код:
$socket = TCPListen(@IPAddress1, 11111)
While 1
	$connectionSocket = TCPAccept($socket)
	If $connectionSocket <> -1 Then
		$sIn = TCPRecv($connectionSocket, 10240)
		If StringLen($sIn) <> 0 Then
			$now = @YEAR & '.' & @MON & '.' & @MDAY & ' ' & @HOUR & ':' & @MIN & ':' & @SEC
			_SQLite_Exec(-1, "INSERT INTO table VALUES ('" & $sIn & "','" & $now & "');")
		EndIf
		TCPCloseSocket($connectionSocket)
	EndIf
	Sleep(5)
WEnd
 
Автор
M

merlin333

Новичок
Сообщения
6
Репутация
2
Есть мысль зациклить отправку месседжа, до получения ответа от сервера об успешном получении.

Но, конечно, это костыль... пока так и буду реализовывать, если не подскажите альтернативу;)
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
  • Нужно проверять не $Data <> "", а именно @error.
  • Так же нужно проверять @error после TCPSend().
  • Увеличь Opt("TCPTimeout", 100).
  • Увеличь Sleep(1000).

По тому, что TCPRecv() возвращает пустую строку трудно что-либо сказать. Нужен код ошибки. Кроме того, поскольку клиент не должен постоянно висеть в памяти, то лучше было бы дожидаться ответа от сервера об успешном приеме данных, а затем уже выходить из программы, т.к. при преждевременном закрытии соединения, на сервере будет ошибка. Хотя, можно и увеличить Sleep(1000) до Sleep(3000).
 
Верх