Что нового

[Сеть, интернет] Работа с UDP, проблема с портами...

HukpoFuJl

AццkuЙ HukpoFuJl
Сообщения
97
Репутация
38
Пытаюсь писать бота для чата CommFort. Бот работает по средствам обмена UDP сообщениями с клиентом чата.
В общем смысл такой:
В настройках чата прописывается !Р и порт на который клиент чата будет отсылать сообщения боту.
Открываю этот порт при помощи UDPBind в своём боте...
Проверяю - бот отлично принимает сообщения, всё пучком...
Далее надо отправить сообщение в ответ. Тут и возникает проблема, т.к. Клиент чата воспринимает сообщения отправленные только с того порта и !Р, который прописан для приёма ботом, и разумеется открыт UDPBind'ом... А при попытке отослать пакет просто через UDPSend - ничего не происходит => Бот для отправки сам открывает произвольный порт, что в моём случае не допустимо...
Ах да, это только одна из проблем... Вторая(уже почти решённая) - Клиент чата при каждом новом подключении меняет порт, поэтому мой бот должен определить с какого порта пришёл первый пакет и далее отправлять данные на этот порт...

Есть идеи? Заранее благодарен...


Добавлено:
Сообщение автоматически объединено:

Ну вот к примеру простенький скрипт, писал для тестов UDP:

Код:
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <EditConstants.au3>

UDPStartup()
$UDPBind = UDPBind("127.0.0.1", 16772)    ; Порт С КОТОРОГО нужно отправлять данные
$socket = UDPOpen("127.0.0.1", 37045)    ; Порт НА КОТОРЫЙ нужно отправлять данные
If @error <> 0 Then Exit

GUICreate ("send",300,200)                       ; Создаю ГУЙ со строкой ввода посылаемых данных и кнопкой "Send"
$but = GUICtrlCreateButton("Send",10,10)
$edit = GUICtrlCreateEdit("0х64000000000000000000000001000000030000002B2B2B",10,40,270,150)
GUISetState()


While 1
$msg = GUIGetMsg()
	Select
	Case $msg = $but                          ; Нажатие на Send
		$data = GUICtrlRead ($edit)     ; Считывание данных из поля $edit
		UDPSend($socket, $data)        ; Отправка UDP пакета на порт $socket
	Case $msg = $GUI_EVENT_CLOSE
        GuiDelete()
		ExitLoop
		Exit
	EndSelect
WEnd

Func OnAutoItExit()
    UDPCloseSocket($socket)
    UDPShutdown()
EndFunc


Ну и в общем ничего не выходит...
Жду предложений...
 

Garrett

Модератор
Локальный модератор
Сообщения
3 999
Репутация
964
Мне кажется, что порт на отправку и на приём должен быть один и тот же.
Попробуйте так:
Код:
#include <Constants.au3>
$IP	= "127.0.0.1"
$Port = "16772" ; или 37045
UDPStartup()

OnAutoItExitRegister("Cleanup")

$Socket = UDPOpen($IP, $Port)
If @error <> 0 Then Exit
    $Status = UDPSend($Socket, "0х64000000000000000000000001000000030000002B2B2B")
    $Data = UDPRecv($Socket, 1024)
    If $Data <> "" Then
		ConsoleWrite($Data)
	Else
		ConsoleWrite("Сервер не найден!")
    EndIf

Func Cleanup()
    UDPCloseSocket($socket)
    UDPShutdown()
EndFunc
 
Автор
HukpoFuJl

HukpoFuJl

AццkuЙ HukpoFuJl
Сообщения
97
Репутация
38
В том-то и дело, что нужно именно отправить этот пакет С порта 16772 НА порт 37045... Вся проблема состоит в том, что при отправке пакета UDPSend'ом отправляется пакет На нужный порт, но С произвольного... А нужно именно С 16772...
 

Garrett

Модератор
Локальный модератор
Сообщения
3 999
Репутация
964
Я вас правильно понял?
Код:
CLIENT --->127.0.0.1:37045--->BOT_SERVER
CLIENT <---127.0.0.1:16772<---BOT_SERVER
 
Автор
HukpoFuJl

HukpoFuJl

AццkuЙ HukpoFuJl
Сообщения
97
Репутация
38
Что-то типо того... Правильнее будет так выглядеть:

Код:
CLIENT(127.0.0.1:37045) ---> BOT_SERVER(127.0.0.1:16772)
CLIENT(127.0.0.1:37045) <--- BOT_SERVER(127.0.0.1:16772)
передача с порта на порт, ни как иначе...

UPD:
Что, ниужели никаких идей нету?
 

Garrett

Модератор
Локальный модератор
Сообщения
3 999
Репутация
964
HukpoFuJl [?]
Что, ниужели никаких идей нету?
Да идей и не должно быть. Должны быть факты. Так, как всё уже давно изобрели.
В общем, скажу следующее. Смоделировал ситуацию (на чистом Autoit) клиент сервер, на протоколе UPD
Передача на сервер идёт по одному порту, а ответ принимается по другому. Все работает нормально. Но в Комфорте как я понял после прочтения мануала, и полистав форум, немного по-другому сие дело устроено. Так вот, пока вникаю, чтобы понять и попытается вам помочь! "Я не волшебник, я только учусь…" :smile:
На данный момент я подозреваю, что недостаточно одного UPD протокола. :scratch:
Пытаюсь разобраться.
 
Автор
HukpoFuJl

HukpoFuJl

