5903 würde ich vorschlagen.
Vielleicht hilft dir das hier weiter (das gute alte TicTacTo):
Server
Client
Vielleicht hilft dir das hier weiter (das gute alte TicTacTo):
Server
Code:
#include <GUIConstants.au3>
#include <ARRAY.AU3>
#include <GUIEdit.au3>
#include <Date.au3>
Global Const $Port = 5903
Global $MaxConc = 3
Global Const $MaxLength = 512
Global $ConnectedSocket[$MaxConc]
Global $CurrentSocket = 0
Global $Connection = 0
Local $Track = 0
Global Const $MaxConnection = ($MaxConc - 1)
For $Track = 0 To $MaxConnection Step 1
$ConnectedSocket[$Track] = -1
Next
$Form1 = GUICreate("Tic Tac Toe (Server)", 602, 439, 193, 115)
$Edit = GUICtrlCreateEdit("", 8, 8, 585, 393, BitOR($ES_READONLY, $ES_WANTRETURN, $WS_VSCROLL, $WS_HSCROLL, $ES_AUTOVSCROLL, $ES_AUTOHSCROLL))
$Input1 = GUICtrlCreateInput("", 8, 408, 505, 21)
$Button1 = GUICtrlCreateButton("Send All", 520, 408, 75, 23, 0)
GUISetState(@SW_SHOW)
Global $MainSocket = TCPStartServer($Port, $MaxConc)
If @error <> 0 Then
Console("Server unable to initialize.", "")
Else
Console("Server initialized.", "")
EndIf
While 1
$msg = GUIGetMsg()
Switch $msg
Case $Button1
$Input = GUICtrlRead($Input1)
TCPSendMessageAll(1, $Input)
GUICtrlSetData($Input1, "")
Case $GUI_EVENT_CLOSE
Exit
EndSwitch
$ConnectedSocket[$CurrentSocket] = TCPAccept($MainSocket)
If $ConnectedSocket[$CurrentSocket] <> -1 Then
$CurrentSocket = SocketSearch()
EndIf
If $Connection = 2 Then
TCPSendMessageAll(1, "!Ready")
Sleep(500)
$Player1 = Random(1, 2, 1)
If $Player1 = 1 Then
$Player1 = "!Player-1"
$Player2 = "!Player-2"
ElseIf $Player1 = 2 Then
$Player1 = "!Player-2"
$Player2 = "!Player-1"
EndIf
TCPSend($ConnectedSocket[0], $Player1)
Console($Player1 & " send " & $ConnectedSocket[0], $ConnectedSocket[0])
TCPSend($ConnectedSocket[1], $Player2)
Console($Player2 & " send " & $ConnectedSocket[1], $ConnectedSocket[1])
$Connection = 3
EndIf
$Track = 0
For $Track = 0 To $MaxConnection Step 1
If $ConnectedSocket[$Track] <> -1 Then
$Data = TCPRecv($ConnectedSocket[$Track], $MaxLength)
If $Data = "!Bye" Then
TCPCloseSocket($ConnectedSocket[$Track])
Console($ConnectedSocket[$Track] & " disconnected.", $ConnectedSocket[$Track])
$ConnectedSocket[$Track] = -1
$CurrentSocket = SocketSearch()
ElseIf $Data = "!Connected" Then
TCPSend($ConnectedSocket[$Track], "!Connected")
Console($ConnectedSocket[$Track] & " connected.", $ConnectedSocket[$Track])
$Connection = $Connection + 1
ElseIf $Data <> "" Then
TCPSendMessageAll(1, $Data)
EndIf
EndIf
Next
WEnd
Func Console($Dataa, $Con)
$Editt = GUICtrlRead($Edit)
If $Editt = "" Then
GUICtrlSetData($Edit, _NowTime(5) & " - " & GetIP($Con) & " - " & $Dataa)
Else
GUICtrlSetData($Edit, $Editt & @CRLF & _NowTime(5) & " - " & GetIP($Con) & " - " & $Dataa)
EndIf
_GUICtrlEdit_LineScroll($Edit, 0, _GUICtrlEdit_GetLineCount($Edit))
EndFunc ;==>Console
Func TCPSendMessageAll($ConnectionLimit, $Data)
Local $Track = 0
For $Track = 0 To $ConnectionLimit
TCPSend($ConnectedSocket[$Track], $Data)
If StringInStr($Data, "!Button") Then
$Data2 = StringSplit($Data, "-")
Console($Data & " ( Player : " & $Data2[2] & " Row : " & $Data2[3] & " Column : " & $Data2[4] & " ) send " & $ConnectedSocket[$Track], $ConnectedSocket[$Track])
ElseIf $Data <> "" Then
Console($Data & " send " & $ConnectedSocket[$Track], $ConnectedSocket[$Track])
EndIf
Next
EndFunc ;==>TCPSendMessageAll
Func TCPStartServer($Port, $MaxConnect = 1)
Local $Socket
$Socket = TCPStartup()
Select
Case $Socket = 0
SetError(@error)
Return -1
EndSelect
$Socket = TCPListen(@IPAddress1, $Port, $MaxConnect)
Select
Case $Socket = -1
SetError(@error)
Return 0
EndSelect
SetError(0)
Return $Socket
EndFunc ;==>TCPStartServer
Func SocketSearch()
Local $Track = 0
For $Track = 0 To $MaxConnection Step 1
If $ConnectedSocket[$Track] = -1 Then
Return $Track
Else
;
EndIf
Next
EndFunc ;==>SocketSearch
Func GetIP($Socket)
Local $SocketAddress
$SocketAddress = DllStructCreate("short;ushort;uint;char[8]")
$IP = DllCall("Ws2_32.dll", "int", "getpeername", "int", $Socket, "ptr", DllStructGetPtr($SocketAddress), "int*", DllStructGetSize($SocketAddress))
If Not @error And $IP[0] = 0 Then
$IP = DllCall("Ws2_32.dll", "str", "inet_ntoa", "int", DllStructGetData($SocketAddress, 3))
If Not @error Then $IP = $IP[0]
Else
$IP = @IPAddress1
EndIf
$SocketAddress = 0
Return $IP
EndFunc ;==>SocketToIp
Func OnAutoItExit()
TCPSendMessageAll(1, "!Bye")
Sleep(1000)
TCPShutdown()
EndFunc ;==>OnAutoItExit
Code:
#include <GUIConstants.au3>
#include <ARRAY.AU3>
Global $MainSocket, $Server, $Port, $Nick, $Nick2, $Turn, $Shape, $Shape2, $Winner, $Moves, $Player, $Me, $Opponent
Global $Point1 = 0
Global $Point2 = 0
Global $Games = 0
Global $Box[4][4]
Global $Button[4][4]
Global $Checkwin[9]
Global $Connected = 0
Local $MaxLength = 512
$Form1 = GUICreate("Tic Tac Toe", 217, 359, 193, 115)
$Group1 = GUICtrlCreateGroup("Login", 16, 224, 185, 121)
$Input1 = GUICtrlCreateInput(@IPAddress1, 72, 244, 105, 21)
$Input2 = GUICtrlCreateInput(5903, 72, 276, 105, 21)
$Label2 = GUICtrlCreateLabel("IP :", 32, 252, 20, 17)
$Label3 = GUICtrlCreateLabel("Port :", 32, 284, 29, 17)
$Connect = GUICtrlCreateButton("Connect !", 32, 308, 147, 25, 0)
GUICtrlCreateGroup("", -99, -99, 1, 1)
$Button[1][1] = GUICtrlCreateButton("", 36, 17, 49, 49, 0)
GUICtrlSetFont(-1, 24, 800, 0, "MS Sans Serif")
$Button[1][2] = GUICtrlCreateButton("", 84, 17, 49, 49, 0)
GUICtrlSetFont(-1, 24, 800, 0, "MS Sans Serif")
$Button[1][3] = GUICtrlCreateButton("", 132, 17, 49, 49, 0)
GUICtrlSetFont(-1, 24, 800, 0, "MS Sans Serif")
$Button[2][1] = GUICtrlCreateButton("", 36, 65, 49, 49, 0)
GUICtrlSetFont(-1, 24, 800, 0, "MS Sans Serif")
$Button[2][2] = GUICtrlCreateButton("", 84, 65, 49, 49, 0)
GUICtrlSetFont(-1, 24, 800, 0, "MS Sans Serif")
$Button[2][3] = GUICtrlCreateButton("", 132, 65, 49, 49, 0)
GUICtrlSetFont(-1, 24, 800, 0, "MS Sans Serif")
$Button[3][1] = GUICtrlCreateButton("", 36, 113, 49, 49, 0)
GUICtrlSetFont(-1, 24, 800, 0, "MS Sans Serif")
$Button[3][2] = GUICtrlCreateButton("", 84, 113, 49, 49, 0)
GUICtrlSetFont(-1, 24, 800, 0, "MS Sans Serif")
$Button[3][3] = GUICtrlCreateButton("", 132, 113, 49, 49, 0)
GUICtrlSetFont(-1, 24, 800, 0, "MS Sans Serif")
$Label4 = GUICtrlCreateLabel("Status :", 24, 176, 192, 17)
$Label5 = GUICtrlCreateLabel("Games : 0 You : 0 Opponent : 0", 24, 200, 192, 17)
GUISetState()
For $i = 1 To 3
For $j = 1 To 3
$Box[$i][$j] = 0
Next
Next
While 1
Checktcp()
$msg = GUIGetMsg()
Switch $msg
Case $Connect
TCPStartup()
Check()
$MainSocket = TCPConnect($Server, $Port)
If $MainSocket = -1 Then
GUICtrlSetData($Label4, "Status : Unable to connect.")
Else
GUICtrlSetData($Label4, "Status : Connecting...")
TCPSend($MainSocket, "!Connected")
EndIf
Case $Button[1][1]
Checkbutton(1, 1)
Case $Button[1][2]
Checkbutton(1, 2)
Case $Button[1][3]
Checkbutton(1, 3)
Case $Button[2][1]
Checkbutton(2, 1)
Case $Button[2][2]
Checkbutton(2, 2)
Case $Button[2][3]
Checkbutton(2, 3)
Case $Button[3][1]
Checkbutton(3, 1)
Case $Button[3][2]
Checkbutton(3, 2)
Case $Button[3][3]
Checkbutton(3, 3)
Case $GUI_EVENT_CLOSE
Exit
EndSwitch
WEnd
Func Checkbutton($row, $column)
TCPSend($MainSocket, "!Button-" & $Player & "-" & $row & "-" & $column)
EndFunc ;==>Checkbutton
Func Click($Player, $row, $column)
If $Player = $Me Then
If $Box[$row][$column] = 0 And $Turn = True Then
GUICtrlSetData($Button[$row][$column], $Shape)
GUICtrlSetState($Button[$row][$column], $GUI_DISABLE)
$Box[$row][$column] = 5
Checkwin()
Checkturn()
EndIf
ElseIf $Player = $Opponent Then
If $Box[$row][$column] = 0 And $Turn = False Then
GUICtrlSetData($Button[$row][$column], $Shape2)
GUICtrlSetState($Button[$row][$column], $GUI_DISABLE)
$Box[$row][$column] = 1
Checkwin()
Checkturn()
EndIf
EndIf
EndFunc ;==>Click
Func Check()
$Server = GUICtrlRead($Input1)
$Port = GUICtrlRead($Input2)
EndFunc ;==>Check
Func Checktcp()
$Data = TCPRecv($MainSocket, $MaxLength)
If StringInStr($Data, "!Player") Then
If $Connected = 2 Then
$Data = StringSplit($Data, "-")
$Player = $Data[2]
$Me = $Player
If $Me = 1 Then
$Opponent = 2
$Shape = "X"
$Shape2 = "O"
$Turn = True
Else
$Opponent = 1
$Shape = "O"
$Shape2 = "X"
$Turn = False
EndIf
Checkturn2()
$Connected = 3
EndIf
ElseIf $Data = "!Ready" Then
If $Connected = 1 Then
GUICtrlSetData($Label4, "Status : Your Opponent ready.")
$Connected = 2
EndIf
ElseIf $Data = "!Bye" Then
MsgBox(16, "Session Ended", "Connection Terminated.")
Exit
ElseIf $Data = "!Connected" Then
If $Connected = 0 Then
GUICtrlSetState($Connect, $GUI_DISABLE)
GUICtrlSetData($Label4, "Status : Waiting for Opponent.")
$Connected = 1
EndIf
ElseIf StringInStr($Data, "!Button") Then
$Data = StringSplit($Data, "-")
Click($Data[2], $Data[3], $Data[4])
ElseIf $Data <> "" Then
MsgBox("", "", $Data)
EndIf
EndFunc ;==>Checktcp
Func Checkwin()
For $j = 1 To 8
$Checkwin[$j] = 0
Next
For $j = 1 To 3
$Checkwin[1] += $Box[1][$j]
$Checkwin[2] += $Box[2][$j]
$Checkwin[3] += $Box[3][$j]
$Checkwin[4] += $Box[$j][1]
$Checkwin[5] += $Box[$j][2]
$Checkwin[6] += $Box[$j][3]
Next
$Checkwin[7] = $Box[1][1] + $Box[2][2] + $Box[3][3]
$Checkwin[8] = $Box[1][3] + $Box[2][2] + $Box[3][1]
For $i = 1 To 8
If $Checkwin[$i] = 15 Then
$Winner = 1
$Point1 += 1
GUICtrlSetData($Label4, "Status : Winner You !")
ElseIf $Checkwin[$i] = 3 Then
$Winner = 1
$Point2 += 1
GUICtrlSetData($Label4, "Status : Winner Opponent !")
EndIf
Next
EndFunc ;==>Checkwin
Func Reset()
$Games += 1
GUICtrlSetData($Label5, "Games : " & $Games & " You : " & $Point1 & " Opponent : " & $Point2)
Sleep(2000)
For $i = 1 To 3
For $j = 1 To 3
$Box[$i][$j] = 0
GUICtrlSetData($Button[$i][$j], "")
GUICtrlSetState($Button[$i][$j], $GUI_ENABLE)
Next
Next
If $Shape = "X" Then
$Shape = "O"
$Shape2 = "X"
$Turn = False
Else
$Shape = "X"
$Shape2 = "O"
$Turn = True
EndIf
$Winner = 0
$Moves = 0
Checkturn2()
EndFunc ;==>Reset
Func Checkturn()
If $Winner <> 1 Then
$Moves += 1
If $Moves = 9 Then
GUICtrlSetData($Label4, "Status : Draw...")
Reset()
Else
If $Turn = True Then
$Turn = False
GUICtrlSetData($Label4, "Status : Opponent Turn! ( " & $Shape2 & " )")
Else
$Turn = True
GUICtrlSetData($Label4, "Status : Your Turn! ( " & $Shape & " )")
EndIf
EndIf
Else
Reset()
EndIf
EndFunc ;==>Checkturn
Func Checkturn2()
If $Turn = True Then
GUICtrlSetData($Label4, "Status : Your Turn! ( " & $Shape & " )")
Else
GUICtrlSetData($Label4, "Status : Opponent Turn! ( " & $Shape2 & " )")
EndIf
EndFunc ;==>Checkturn2
Func OnAutoItExit()
If $MainSocket <> -1 Then
TCPSend($MainSocket, "!Bye")
TCPCloseSocket($MainSocket)
EndIf
TCPShutdown()
EndFunc ;==>OnAutoItExit