Привет всем!
Хочу освоить обмен данными по Ethernet. Работал с последовательным портом (RS-232, RS-485). Для начала думаю написать простую программку-чат (типа аськи), чтобы соединить два компьютера и отправлять/принимать сообщения (думаю тут UDP достаточно). Читал немного про сокеты, TCP, UDP, но информации очень много, погряз… Может кто посоветует с чего начать, чтобы понимать как это работает на практике (мне нужны базовые вещи отправлять/принимать данные)? Может на каком-то примере разобраться или какую-то книжку почитать?
Спасибо!
Обмен данными по Ethernet
Сообщений 1 страница 11 из 11
Поделиться104.04.2026 19:59:09
Поделиться205.04.2026 12:43:44
Примеры из справки.
Сервер
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Запускаете сервер. После клиент.
Поделиться305.04.2026 13:25:14
MAX 2.0. Начало xD
Поделиться405.04.2026 14:19:11
Примеры из справки.
СерверКлиент
Запускаете сервер. После клиент.
Да, видел эти примеры. Но есть несколько вопросов по этим примерам:
1) Что такое сервер и обязательно ли его создавать? Что такое клиент? Может достаточно только создать соединение OpenNetworkConnection()?
2) Порт 6832 это произвольно можно определить, почему именно 6832?
3) Может вкратце поясните как это работает: это 2 разные программы, которые запускаются на 2-х машинах?
Просто хочется разобраться, как это устроено (хотя бы базовые вещи).
Спасибо за понимание)
Поделиться505.04.2026 15:32:01
Слово "СЕРВЕР" нужно понимать проще. Это что угодно, как приемщица в прачечной например. В нашем случае, это кусок кода сообщивший системе, что слушает такой то порт.
Для локальных экспериментов спроси например у Алисы:
что такое 127.0.0.1?
какие порты tcp/ip считаются стандартными?
p.s. по адресу 127.0.0.1:[какой то порт] можно общаться разными кускам одной и той же программы самими с собой для тренировки.
p.p.s. я передал практически весь текст из первого сообщения дипсику и уточнил просьбу примеры приводить на purebasic. И он столько написал, что никто в рамках форума этого не сделает.
Отредактировано useful (05.04.2026 15:43:13)
Поделиться605.04.2026 15:59:38
1) Что такое сервер и обязательно ли его создавать? Что такое клиент?
Смотрите, сайт находится на сервере. Браузер это клиент. Клиент соединяется с сервером, но не наоборот.
То есть серверы между собой подключается не могут. Клиенты между собой подключатся не могут. Клиент подключается к серверу. Сервер по своей инициативе с клиентом установить соединение не может.
Может достаточно только создать соединение OpenNetworkConnection()?
Если подключаетесь к существующему серверу то да, достаточно.
Порт 6832 это произвольно можно определить, почему именно 6832?
Потому что у сервера был задан такой порт. Можно сменить на любой свободный. Клиент подключается используя IP адрес и порт. Порт нужен для того чтобы можно было запустить множество серверов на одном IP.
Может вкратце поясните как это работает: это 2 разные программы, которые запускаются на 2-х машинах?
Можно на разных (в том числе на другой стороне земли), но у сервера должен быть доступен порт (то есть отсутствовать NAT провайдера или роутера) и клиент должен знать IP компа где запущен сервер.
Приходилось когда-то открывать порт в роутере для торрент-клиента? Вот, это для его сервера, для входящих соединений.
Поделиться705.04.2026 17:57:24
Ух ты... меня тоже интересует данная тема... и уже давно... правда, конкретно сейчас оно мне не надо, но всё же....
И раз уж тут сам Пётр отвечает, то грех не спросить/поинтересоваться.
Порт нужен для того чтобы можно было запустить множество серверов на одном IP.
Вот ! Помнится когда-то давно Пётр сделал сетевое приложение, возможно это был даже и вышеупомянутый торрент-клиент, не помню... не суть... так вот... в одной из первых редакций Пётр для каждой копии клиента открывал то ли свой порт... то ли новое соединение... по-моему так было... но потом, позже признался, что сейчас бы так не делал. То есть обошёлся бы одним соединением для тысячи клиентов. Я тогда так и не понял этого момента, собственно и сейчас смутно представляю, так как не сталкивался. Пётр, можно поподробней об этом ? Хорошо было бы с примером простеньким.
Приходилось когда-то открывать порт в роутере для торрент-клиента ?
Да, да, да... и эта тема тут когда-то так же проскакивала... и сей процесс... называется ни чем иным, как пробросом портов, ежели не ошибаюсь.
1) Что такое сервер и обязательно ли его создавать? Что такое клиент? Может достаточно только создать соединение OpenNetworkConnection()?
Здесь, думаю, можно добавить, что есть как клиент-серверные приложения, так и безсерверные, только клиенты (каждый клиент - сам себе сервер
). Первые прекратят свою работу сразу же, как только "ляжет" сервак. Вторые же... более устойчивы. Выход из строя одного хоста никак не отразится на общую работоспособность того же чата.
2) Порт 6832 это произвольно можно определить, почему именно 6832?
Могу конечно ошибаться, но... насколько помню... начальный диапазон обычно занят под системные нужды, поэтому и выбирают порт подальше... от греха !... а так... да.... произвольно...
Поделиться805.04.2026 18:15:11
для каждой копии клиента открывал то ли свой порт... то ли новое соединение... по-моему так было...
Возможно речь шла о чем-то другом, а не о сети. Или может это про о создание потока для каждого клиента, но сервер был общий для всех.
То есть обошёлся бы одним соединением для тысячи клиентов.
Сервер может быть один для множества клиентов. Клиент может установить соединение только с одним сервером.
так и безсерверные, только клиенты (каждый клиент - сам себе сервер )
Тогда куда подключаться?
Представьте что клиент это вилка, а сервер - розетка. Вилку вставили в розетку и тем самым установили соединение. А если есть только две вилки или две розетки, как их соединить?
Поделиться905.04.2026 21:43:00
Спасибо, Пётр.
1. Если удастся найти ту старую тему (попадётся на глаза), то дам здесь ссылку на неё.
2. розетка - он же сокет. Там суть была в том, что каждый клиент также одновременно является и сервером (не могу знать насколько это корректное выражение и вообще... возможно ли, но... тоже попадалось).
Поделиться1005.04.2026 22:14:52
Там суть была в том, что каждый клиент также одновременно является и сервером
Приложение может быть как клиентом так и сервером.
Ничего не мешает запустить несколько серверов выполнив функцию CreateNetworkServer() для каждого из них (порты должны быть уникальными). Также в той же программе можно функцией OpenNetworkConnection() установить требуемое количество соединений с другими серверами.
При этом сохраняется правило что клиент подключается к серверу.
Поделиться11Вчера 19:38:50
Есть ощущение, что автор топика хочет написать клиент без сервера, типа чел пишет напрямую кому то на комп. Но так не работает. Откуда клиенту знать какой ip и порт какого-то случайного человека в сети (даже если клиент запускается одновременно с сервером). Для этого и делается один сервер, к которому подключаются клиенты. В клиенте указан ip и порт сервера, клиент подключается к сереверу, передаёт какую нибудь инфу что он в сети, передаёт какой либо идентификатор, который сервер запоминает у себя и сохраняет в туда переданную инфу о клиенте. Тогда любой подключившийся просит у сервера какие у него есть клиенты, кто в сети и т.д. И уже может отправлять сообщение другому клиенту через сервер. Сервер либо сразу отправляет клиенту текст, либо кеширует его для отправки. В итоге нет варианта в котором два клиента соединились меж собой так чтобы никто не знал, такое можно, если вы только вдвоём хотите общаться, написали для себя сервера и клиенты с заранее вшитыми ip и портами в какой нибудь локальной сети, так как провайдер не даст открытый ip или даст за деньги. Я тоже думал написать что-то вроде TeamViewer и всё думал когда я соединяюсь с челом доступны ли данные с моего компа авторам TeamViewer. Если вы находитесь в локальной сети не имея личного ip, то вы никогда не соединитесь, так как ни у одного из вас нет сервера, а значит весь поток идёт через сервер TeamViewer.