AццkuЙ HukpoFuJl
Сообщения
97
Репутация
38
UDP протокола более чем достаточно... Смотрите, запускаю программу, исходник которой написан мною в первом посте. Отправляю первый пакет Коммфорту, который Коммфорт разумеется игнорирует... Смотрю файерволом С КАКОГО порта был отправлен пакет... Выключаю коммфорт, настраиваю его на этот порт (т.е. приём с него и отправку на него), запускаю коммфорт и повтаряю отправку пакета - вуоля, пакет принят... Перезапускаю бота, отправляю пакет ещёраз и замечаю, что порт (отправки от бота) меняется... При чём последовательно, но опционально этот порт совсем не управляется... В результате пакет игнорируется... Задача неимоверно проста, в функции указывается UDPSend(Сокет,данные), где "сокет" - это !Р и Порт ПРИНИМАЮЩЕЙ программы... При этом пакет выходит хер знает откуда... А Мне надо жёстко указать порт с которого будет отправлятся пакет, т.к. иначе коммфорт его проигнорирует...
 
Автор
HukpoFuJl

HukpoFuJl

AццkuЙ HukpoFuJl
Сообщения
97
Репутация
38
И так, тема упала на далёкие страницы... Поднимаю, ибо вопрос так и небыл решён...
Мне тут подсазывали как-то, что в данном вопросе стандартными AutoIT'шными функциями не обойтись и надо это всё как-то организовывать через WINSock или как его там... В общем как я понял - это ObjectCreate бла-бла-бла... Проблема в том, что я этим не разу не пользовался и из стандартного мануала слабо понимаю как это реализовывается... Может кто-нить для примера напишет пару строк кода подобной реализации при работе с UDP пакетами!?
Зарание благодарен...
 

Garrett

Модератор
Локальный модератор
Сообщения
3 999
Репутация
964
Ну, в общем, я поковырял немного, и честно говоря, как-то забросил. Потому как долгий это процесс.
Однако скажу следующие, вам нужно пообщаться на форуме Комфорта, и почитать их мануалы. Нужно чётко понять какой формат данных, они используют.

По большому счёту всё работает на ура. Я полагаю, у вас стоит сам клиент Комфорта? Так вот привожу вам пример TCP сервера из справки по AutoIt. Так же два пакета для теста. Но учтите, что пакеты только для проверки, и они серверные. А так как клиент и сервер постоянно общаются, то после передачи серверного пакета клиенту, сервер должен получить ответ, и если он его не получит и не ответит что всё "Ок", то клиент выдаст ошибку.
Ну а дальше, я думаю, вам нужно будет самому разбираться, потому как тема обширная и с наскока её не взять.

Server для теста:

Код:
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <ButtonConstants.au3>

Opt('MustDeclareVars', 1)

Global $ConnectedSocket = -1

Global $MainSocket

Example()

Func Example()
    OnAutoItExitRegister("Cleanup")

    Local $g_IP, $RogueSocket, $GOOEY, $edit, $input, $butt, $msg
    Local $ret, $recv

    $g_IP = "127.0.0.1"

    ; Start The TCP Services
    ;==============================================
    TCPStartup()

    ; Create a Listening "SOCKET"
    ;==============================================
    $MainSocket = TCPListen($g_IP, 3128)
    If $MainSocket = -1 Then Exit
    $RogueSocket = -1

    ; Create a GUI for chatting
    ;==============================================
    $GOOEY = GUICreate("my server", 300, 200, 10, 10)
    $edit = GUICtrlCreateEdit("", 10, 40, 280, 150, BitOR($ES_AUTOVSCROLL,$ES_READONLY,$ES_WANTRETURN,$WS_VSCROLL))
    $input = GUICtrlCreateInput("", 10, 10, 200, 20)
    $butt = GUICtrlCreateButton("Send", 210, 10, 80, 20, $BS_DEFPUSHBUTTON)
    GUISetState()


    ; GUI Message Loop
    ;==============================================
    While 1
        $msg = GUIGetMsg()

        ; GUI Closed
        ;--------------------
        If $msg = $GUI_EVENT_CLOSE Then ExitLoop

        ; User Pressed SEND
        ;--------------------
        If $msg = $butt Then
            If $ConnectedSocket > -1 Then
                $ret = TCPSend($ConnectedSocket, GUICtrlRead($input))
                If @error Or $ret < 0 Then
                    ; ERROR OCCURRED, CLOSE SOCKET AND RESET ConnectedSocket to -1
                    ;----------------------------------------------------------------
                    TCPCloseSocket($ConnectedSocket)
                    WinSetTitle($GOOEY, "", "my server - Client Disconnected")
                    $ConnectedSocket = -1
                ElseIf $ret > 0 Then
                    ; UPDATE EDIT CONTROL WITH DATA WE SENT
                    ;----------------------------------------------------------------
                    GUICtrlSetData($edit, GUICtrlRead($edit) & GUICtrlRead($input) & @CRLF)
                EndIf
            EndIf
            GUICtrlSetData($input, "")
        EndIf

        If $RogueSocket > 0 Then
            $recv = TCPRecv($RogueSocket, 512)
            If Not @error Then
                TCPCloseSocket($RogueSocket)
                $RogueSocket = -1
            EndIf
        EndIf

        ; If no connection look for one
        ;--------------------
        If $ConnectedSocket = -1 Then
            $ConnectedSocket = TCPAccept($MainSocket)
            If $ConnectedSocket < 0 Then
                $ConnectedSocket = -1
            Else
                WinSetTitle($GOOEY, "", "my server - Client Connected")
            EndIf

            ; If connected try to read some data
            ;--------------------
        Else
            ; EXECUTE AN UNCONDITIONAL ACCEPT IN CASE ANOTHER CLIENT TRIES TO CONNECT
            ;----------------------------------------------------------------
            $RogueSocket = TCPAccept($MainSocket)
            If $RogueSocket > 0 Then
                TCPSend($RogueSocket, "~~rejected")
            EndIf

            $recv = TCPRecv($ConnectedSocket, 512)

            If $recv <> "" And $recv <> "~~bye"  Then
                ; UPDATE EDIT CONTROL WITH DATA WE RECEIVED
                ;----------------------------------------------------------------
                GUICtrlSetData($edit, GUICtrlRead($edit) & ">" & $recv & @CRLF)

            ElseIf @error Or $recv = "~~bye"  Then
                ; ERROR OCCURRED, CLOSE SOCKET AND RESET ConnectedSocket to -1
                ;----------------------------------------------------------------
                WinSetTitle($GOOEY, "", "my server - Client Disconnected")
                TCPCloseSocket($ConnectedSocket)
                $ConnectedSocket = -1
            EndIf
        EndIf
    WEnd

    GUIDelete($GOOEY)
