Я сделал сам двух стороннюю связь с неограниченным колличеством клиентов.
Но так и не понял как же всётаки работают все сервера игр, icq, и т.п. ?
В моём примере оба компьютера должны видеть IP адреса друг друга, если этого не происходит, то связь обрывается, т.к. двухсторонняя связь будет физически невозможна.
И ещё вопросик такой, функции которые я приводил в пример не работают, почемуто. Ответьте ктонибудь пожалуйста, а то сам с собой разговариваю... )
Клиент:
Код:
#include <GUIConstantsEx.au3>
#include <Misc.au3>
If _Singleton("connecter", 1) = 0 Then
MsgBox(0, "Ошибка!", "Запуск двух копий программы запрещён!")
Exit
EndIf
Global $ConnectedSocket = -1, $szData
Global $szIPADDRESS = "89.108.114.19"
Global $nPORT = 3391, $count_time = 0
TCPStartup()
$MainSocket = TCPListen(@IPAddress1, 3392)
If $MainSocket = -1 Then Exit MsgBox(16, "error", "$MainSocket = " & $MainSocket)
$ConnectedSocket = TCPConnect($szIPADDRESS, $nPORT)
If @error Then
MsgBox(4112, "Error", "TCPConnect failed with WSA error: " & @error)
Exit
Else
TCPSend($ConnectedSocket, @IPAddress1)
If @error Then Exit MsgBox(4112, "Error", "IP addres not sending WSA error: " & @error)
Do
$ConnectedSocket2 = TCPAccept($MainSocket)
$count_time += 1
Until $ConnectedSocket2 <> -1 Or $count_time = 100
If $count_time > 99 Then Exit MsgBox(4112, "Error", "Время ожидания ответа от сервера истекло!")
While 1
$szData = InputBox("Data for Server", @LF & @LF & "Enter data to transmit to the SERVER:")
If @error Or $szData = "" Then Exit
TCPSend($ConnectedSocket, $szData)
If @error Then Exit MsgBox(4112, "Error", "Error sending data WSA error: " & @error)
WEnd
EndIf
Сервер:
Код:
#include <GUIConstantsEx.au3>
Global $IPAdress = @IPAddress1, $port = 3391, $nPORT = 3392, $ConnectedSocket[50], $szIP_Accepted, $i, $msg, $all_user = 50
Global $szIPADDRESS[50], $ConnectedSocket2[50], $temp = 0
TCPStartup()
$MainSocket = TCPListen($IPAdress, $port)
If $MainSocket = -1 Then Exit MsgBox(16, "error", "$MainSocket = " & $MainSocket)
; Create a GUI for messages
;==============================================
$GOOEY = GUICreate("My Server (IP: " & $IPAdress & ")", 300, 200)
$edit = GUICtrlCreateEdit("Мой сервер версия 1.0.0.1", 10, 10, 280, 180)
GUICtrlSetState($edit, $GUI_DISABLE)
GUISetState()
For $i = 1 To $all_user - 1 Step + 1
$ConnectedSocket[$i] = -1
Next
$ii = 1
While 1
For $i = 1 To $ii Step + 1
$msg = GUIGetMsg()
If $msg = $GUI_EVENT_CLOSE Then Exit
If $ii < $all_user Or $ii = $all_user Then
If $ConnectedSocket[$i] = -1 Then
$ConnectedSocket[$i] = TCPAccept($MainSocket)
If $ConnectedSocket[$i] <> -1 Then
While $temp = 0
$recv = TCPRecv($ConnectedSocket[$i], 2048)
If @error Then
$szIPADDRESS[$i] = "error"
$temp = 1
EndIf
If $recv <> "" Then
$szIPADDRESS[$i] = $recv
$temp = 1
EndIf
WEnd
If $szIPADDRESS[$i] <> "error" Then
$ConnectedSocket2[$i] = TCPConnect($szIPADDRESS[$i], $nPORT)
If @error Then
TCPCloseSocket($ConnectedSocket[$i])
$ConnectedSocket2[$i] = -1
$ConnectedSocket[$i] = -1
GUICtrlSetData($edit, GUICtrlRead($edit) & @CRLF & "Связь с новым ID потеряна!")
Else
GUICtrlSetData($edit, GUICtrlRead($edit) & @CRLF & "ID = " & $i & " подключен")
$ii += 1
EndIf
EndIf
EndIf
EndIf
EndIf
$recv = TCPRecv($ConnectedSocket[$i], 2048)
If @error And $ConnectedSocket[$i] <> -1 Then
$ConnectedSocket[$i] = -1
GUICtrlSetData($edit, GUICtrlRead($edit) & @CRLF & "ID = " & $i & " отключен!")
EndIf
If $recv <> "" And Not @error Then GUICtrlSetData($edit, _
GUICtrlRead($edit) & @CRLF & "ID = " & $i & " IP = " & $szIPADDRESS[$i] & " > " & $recv)
Next
WEnd
Func SocketToIP($SHOCKET)
Local $sockaddr, $aRet
$sockaddr = DllStructCreate("short;ushort;uint;char[8]")
$aRet = DllCall("Ws2_32.dll", "int", "getpeername", "int", $SHOCKET, _
"ptr", DllStructGetPtr($sockaddr), "ptr", DllStructGetSize($sockaddr))
If Not @error And $aRet[0] = 0 Then
$aRet = DllCall("Ws2_32.dll", "str", "inet_ntoa", "int", DllStructGetData($sockaddr, 3))
If Not @error Then $aRet = $aRet[0]
Else
$aRet = 0
EndIf
$sockaddr = 0
Return $aRet
EndFunc ;==>SocketToIP