Что нового

[TCP] Обмен данными между сервером и клиентами

firex

AutoIT Гуру
Сообщения
943
Репутация
208
Всем доброго времени суток :3
От нечего делать решил накидать чат. Есть два вида приложения - сервер и клиент(сервер может участвовать в разговоре).
Шапка:
Код:
Global $sSocket = -1, $sSocks[2][2] = [[0],[-1,-1]], $sRecv = ''


И вот возникла проблема.

При подключении клиента он записывается в массив допущенных сокетов:
Код:
$t = UBound($sSocks) - 1
$sSocks[$t][1] = TCPAccept($sSocket)
If $sSocks[$t][1] <> -1 Then
	$sSocks[0][0] += 1
	$sSocks[$t][0] = _SocketToIP($sSocks[$t][1])
	ReDim $sSocks[$t+2][2]
	_FxB_Server_Print('|SERVER|: ' & $sSocks[$t][0] & ' подключен!')
EndIf


Параллельно этому происходит следующий код:
Код:
For $i = 1 To $sSocks[0][0] Step 1
	$sRecv = TCPRecv($sSocks[$i][1], 2048)
	If @Error Then _
		_FxB_Server_RemoveClient($i)

	If $sRecv <> '' Then _
		_FxB_Server_Print('|' & $sSocks[$i][0] & '|: ' & $sRecv)
Next


Слушать клиента сервер не отказывается.
А вот слать данные клиенту - категорически отказывается, ссылаясь на ошибку
Код:
WSAENOTSOCK
10038	
Socket operation on nonsocket.

Сама функция отсылки:
Код:
Func _FxB_Server_Print($msg)
   Local $i
   
   _GUICtrlEdit_AppendText($hEdit[1], $msg & @CRLF)
   For $i = 1 To $sSocks[0][0] Step 1
	  TCPSend($sSocks[$i][0], $msg)
	  ;If @Error Then 
		 ;MsgBox(0,0,@Error)
		 ;_FxB_Server_RemoveClient($i)
	  ;EndIf
   Next
EndFunc


Как можно это решить?
Заранее спасибо.
 

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
Потому что правильно делать вот так
Код:
Func _FxB_Server_Print($msg)
   Local $i
   
   _GUICtrlEdit_AppendText($hEdit[1], $msg & @CRLF)
   For $i = 1 To $sSocks[0][0] Step 1
      TCPSend($sSocks[$i][1], $msg)      ; <=============  не [0], а [1]
      ;If @Error Then
         ;MsgBox(0,0,@Error)
         ;_FxB_Server_RemoveClient($i)
      ;EndIf
   Next
EndFunc
 
Верх