EndFunc   ;==>Example

Func Cleanup()
    ;ON SCRIPT EXIT close opened sockets and shutdown TCP service
    ;----------------------------------------------------------------------
    If $ConnectedSocket > -1 Then
        TCPSend($ConnectedSocket, "~~bye")
        Sleep(2000)
        TCPRecv($ConnectedSocket, 512)
        TCPCloseSocket($ConnectedSocket)
    EndIf
    TCPCloseSocket($MainSocket)
    TCPShutdown()
EndFunc   ;==>Cleanup


Пакеты для теста:
Код:
;Server: 1 pack
0xD65A000019B41346146D8A02D158145B2C0D1BCF5DB2FCC27F6F9EA7DB92A9C658057F15442B83139D4DEDE0B3023FBCF08937ACFE9A2552F4B78842E35FC60C1E118479B91971311F35562AF5F89F233288080039958687D43057A30E5F
;Server: 2 pack
0xD60400000C2EC62CD60D0100637969537F7F7DA0CFC21F858787868D88828A448D8E5AAA33E788B59A754E3F8131D79C29EF06073FA2A9A4A3F6D3C7C2CBF3D3ADAEAEB2B1B2B39627B6B4F696FBB34154534732242B2E9B8B8E58CAC9CACBCCCDCECC9EFE93D9A9AE38252A993B27F52ADEDFE0E1E0E3E4E4E6E7E87B37553A7A2F3133CCC8CCEE25C86F8588898B818C8D8DC1BFD09FD1CECFCCCDC7BFC5575C4D4240F75CA1EAA6A5A6A728A3AAA8E282EFAB777A7C7AB4B5B6B7BAB9BABBBCBDBEBC8EEE83C00E0B149C0479DEC9CCCDCECFD0D1D19DFB94D191B9AAAEB2B2F4B37EBA3FE0E3E4E5E6E7E87B37553A7BB69B8E7CA0AAC3DBD362F48A888A8A8C8D8E8CDEBED397F6FAFAF3C12BF91A9E9D9E9EA0A1A2A3D64E14006A30D52713171E5528CAAF791E197F5FC2B81B1A9BE008F0B57673C0B2ED30AD7F20AC57743E4EDBD4A5BC04C444B71392B6CC6D004FCE95745F4EC73562A3D1DC5613917BB4E688832608D1F5BF0E2EFA34210B3712B97C2E07ED6E9D3B6DBAEC31922C03A39C92AF328EB6A2B6E75E749A6B8E8ACEED55033D36B7C2D7D025F4CEC5C625E7BED1FAA5B702961BB1F8FB7A42110604ACA543DEEB4354F268FD5013060D614971CA3947A5C8DFE0BC382DF2EEE7E20F8E51EFEB7717CA391DFB7CF01B47D6F0DCB824C1ED1BE9862481AECD58A7AE6B268D37EA22FA006B1FAADACD3CEB5DF5F0CB14B33CBF361ABDC778C0379613FE6FB31CE8DA9BC3A89CA712DB384E95512B14D3BF4B71D8A04B4E519E5A53E0D382C6094C4D2CE50C358D3185409A47F3F70D0B75F6FCADB9B2D8D3A14654AE7107C0778A02E2A02DE8AE6E374848FBB6005FD72F0A2B0026EB9045F6E03A2EADB2EE1614E86613CA0B5184B88AD87014AA2FB77350628DC3D6189A69485EF12273F89A5137B23303C3A8BC2C8F1F56A1DB245D659440F05BEE8EA23DA21BA02E62363979C7B75579083C2D2C9C0A29709602F3BE0133C8244747415C090301A915AF2F550B7BE41853C9E68BD0AC6D9D03E32724EFCC65921C2146A00E0322132D6D6D3C2411E4B88F1BDA1DF701AD908A1705373E7FB6C5220B93FFEE4FF9BDEA9A2E303EC1E0676C5A0D3DF53EFF23A536922C0DEA18E0C15A33E0860FB3C15AEA9DBC3524CB8A94EC345C721FF8A39A2878D34DF5E14ACA363D9CD779BEC1B40EF6DCC70DB67610E42899F1E9F7712CFC5A3C30EBA78DE0CE55BF3DC78322D80A03C38AFF6A3D9FB6FB0C8ACFD013FDA7A36F06485FEC9ADC98B7D26575F8345C136D66D1FDC4216B2E7B795D426C8FF5607D0F538649CDB06596CCFC6FDB682C8E94CB5E1304E52607C441ED7F9F3DD46690994DEF9095E2439D0382C88E73C64CFFC1ED7F093284724FA60BB2AB8ED38F1E11DC6DD3F65B3D2E853181C4CCA8934DE4805108D96C360364327E5E514A081B4632C67834BFE5FF740FE8FBD83F4FF04DA47698AA026A477C2EEDD1976594EBAA64350DFEF4AA041C3F50A3BBAFFAB80DE2A068B12A9C56B41DB8662F9A5D418CC0C83BF55B513682103F3BA60B68D832534A1DDA9D087D262DF393E3FF7D5A9B7366D2558009A1262F55F7A77BA215871E36CADD95CD929F857F0690DDCB4BE5FBC036D74215024AFCDF880DC2A285E8FA141D74AE7191508E81E69160D46AFF301CCAE0E097CD654D7DEC420F481803D4A53AB0AC73A5FD7AA6BF965FC7D470279F8F43C4FCB33DB3BAF622F3FCFC6CAD5AFDD2567093CD58D96C12DEA660B8296F5DE8FE138F800781EEBC0DBA435617C3F4024210371129CA272543A20E0534918E080A0560353389F69D6A4A87CC95046836A9C6489B10B922F99B661F862338072E017C7D0F19C2E7DA02FE24BBCF926331DD04FE58ABE6E4F274A0892D161215165F656E6BFC30F99E7165A543ADEDD91B73753A4C960C47A378295663CA3C1B433A3134BF068C89B78BEB6A836D771034B53BD6D76B5DBE6C1DD6AB1DCD4190D85B002436CDE94ACB501E475AF6DD42F8F3A336363EC6B937665440A33C9B46167F0EEC0F84ABBD5D42A2903A693C2C9B74BE6910C63AD53AF6B748CEC0C1633ADC38BD6668B28DC703A7629B086C0CE79B4469082D8CC4ED11E0D35D5E5F905485B0417DE7745D002280622BB05EDABA4EB3C34BFC658A285E0C0F91412ED91F02A2C505B7247BCB2E2DCAD57B21D596B072B53CED604B8E65AF7D7EFFB9C7D2E718545101DAEC238B409378614A30611252EEDF509D26D832CFAFD4B49F7D1A377DD0C1ED5B078BFFD77038F6CDA424057ABDC53B66A506ED68B957C9F1869948733DC85BB38A8B9448881C1A3C6CE0102A326F33352C3D728E7C5E6FBF1AB7BE5807DD76C213FD228077AF5EEFFD101AA0769E90D9E8BC1BF3C04752CAC8D7F4A815185FDD0105761DEED7C503068AD1C1FED50AFFEC80874E5D2BB32B3D6E6C4218F18D37F1CAB6D2788584833C9309A7F6520E845BF651A4FB23664F7F1CA2DCE23F8BE38383818FF7348A3731BF44FB9CA9861570571A5BB1EACFCFE061328CC4C122D8B1ADC709D5AE96A61AB967ED3FF73C58B124A6657DF78ED33632443468C773260FFE5335B4AEE34A36E0EBA75036C3B3BE7C37CA39FB6546CE352038DF5A8E11A068DAAB7BF292EBA334858A735BA03B27DAB67B30BC5314594447C6D2EF4F99320A884AED8A8F34E5B1C43849F366122A5C43B8624546879502A22B9FBBDC14E881E4C018512A5E0DC927620111EB91CC355E6DF90437ABA884A2AB9BB39F43713B363776D133FC5EA125B17BBCDAA98F85DD45E24650710330D9A4AC446C386068D9A3A1A9B8FF8E8AD4212F0656A3EDF825D1B426BA8766449548CD10EDA340AC0B756A0B9AF3F0013AD304C83D4709D54508EDFFCDACBA4B27384FC0DC5057C2D252F47724666421013FC792D24260F8AE89BC4294D09D780C3CC35D8217F7905E17E2C774E80283AF94E1C6FE30355DD414592D2B3960D8BA76BB66CCA33FA943D02C3667530B47A0B8967BECFE606B1C5B2C98BBB16E8A635EB9DCBACCF4890D944016992ED28F8F8C107963B422D59273712E4219DC9768B026BD3118E80CD625B702BD32A105CE066664EB040F78BB49A62E95BD8F8CD0C68BE99D08B57F42BE0359E14DD639C339F1F7B3D7941CC0C5D8AF06DAD2D753230D42C7DE14F2191A45E83B5C442FE640E2552F52B5DDF6ED0F5458255C88BF7F7EBBA3F2C720EC3FAD2EE45E04B2FCBFC6B79105D2195F82A16D8167626248DE81FC5B4B79ADECC671405261FE62894E8FCD31935AB55AAAFFFDB5377CEB3F2934C3AFC6238EBF724EAC492E50748FF5D0829E68DFD1569AB72809B5BD841F06CEFBBD54F82AD1A6CDDFFB20C91BE74782F626BCB35394C49B49D357FF4B61964FA8E89D1F7077093DF1C10DB6E1431132D13265D67A4DB2DCB3B4CB06489F57663EA5DF130A11D12CA25EAE8C1C2A4028FED0DDA710D35A4095B75893D7476BB136271B2CFCD8C753A929AF64A98EA4F59FF1E49949663723125AE6E3439EBCBB2DA876D8EDB6E2A0E123D58B6FF7D73EA5F13CE8911A75020203ECF0AFD0A608255F9C090900DB46D7AA67C1FE4AF7B7545DA35ADD5D66915CD4B830D418B4616BD579C2AC6195AE47117D88D4592CEED4F482C2DCB37D0BC8D7020767B6F6185B536FC80A77F96EB62DA11AB290AF8259057F64D4AB594DFB366EC9170BCCC4CCE1C411A84C0F8C5687EE536DD1D27E067D269A0A3FABA2868F8DA21E6F02E7408B82D7EBDFA0D83DC974F8D8FD334A6AE232649C154FEB425728E0A8D19056D6BD4C643BD9913D3B0DEAA47DF73786660666B872F81741D8C34808C16377CEB6E68BABD46FBD6BB99E8325948F674341EED4464E4704E9066E0C2584DE5DA304B2824525BC7EC1BD4AC06B7273E580A4C1CB7612F84178584D100F88AEEF059294440B2EF4055E34C4B7C1F555E9BBCA25D3E27C39855546F42E6CDBDC4CF875BA34A9CD9AF12DF7338FB0C60D6A80E92BECBFA07B4A8A87169A3483595702395004BCC0CF622AF471FA703268348146A6404EFBEDFBCCDAD8273800BA3E85DC124448E6C94DA0AAE4EF5C76E644B5190739358E1E1BE3659590698C253BA290918647D0E43731DA7DDC6498D1E8F20FE49E765D48D3C1FF956466FC96431EB8CDD531C9150A70C9206C8C6A9E54451FADF5111619C94146E6A9B0B950B52D8A25ED7B72D1786F6320C48BE90D2CBF3CAE3D0DC6EB7DC2CDFDED94DD41F0176D2522D732C54AFC2CDE2A7B55D14B0978E43A52EF2190989F040D7D98B9EAD53E5401964AA9F773C0865F9458266D851A6EBDF00F314F6BF0E29B1ACFC3FEF507FB3DC37B74479C33A2040B21477DCAAE6D12D0B6F3BD35E71C5E4F22E932605AFBAB803F8D1FD52720B1424864A2DC489128D0229314BBB482D54E51D65EFCDA3DF87C7C232F8D087CCE58D00CF7E819785C560C29F6B45DE6E271F969D8C2B37DB0E7FA609F44B8DC8581D558A6AF614AB185C9DC5469A309FE7357D0CF160003E889AF8AA7F21917FB09A925FC7D7838C767128BC2DE5C331DB0C1F4A56E8C3457F8AE4C1B388FB345A59D7C5AA3DE75B3A5553AACF463CACFF16789FDB81188576A924F1699A2043CE601600D66ED2C08E3FAF85FACC3A2251DEB51FE13802BF0EF5F6E1988F1A4586120FFD6F48A64AB1649544082D9A67ED6B531B37E7F469D2B19D6DCB4200FBB87F66CE08A32BD9B9C9F3DBBC4C4B37CE666030E34A1992F175CAB42B2F4FAF1C34E03C7E785178769AF3E0AEA94B0DDB3B765CFA8DDF78BC9F73FF0254745E5234792C7B982BA279A0F144782A06A5640CC64F07EDB850C8B1460FBD1008709429016950A971AEF9C0A294C28A5CC2CF27265754E507A83C00FFD7634BDE0FE193A2A177A2D6669AB9BB6278FD2D8BBD1425A2BE913089482C427C34447A957130764E7FB954AC9787320BCC8EF0F588F8BDE0836C1E5C05723E3C52F67EF6326848621FFF2ECFF0BB0E5136445698C125CF8BA69ED4A8D25DB758CA7042777F84B1A8534924C2A46951ECA5F576AA6AF5F89D0622351B5597BA2C66ACCAF4F2A9CEAF881FCD3CF2B286D431372EFBCA9187C937F4A798F9386FC203796E9BA25E5618472441CA2D37F246AF9D5209DE56FFA2297BDF24A422BFB759E0F6337EF0E020B64991DA7E07929B352E2FFF91267E44EEEF6803065CDE7C45A87A14B282774DB27FFCC7D0DF543FC211DBA15225D7B053EDDA3900AC264A2858A462E86FC6C2FE35661A7A0F5DAC4C57D16BC6C7EC4E8261C8245EA760E8928E61A5F58693C77A818C3D8437E75F4B5E61146C92904ABB17AA7ADABE37A87FC22EA821F1E0717A7533FEA826A59F1655BD707657698577F863C4B575C1F9AD3FE517EE9756B8E65CB5EEAFE93575C726E954D376C336C7A5FF32461E6AA5391E59CA4D51347E0E4BBD2C4B1D75397E56301A5846A14E14467AC13ED2F4ED3ED8B4D58DB33804BFFCDB50D93266CBE1C303673F1D1CB8240A83370EC039E089B8FAF47F93FFEAC57ED8615E04A8F9443A1BF19779CF9D7BE8CA02DDDC08BCA754EB29A713524FDF38E3EEB6C9E5414BF1DA4B78E7ABDC23971892AA56DBC7E772BAD942680D47756B42162FADA49D54197814066604FD06A350A07BA5DC42CEDC094E9B04CF1C4A9E9AAB85C5855726004B7765EF9B8B678AE2133BF892C364BA685E5C13B992564BAADCC8611DAD6E707FA70F162384F292885D55CD653CD740103BDF9526AFDE279810736550BEEC43905F5D43A03C68079A0DA440513EA4FCD72F0D2692B5DD4CF7322BFB48964DFBA1214013B45F61CBFC20ACCA309F07794C687977014E37625558AA9AB0FD9FEE7464611EDE3B2530B86F8F43B12DE51A3FC2E9EDA0FABB5A91B397BAE4E6DBDCEA0D139BF4F5285E5E4DEA7C11B371E9744871A924FAD44E069ACE5F135725142C7956D17D375244E170C62FC20EA7E14B48A20E3E330C10109495408FE1CDD112CE5410187264ACE21E333D34BE295CFB8CB2B83B2911BB85B64E74E82422FBB47C8B84A71DC55D6BC1B7BFCC408F7E911206CF6A1B23D468C991A8AB4057CEA26CC363CAAFA7287F9D52C196E674B64C49AB6A6BCDA2CE2B459C0DD99146FFA683CD0DB3C4AB689EC3C722E8DBC5DD42C5AC77B113BFADB6C41A11B2402F56BB6712440A19507CAD2509285B3070EE0A48A65818B0100BBE6B3CE6B2FB2F6CA33AE8D9F271BC2799E4F3D3375F316602F4669FB3C5E257ACF70E8F56B864768F6147C804F17809C131EDF792A00647B8586AF94AD9DABA123B15E7257452B354BABAF1F7C4DB9C686C27FE4EEE16761D2649467D8FB0396FA42A827299DC3CB385F617E387964A01B188E259139AE5734D5E700621B3A11E45B0E1C9B58902EF127DF24B967FC49E94D5735F1A2E0B8A1A2E4BDEA4E6EDD3685B91F9AFB374A69936B5D0759C921CCFDBAD7B76B41820DF8D9AFF43C7B5FDC3CDAAA5B00D44F910A3E59F5F77F073432DE89B20D0AC5704A31FDACBEB69F84BD97E60C2AB01A427961B87AC864213A769A83257E328F646E72389AEF0C6087068C56EBEEC587DCED6DF2A7BEBAFB5161D9A58295C2FC00CB08BCDD62A1D0D19B9299DBE3A5DC05FEDFCA1DC84D1BBBE2C4BF2D858AC2C0E34FBEC807FAEF483AB562EB507034A20BF19AFBF97F8F435937977A4305C34D7B2E2D89E8096F737F999C48DA07726D1441BB6D4BFF61BAA023AACCFDD05A71AEF500E8526F409BCC6AA25B3E3D36C9EBB8655A25D73D2097337FCB996DD864313CABDFE2D2DB216D83650CDA28F34CD7B7CB2E64BF2995B766F8DF01C993573AE9AD10E4AF82437642B08CEE1E92F59320B4B6857D559527DE369F9777E4B81FB01550058EFC94831B55478C3E6DB75E2A9C00C09731E4F24AED5E2D71CC538B4B6058E3026495A8866FABE449CB0173218F2B4E914D17219D1572DACDDE75FA29A93521BB798ACFAE22FE68CA29CA7AFF7A81B4091182C8A1F351642BB0013185DB2C03695429DAD024F57EC6E11ED47AF278E8E0D0C42E68E9187882CE6686E2E63B6D5134993F08A0366192F32EDE62B8F171FF5D6493407E97B05D3C50A5A0C81726E679B86B142C2E92BD874168D9F77E691952267312E656392AC351675A69DB76918A1AB185F862B3E08A5664DA42D0C7755F1C38EFA92D94B66B63F7C1F84670309BEC7B190CCCEDF5A26ED7CDE7939211D9DFB003D91A2F0C9E790CEB1121E4A819258794820D304FF02431F9036F0C870409271A9B867ED20932CF6D3D96C74C60B756B41F9B9489D27D8FD8515058D7438479E24BC378664166907CBB1E1D9A1C8A07716728E2EE6F6D3A953303242BDA8F073216EDDF860DC356DBD0A0CF343C830ECDC57B8BDF6C5261EC9597D06268BA52878AF55DC04C3500BA4721C6DCEEE35F07B0B0913B24E14191CA29ECDD01C2602BEFD3A41BDE6D4EA8A0516B18D16FBBC17632B341656E02B510BE7C88C77D76FC1E9EF51E0E4ED2868C50DC32988BB4F5AFACF0C1E242BC6D24876709D01AE743151C1D1CB4508EB76D8E9346205B839587BB966B7D967CAE283942654E987AB2F5A73D0B0AA9E7DA9053FCEAA76266AF9E52794D164F0B3C193A9D9F4F726FC5A1A8508E09A408A9DC5CD0C3C238E51F075F8705844D84D247409F632E1E2D142B9FEF9FE9DC4F4E88B16A979D732391F184857BC07E4A8FD601000058D62904003E116A8F49415B7B035C0EC50A9A3CB4894906AD84C27D37DE4F55979A4E8A1921145B971CB82C24909B8E63F99F984E52D6390516BB3431AE37193B7D9F980D29DB218FA633F037FCE1A579A51B5A11DF4B4F57E5889D267EADC8EF4BB6E7E85449A6C2AC68FD6ECBE2E0BF78660E450DA70A5AB44573B2402C048700607F554E117397AC2CB9F910496E4F6A81F4F0E8B9B4DC15E6169550B247DEE623A25CC1C7F8754C491BE7F18C4156F1B3EB6B6403FE40215B5E883C0442982B2DBEDB95FEA10D86F3A66A6FB8695DD98A97DAD93DB453307FAEB537A7D925F1F4ED82DF058CF8FAD74E9EF99BBF9CF95FF2EABD0B220E6D2981C526E1375D3AC24A92829B72B42045E9830CD12997E108402AB0AECBDB07B6EDF0FB4AD83DF8A1308134859CB8D9AEEC9D5632432721D8A56712A09504B8D05718A629638BA6C4C16CBA54A20901076061273D0B8659B0D94CE8CB4BD6037802141067F21B56ACB1013EFB61A319ADD3D86C43854BB61492A712F7789B497E13DE5A41C07B57B688E572F3692A14F4E31B14A51B583C19EF5F97A9CE32B4EEBE864831E27EE064FFA78C9407336F8FAFA98DCB759CD2DB27B60819EC37B3612E711A6FA7D63D1485E3A42A961D6B6814BE1D20F65DB81108725C12A8C470E8C63E2677EF120FE22D85B8BE36A61420896D811B91399031B5C56500DE1201ABF6CDA2FD9C9DFD06A1D276336B7F55D0E4BEF1FAAC59360EAF4EE31BD88FFC1BA650CEBBDDF6585F5A1D430C3DF320DF8F0B00089B0A34B1DD4D96179100BA854DC8FCC4F32FD56F9DDF5A0795DADFAECCA87019E0C2D9167952FCE3D813ED8E529288C5F366A43D8EC3BA0D08B970C716398D395EBE7E6DA0888B94650CA3CEE39E462363E6E6A413987C53EC56637E1137537C89BA6180DF18E4EF2E32097FD3FA778C7B1A05C23294FF110A3DB093BEB2B4C3F95438B6C0DEAF130C96A2D3CDF0014036E3EB5611D6879FC0E64AF8482DFBD6FB4241C462894EAACAAC2C805A5146651851445F0194074D5F215E322D6A04B571452A25828C9CDF5872B687D17E1086DDA6CA3D70C0499FE838ADCBA3B4EBBE7AEED6070621F710CFCA060A31E04D15F058EC86FE532A2A37F5BB996A8C6117E96054D0A356791A1815B36A69684F06E95BC6B96149D87075E6403A053BE385D8CBAEB8CC55919ACA2FA39789B49CEFE6668D39233F13BEF477D685555A1D45333D6F2503931C15EC4E3C6145DDB899ADA7B7CF9E337B577D20E7B6D4DD985578418D0ACB53B06436CE1C1558594C5D4E53242F4D2D1FC4125B1BCF94E5E85925AF978EEBCC6E4200ADE8F03B9D0D6A272E8B8A65E2B044F3C419EA7A7D45277060B3A71D3E1B0E0D6CB375459923A075302D423B02ADBA55966E1A7E5EC0E54C54AD413BA11913B68E1EC5474DC0E39AFD59154D2B97CD2C21445E212AF6D72D4817451403C1781ACC49E23107B4C0F361E8D0D4F701FCF7E61D3E76CA22D60600000C12128C1B15


