PureBasic - форум

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » PureBasic - форум » PureBasic для Windows » Обмен данными по Ethernet


Обмен данными по Ethernet

Сообщений 1 страница 11 из 11

1

Привет всем!
Хочу освоить обмен данными по Ethernet. Работал с последовательным портом (RS-232, RS-485). Для начала думаю написать простую программку-чат (типа аськи), чтобы соединить два компьютера и отправлять/принимать сообщения (думаю тут UDP достаточно). Читал немного про сокеты, TCP, UDP, но информации очень много, погряз… Может кто посоветует с чего начать, чтобы понимать как это работает на практике (мне нужны базовые вещи отправлять/принимать данные)? Может на каком-то примере разобраться или какую-то книжку почитать?
Спасибо!

0

2

Примеры из справки.
Сервер

Код:
Port = 6832
*Buffer = AllocateMemory(1000)

If CreateNetworkServer(0, Port, #PB_Network_IPv4 | #PB_Network_TCP, "127.0.0.1")

  MessageRequester("PureBasic - Server", "Server created (Port "+Port+").", 0)
  
  Repeat
      
    ServerEvent = NetworkServerEvent()
  
    If ServerEvent
    
      ClientID = EventClient()
  
      Select ServerEvent
      
        Case #PB_NetworkEvent_Connect
          MessageRequester("PureBasic - Server", "A new client has connected !", 0)
  
        Case #PB_NetworkEvent_Data
          MessageRequester("PureBasic - Server", "Client "+ClientID+" has send a packet !", 0)
          ReceiveNetworkData(ClientID, *Buffer, 1000)
          MessageRequester("Info", "String: "+PeekS(*Buffer, -1, #PB_UTF8), 0)
  
        Case #PB_NetworkEvent_Disconnect
          MessageRequester("PureBasic - Server", "Client "+ClientID+" has closed the connection...", 0)
          Quit = 1
    
      EndSelect
    EndIf
    
  Until Quit = 1
  
  MessageRequester("PureBasic - Server", "Click to quit the server.", 0)
  
  CloseNetworkServer(0)
Else
  MessageRequester("Error", "Can't create the server (port in use ?).", 0)
EndIfl

Клиент

Код:
Port = 6832

ConnectionID = OpenNetworkConnection("127.0.0.1", Port)
If ConnectionID
  MessageRequester("PureBasic - Client", "Client connected to server...", 0)
  
  SendNetworkString(ConnectionID, "An hello from a client !!! :-)", #PB_UTF8)
    
  MessageRequester("PureBasic - Client", "A string has been sent to the server, please check it before quit...", 0)
  
  CloseNetworkConnection(ConnectionID)
Else
  MessageRequester("PureBasic - Client", "Can't find the server (Is it launched ?).", 0)
EndIf

Запускаете сервер. После клиент.

0

3

MAX 2.0. Начало xD

0

4

Пётр написал(а):

Примеры из справки.
Сервер

Клиент

Запускаете сервер. После клиент.

Да, видел эти примеры. Но есть несколько вопросов по этим примерам:
1) Что такое сервер и обязательно ли его создавать? Что такое клиент? Может достаточно только создать соединение OpenNetworkConnection()?
2) Порт 6832 это произвольно можно определить, почему именно 6832?
3) Может вкратце поясните как это работает: это 2 разные программы, которые запускаются на 2-х машинах?
Просто хочется разобраться, как это устроено (хотя бы базовые вещи).
Спасибо за понимание)

0

5

Слово "СЕРВЕР" нужно понимать проще. Это что угодно, как приемщица в прачечной например. В нашем случае, это кусок кода сообщивший системе, что слушает такой то порт.
Для локальных экспериментов спроси например у Алисы:
что такое 127.0.0.1?
какие порты tcp/ip считаются стандартными?

p.s. по адресу 127.0.0.1:[какой то порт] можно общаться разными кускам одной и той же программы самими с собой для тренировки.

p.p.s. я передал практически весь текст из первого сообщения дипсику и уточнил просьбу примеры приводить на purebasic. И он столько написал, что никто в рамках форума этого не сделает.

Отредактировано useful (05.04.2026 15:43:13)

0

6

Sergey написал(а):

1) Что такое сервер и обязательно ли его создавать? Что такое клиент?

Смотрите, сайт находится на сервере. Браузер это клиент. Клиент соединяется с сервером, но не наоборот.
То есть серверы между собой подключается не могут. Клиенты между собой подключатся не могут. Клиент подключается к серверу. Сервер по своей инициативе с клиентом установить соединение не может.

Sergey написал(а):

Может достаточно только создать соединение OpenNetworkConnection()?

Если подключаетесь к существующему серверу то да, достаточно.

Sergey написал(а):

Порт 6832 это произвольно можно определить, почему именно 6832?

Потому что у сервера был задан такой порт. Можно сменить на любой свободный. Клиент подключается используя IP адрес и порт. Порт нужен для того чтобы можно было запустить множество серверов на одном IP.

Sergey написал(а):

Может вкратце поясните как это работает: это 2 разные программы, которые запускаются на 2-х машинах?

