Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  

Название темы: [решено] Коннект
Показать сообщение отдельно

Аватара для morgan1991

Старожил


Сообщения: 398
Благодарности: 13

Профиль | Сайт | Отправить PM | Цитировать


Я сделал сам двух стороннюю связь с неограниченным колличеством клиентов.
Но так и не понял как же всётаки работают все сервера игр, 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

-------
Хочу научиться писать драйвера на с++


Последний раз редактировалось morgan1991, 14-05-2009 в 18:11.

Это сообщение посчитали полезным следующие участники:

Отправлено: 16:59, 14-05-2009 | #30

Название темы: [решено] Коннект