Первый пакет выдаётся вам сервером, после коннекта. А второй это пакет после авторизации
 
Автор
HukpoFuJl

HukpoFuJl

AццkuЙ HukpoFuJl
Сообщения
97
Репутация
38
Бррр, вы всё усложняете неимоверно =)) Тут всё просто =)) Я с коммфортом знаком не первый день, а уже лет 5 так точно... Забудем про коммфорт вообще... есть 2 вопроса и они звучат изрядно просто:
1) Как указать порт c которого будет отправлен пакет функцией UDPSend (ну или что-нить аналогичное ей)?
2) Как определить c какого порта был принят пакет функцией UDPRecv (ну или что-нить аналогичное ей)?
Вот и всё что мне нужно по данной теме :smile:
 

Garrett

Модератор
Локальный модератор
Сообщения
3 999
Репутация
964
HukpoFuJl [?]
1) Как указать порт c которого будет отправлен пакет функцией UDPSend (ну или что-нить аналогичное ей)?
Код:
UDPStartUp()
OnAutoItExitRegister("Cleanup")
Dim $IP = "127.0.0.1"
Dim $Package = "пакет данных"
$Socket = UDPOpen( $IP, 3128 ) ; Открыть сокет.
If @error <> 0 Then Exit
UDPSend($Socket, $Package) ;Выслать данные