Можно на разных (в том числе на другой стороне земли), но у сервера должен быть доступен порт (то есть отсутствовать NAT провайдера или роутера) и клиент должен знать IP компа где запущен сервер.
Приходилось когда-то открывать порт в роутере для торрент-клиента? Вот, это для его сервера, для входящих соединений.

0

7

Ух ты...   меня тоже интересует данная тема...   и уже давно...   правда, конкретно сейчас оно мне не надо, но всё же....
И раз уж тут сам Пётр отвечает, то грех не спросить/поинтересоваться.

Пётр написал(а):

Порт нужен для того чтобы можно было запустить множество серверов на одном IP.

Вот !  Помнится когда-то давно Пётр сделал сетевое приложение, возможно это был даже и вышеупомянутый торрент-клиент, не помню...  не суть...  так вот...  в одной из первых редакций Пётр для каждой копии клиента открывал то ли свой порт...  то ли новое соединение...  по-моему так было... но потом, позже признался, что сейчас бы так не делал. То есть обошёлся бы одним соединением для тысячи клиентов. Я тогда так и не понял этого момента, собственно и сейчас смутно представляю, так как не сталкивался. Пётр, можно поподробней об этом ?  Хорошо было бы с примером простеньким.

Пётр написал(а):

Приходилось когда-то открывать порт в роутере для торрент-клиента ?

Да, да, да...  и эта тема тут когда-то так же проскакивала...  и сей процесс...  называется ни чем иным, как пробросом портов, ежели не ошибаюсь.

Sergey написал(а):

1) Что такое сервер и обязательно ли его создавать? Что такое клиент? Может достаточно только создать соединение OpenNetworkConnection()?

Здесь, думаю, можно добавить, что есть как клиент-серверные приложения, так и безсерверные, только клиенты (каждый клиент - сам себе сервер :)). Первые прекратят свою работу сразу же, как только "ляжет" сервак. Вторые же...  более устойчивы. Выход из строя одного хоста никак не отразится на общую работоспособность того же чата.

Sergey написал(а):

2) Порт 6832 это произвольно можно определить, почему именно 6832?

Могу конечно ошибаться, но...   насколько помню...  начальный диапазон обычно занят под системные нужды, поэтому и выбирают порт подальше...  от греха !...   а так...  да....  произвольно...

0

8

Пар написал(а):

для каждой копии клиента открывал то ли свой порт...  то ли новое соединение...  по-моему так было...

Возможно речь шла о чем-то другом, а не о сети. Или может это про о создание потока для каждого клиента, но сервер был общий для всех.

Пар написал(а):

То есть обошёлся бы одним соединением для тысячи клиентов.

Сервер может быть один для множества клиентов. Клиент может установить соединение только с одним сервером.

Пар написал(а):

так и безсерверные, только клиенты (каждый клиент - сам себе сервер )

Тогда куда подключаться?
Представьте что клиент это вилка, а сервер - розетка. Вилку вставили в розетку и тем самым установили соединение. А если есть только две вилки или две розетки, как их соединить?

0

9

Спасибо, Пётр.

1. Если удастся найти ту старую тему (попадётся на глаза), то дам здесь ссылку на неё.
2. розетка - он же сокет. Там суть была в том, что каждый клиент также одновременно является и сервером (не могу знать насколько это корректное выражение и вообще...  возможно ли, но...  тоже попадалось).

0

10

Пар написал(а):

Там суть была в том, что каждый клиент также одновременно является и сервером

Приложение может быть как клиентом так и сервером.
Ничего не мешает запустить несколько серверов выполнив функцию CreateNetworkServer() для каждого из них (порты должны быть уникальными). Также в той же программе можно функцией OpenNetworkConnection() установить требуемое количество соединений с другими серверами.
При этом сохраняется правило что клиент подключается к серверу.

0

11

Есть ощущение, что автор топика хочет написать клиент без сервера, типа чел пишет напрямую кому то на комп. Но так не работает. Откуда клиенту знать какой ip и порт какого-то случайного человека в сети (даже если клиент запускается одновременно с сервером). Для этого и делается один сервер, к которому подключаются клиенты. В клиенте указан ip и порт сервера, клиент подключается к сереверу, передаёт какую нибудь инфу что он в сети, передаёт какой либо идентификатор, который сервер запоминает у себя и сохраняет в туда переданную инфу о клиенте. Тогда любой подключившийся просит у сервера какие у него есть клиенты, кто в сети и т.д. И уже может отправлять сообщение другому клиенту через сервер. Сервер либо сразу отправляет клиенту текст, либо кеширует его для отправки. В итоге нет варианта в котором два клиента соединились меж собой так чтобы никто не знал, такое можно, если вы только вдвоём хотите общаться, написали для себя сервера и клиенты с заранее вшитыми ip и портами в какой нибудь локальной сети, так как провайдер не даст открытый ip или даст за деньги. Я тоже думал написать что-то вроде TeamViewer и всё думал когда я соединяюсь с челом доступны ли данные с моего компа авторам TeamViewer. Если вы находитесь в локальной сети не имея личного ip, то вы никогда не соединитесь, так как ни у одного из вас нет сервера, а значит весь поток идёт через сервер TeamViewer.

0


Вы здесь » PureBasic - форум » PureBasic для Windows » Обмен данными по Ethernet