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

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

Аватара для morgan1991

Старожил


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

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


Додумался сам, вот что получилось:

Сервер:
Код: Выделить весь код
#include <GUIConstantsEx.au3>

Global $IPAdress = @IPAddress1, $port = 3391, $ConnectedSocket[50], $szIP_Accepted, $i, $msg, $all_user = 50

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

While 1
    For $i = 1 To $all_user - 1 Step + 1
        $msg = GUIGetMsg()
        If $msg = $GUI_EVENT_CLOSE Then Exit
        If $ConnectedSocket[$i] = -1 Then
            $ConnectedSocket[$i] = TCPAccept($MainSocket)
            If $ConnectedSocket[$i] <> -1 Then GUICtrlSetData($edit, GUICtrlRead($edit) & @CRLF & "ID = " & $i & " подключен")
        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 = " & SocketToIP($ConnectedSocket[$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
Клиент:
Код: Выделить весь код
#include <GUIConstantsEx.au3>

Opt('MustDeclareVars', 1)

Global $ConnectedSocket = -1, $szData
Global $szIPADDRESS = "10.10.14.153"
Global $nPORT = 3391

TCPStartup()

$ConnectedSocket = TCPConnect($szIPADDRESS, $nPORT)

If @error Then
    MsgBox(4112, "Error", "TCPConnect failed with WSA error: " & @error)
Else
    While 1
        $szData = InputBox("Data for Server", @LF & @LF & "Enter data to transmit to the SERVER:")
        If @error Or $szData = "" Then ExitLoop

        TCPSend($ConnectedSocket, $szData)
        If @error Then ExitLoop MsgBox(4112, "Error", "TCPConnect failed with WSA error: " & @error)
    WEnd
EndIf
Только вот эти функции для определения IP, не одна не работают:

Первая:
Код: Выделить весь код
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
Вторая:
Код: Выделить весь код
Func SOCKET2IP($SHOCKET)
Local $sockaddr = DLLStructCreate("short;ushort;uint;char[8]")

   $a = DLLCall("Ws2_32.dll","int","getpeername","int",$SHOCKET,"ptr",DLLStructGetPtr($sockaddr), _
                                            "int_ptr",DLLStructGetSize($sockaddr))
   If Not @error And $a[0] = 0 Then
      $a = DLLCall("Ws2_32.dll","str","inet_ntoa","int",DLLStructGetData($sockaddr,3))
      If Not @error Then $a = $a[0]
   Else
      $a = 0
   EndIf

    ; release Struct not really needed as it is a local
   $sockaddr = 0

   Return $a
EndFunc   ;==>SOCKET2IP
Помогите пожалуйста разобраться с этими функциями. Почему они не работают? Я в DLL 0.
И ещё всётаки как сделать двухстороннюю связь не открывая второго порта? Это вне моего понимания, приведу пример:
сервер голосового чата Ventrilo установлен на компьютере IP адрес которого виден из вне, а клиент коннектится к серверу с компьютера IP адрес которого виден только из локальной сети, дак каким же образом они обмениваются данными если сервер физически не сможет приконнектиться к клиенту т.к. его IP адрес не виден из вне? примерно тоже самое хочется сделать на Autoit.
Заранее спасибо!

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


Последний раз редактировалось morgan1991, 13-05-2009 в 17:02.

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

Отправлено: 16:48, 13-05-2009 | #29

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