Func Cleanup()
    UDPCloseSocket($Socket)
    UDPShutdown()
EndFunc


2) Как определить c какого порта был принят пакет функцией UDPRecv (ну или что-нить аналогичное ей)?
У функции UDPRecv нет такой возможности. Она может вернуть только порт ранее открытого соединения, при указанном флаге 2.

Код:
UDPRecv ( $SocketArray, $Maxlen , 2 )
$SocketArray[2] ; ваш порт


Если открывали его вы, то он вам известен.
 
Автор
HukpoFuJl

HukpoFuJl

AццkuЙ HukpoFuJl
Сообщения
97
Репутация
38
UDPStartUp()
OnAutoItExitRegister("Cleanup")
Dim $IP = "127.0.0.1"
Dim $Package = "пакет данных"
$Socket = UDPOpen( $IP, 3128 ) ; Открыть сокет.
If @error <> 0 Then Exit
UDPSend($Socket, $Package) ;Выслать данные

Func Cleanup()
UDPCloseSocket($Socket)
UDPShutdown()
EndFunc
Вот я выделил, это порт НА КОТОРЫЙ придёт пакет... Но ОТКУДА он придёт?


У функции UDPRecv нет такой возможности. Она может вернуть только порт ранее открытого соединения, при указанном флаге 2.
В том и дело, что открывается порт в отдельной программе, при этом произвольно... ну это другой вопрос, менее важный, я просто уже нашёл способ заставлять программу открывать определённый порт на приём...
 
