Что нового

TCP получение данных с сервера определенным IP

avtoIT

Новичок
Сообщения
94
Репутация
0
Здравствуйте, может ли кто-нибудь объяснить вот такую вещь:

Как реализовать обратную передачу данных с сервера (сервер -> клиент)? Интересует такой вопрос, если это попытаться сделать на сокете сервера, то в теории их может забрать любой подключившийся компьютер или можно как-то сузить круг до конкретного IP?
(если можно, то в ответе прикрепите, пожалуйста, пример получения данных клиентом и сужение числа получателей(или просто описание этого)).


Большое спасибо!
 

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
В английской справке (та что идет с SciTE) по TCPAccept
приведен пример с использованием функции получения IP подключившегося
Код:
Func SocketToIP($iSocket)
    Local $tSockAddr = 0, $aRet = 0
    $tSockAddr = DllStructCreate("short;ushort;uint;char[8]")
    $aRet = DllCall("Ws2_32.dll", "int", "getpeername", "int", $iSocket, "ptr", DllStructGetPtr($tSockAddr), "int*", DllStructGetSize($tSockAddr))
    If Not @error And $aRet[0] = 0 Then
        $aRet = DllCall("Ws2_32.dll", "str", "inet_ntoa", "int", DllStructGetData($tSockAddr, 3))
        If Not @error Then Return $aRet[0]
    EndIf
    Return 0
EndFunc   ;==>SocketToIP

:IL_AutoIt_1:
 
Автор
A

avtoIT

Новичок
Сообщения
94
Репутация
0
Я понимаю, что это есть в TCPAccept и TCPRecv (кстати, в русской справке тоже есть), но пока что никакой пользы от этого нет.
Куда я должен послать данные? На сокет сервера? Если да, то получается, что для каждого клиента свой сокет, верно?

Тогда вопрос о перехвате другими клиентами данных отпадает, тогда другой вопрос, чтобы передать данные с сервера на клиент, нужно лишь отослать данные на (IP сервера, используемый сокет, порт), а в клиенте прописать получение (IP сервера, используемый сокет, порт).

Я правильно понимаю?
 

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
Не совсем понимаю. Вам нужно отправить данные с сервера клиенту?
На сервере шлёте их в тот же сокет из которого получаете данные от клиента.
Код:
$recv = TCPRecv($Socket, 256)
If $recv <> "" Then TCPSend($Socket, "Ok")
 
Автор
A

avtoIT

Новичок
Сообщения
94
Репутация
0
Да, вы меня правильно поняли. И остался последний вопрос - может ли клиент X перехватить данные с сокета клиента Y? (нужно ли шифровать данные, чтобы не было утечек)

P.s. Я вообще правильно понимаю, что если Accept'ить всех пользователей, то одновременно может быть подключено несколько клиентов одновременно?
 

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
Ты слушаешь на сервере порт с помощью TCPListen.
Каждый, кто подключается на этот порт, открывает свою сессию. Чтобы их различать сервер должен запомнить каждое подключение, которое он произвел по TCPAccept.
Да, на один порт может подключиться сразу несколько клиентов.
Нет, клиенты X и Y не видят данные с не своего сокета (не своей сессии).
Я вот тут всем этим баловался http://autoit-script.ru/index.php?topic=11436
 
Верх