Автор
HukpoFuJl

HukpoFuJl

AццkuЙ HukpoFuJl
Сообщения
97
Репутация
38
Тему снова поднимаю, в виду новшеств в текущей версии Автоита... :smile:
Может конечно и зря поднимаю, просто не разобрался толком в буржуйской справке:

UDPOpen
--------------------------------------------------------------------------------
Открыть сокет, соответствующий подключению к имеющемуся серверу.

Код:
UDPOpen ( IPAddr, port [, flag] )


Параметры
IPAddrАдрес протокола интернет (Internet Protocol -IpV4) в виде "192.162.1.1".
portномер порта, соответствующего открываемому сокету.
flag[опционально] 0 (По умолчанию) - Не устанавливать дополнительных опций.
1 - Разрешить широковещательные сообщения на адрес "255.255.255.255".

Возвращаемое значение
Выполнено: Массив array, в котором $array[1] равен реальному сокету, $array[2] - указанный IP адрес, а $array[3] - порт. Эта информация требуется в последующих вызовах UDPSend().
Ошибка: Возвращает $array[0]=0 и устанавливает @error.
@error: windows API WSAGetError return value (see MSDN).

Замечания
Используется обмена данными приложения-клиента с сервером.
UDPRecv
--------------------------------------------------------------------------------
Получить данные, используя открытый ранее сокет

Код:
UDPRecv ( socketarray, maxlen [, flag] )


Параметры
socketarrayИдентификатор сокета/массив, возвращаемый функцией UDPBind.
maxlenМаксимальное число получаемых символов.
flag[опционально] Заставить функцию возвращать двоичные данные, если установлено в 1 (по умолчанию 0, автоматическое определение формата двоичные/строковые).
Заставить функцию возвращать полученные данные с адреса и порта, если установлено в 2. Результат возвращается в форме массива : [0] data, [1] from IP, [2] from Port.
Что бы включить обе возможности, нужно установить значение 3.

Возвращаемое значение
Выполнено: Возвращает бинарное/строковое выражение, отправленное на сокет, или массив (Если флаг равен 1, или 2).
Ошибка: Возвращает строку "", устанавливается @error.
@error: -1, -2 или -3 не верный сокет/массив.
windows API WSAGetError return value (see MSDN).

Замечания
Для соблюдения обратной совместимости функция возвращает стоковое значение по умолчанию. Если передан нулевой символ (0x00), то данные считаются двоичными.
Чтобы заставить функцию всегда возвращать двоичные данные нужно использовать флаг со значением 1.

Непонятные моменты выделены красным :smile:
 

Garrett

Модератор
Локальный модератор
Сообщения
3 999
Репутация
964
HukpoFuJl [?]
flag[опционально] 0 (Default) - No additional options are set.1 - Allow the broadcasting on the address "255.255.255.255".
Единица включает широковещательный канал.

flag[опционально] Forces the function to return binary data if set to 1 (default is 0, and will auto detect between binary/string).Forces the function to return receive from IP/port if set to 2. Results are returned in an Array : data, [1] from IP, [2] from Port.If you want both just use 3.
Единица возвращает бинарные данные, ноль определяет автоматом, что возвращать, строковые данные или бинарные (0 по умолчанию).
Двойка вернёт массив где айпи это первый ключ, а порт второй.
Тройка вернёт смешанный вариант данных.

Из замечания я понял, что для совместимости эта функция будет пытаться возвращать строковые данные
(по умолчанию).
Но если принято нулевое значение, то вернётся бинарное значение, так как по умолчанию стоит флаг 0
(строковые/бинарные).
Для того чтобы возвращалось строго бинарное значение нужно выставить флаг 1

По моему так.

P.S. I m sorry for my bad english :-[
 
Автор
HukpoFuJl

HukpoFuJl

AццkuЙ HukpoFuJl
Сообщения
97
Репутация
38
Лог джабера сказал(а):
[17:25] snoitaleR: HukpoFuJl: По UDPOpen(): 0 - не устанавливать дополнительных опций, 1 - разрешить широковещательные сообщения на адрес 255.255.255.255...
[17:31] snoitaleR: HukpoFuJl: По UDPRecv(): Заставить функцию возвращать двоичные данные, если установлено в 1 (по умолчанию 0, автоматическое определение формата (двоичные данные или строковые)... Заставить функцию возвращать полученные данные с адреса и порта, если установлено в 2. Результат возвращается в форме массива... Что бы включить обе возможности, нужно установить значение 3...
[17:35] snoitaleR: HukpoFuJl: Для соблюдения обратной совместимости функция возвращает стоковое значение по умолчанию... Если передан нулевой символ, то данные считаются двоичными... Чтобы заставить функцию всегда возвращать двоичные данные нужно использовать флаг со значением 1...

Спасибо за перевод (подредактил в спойлерах), хреново конечно, что это не то, что нужно... Ну да ладно...
 
Верх