max_addr = ~subnet_mask;//ВЫЧИСЛЯЕМ МАКСИМАЛЬНЫЙ АДРЕС В ПОДСЕТИ
//ИНВЕРТИРУЯ МАСКУ
subnet_boradcast = subnet_ip | max_addr;//ВЫЧИСЛЯЕМ ШИРОКОВЕЩАТЕЛЬНЫЙ
//АДРЕС ПРИ ПОМОЩИ ЛОГИЧЕСКОГО "ИЛИ"
Список всех ip-адресов локальной сети в vb .net
Необходимо найти сервер с другого компьютера и подключится к нему, учитывая, что ip сервера может меняться. Как это сделать. Есть 2 проблемы:
1. Как узнать все ip адреса сети?
2. Как сделать попытку подключения?
Просто socket.Connect? Что он вернет? Исключение или nothing?
Порт сервера постоянный... Пусть будет 1350...
Помогите пожалуйста
Сервер TCP или UDP ?
Цитата: hardcase
Сервер TCP или UDP ?
TCP конечно))
Цитата: hardcase
Сервер TCP или UDP ?
Я понял почему вы это спросили....
Можно ведь создать еще по udp сокету у клиента и у сервера, применить широковещание и серверы ответят клиенту, что мы здесь...
Дошло это после прочтения темы нашего форума:
РАЗНОЕ>Студентам>Чат для локальной сети
Особенно меня заинтересовали следующие посты:
Цитата: pacific_7
Вах! Ты не знаешь просто, как работает обычный чат. А чат работает очень просто, и TCP тебе тут не надо совершенно. Тут надо UDP. Отправлять широковещательные пакеты на всю подсеть. Каждый экземпляр проги, это тебе и сервер, и клиент. Алгоритм получения адреса, на который надо слать пакеты, что бы их получала вся подсеть прост:
1. Определяем текущий IP и маску твоей подсети.
2. По полученным данным определяем широковещательный адрес для данной подсети. Сделать это можно так:
Отправляем пакеты на него. Будет получать вся подсеть. Т.е. например, если у тебя адрес в сети 192.168.1.15 при маске 24 бита (т.е. 255.255.255.0), то широковещательный адрес получится 192.168.1.255 и всё, что будет отправлено на него будет получено всеми хостами подсети 192.168.1.0 т.е. 192.168.1.1 - 192.168.1.254
Для лучшего усвоения книжки, и вообще понимания работы сети советую скачать windump - аналог *nix-ового tcpdump'а. Правда глюковат слегка ;). Ну и nmap тоже не помешает. Обе эти проги для полноценной работы в windows требуют комплект библиотек winpcap, ссылка на который там присутствует.
1. Определяем текущий IP и маску твоей подсети.
2. По полученным данным определяем широковещательный адрес для данной подсети. Сделать это можно так:
Код:
Отправляем пакеты на него. Будет получать вся подсеть. Т.е. например, если у тебя адрес в сети 192.168.1.15 при маске 24 бита (т.е. 255.255.255.0), то широковещательный адрес получится 192.168.1.255 и всё, что будет отправлено на него будет получено всеми хостами подсети 192.168.1.0 т.е. 192.168.1.1 - 192.168.1.254
Для лучшего усвоения книжки, и вообще понимания работы сети советую скачать windump - аналог *nix-ового tcpdump'а. Правда глюковат слегка ;). Ну и nmap тоже не помешает. Обе эти проги для полноценной работы в windows требуют комплект библиотек winpcap, ссылка на который там присутствует.
Цитата: pacific_7
Цитата:Originally posted by orel
Вот, кстати, нашел в Делфе такую вещь:
компонент IdUDPServer метод Broadcast - посылает данные на всю сеть. Вроде как он шлет данные как обычно, но на адрес 255.255.255.255 Сработает ли такой финт?
Попробуй, должен сработать - чаты в основном так и работают. Но все равно это будет действовать только в пределах одной подсети, а не всей сети в целом, т.к. подобные пакеты убиваются маршрутизаторами, когда попадают на них. А между подсетями стоят маршрутизаторы. Если слать направленные broadcast-пакеты, например 192.168.0.255 (при маске подсети 24 бита), то такие пакеты будут переправлены из одной подстети в другую. Т.е. можно расширить область действия твоего чата хоть в инет
Вот, кстати, нашел в Делфе такую вещь:
компонент IdUDPServer метод Broadcast - посылает данные на всю сеть. Вроде как он шлет данные как обычно, но на адрес 255.255.255.255 Сработает ли такой финт?
Попробуй, должен сработать - чаты в основном так и работают. Но все равно это будет действовать только в пределах одной подсети, а не всей сети в целом, т.к. подобные пакеты убиваются маршрутизаторами, когда попадают на них. А между подсетями стоят маршрутизаторы. Если слать направленные broadcast-пакеты, например 192.168.0.255 (при маске подсети 24 бита), то такие пакеты будут переправлены из одной подстети в другую. Т.е. можно расширить область действия твоего чата хоть в инет
Я не совсем тут все понял, тем более что тут на делфи, а я пишу на ВБ .Нет...
я не понял про:
1.
Цитата: pacific_7
1. Определяем текущий IP и маску твоей подсети.
2. По полученным данным определяем широковещательный адрес для данной подсети. Сделать это можно так:
2. По полученным данным определяем широковещательный адрес для данной подсети. Сделать это можно так:
Код:
max_addr = ~subnet_mask;//ВЫЧИСЛЯЕМ МАКСИМАЛЬНЫЙ АДРЕС В ПОДСЕТИ
//ИНВЕРТИРУЯ МАСКУ
subnet_boradcast = subnet_ip | max_addr;//ВЫЧИСЛЯЕМ ШИРОКОВЕЩАТЕЛЬНЫЙ
//АДРЕС ПРИ ПОМОЩИ ЛОГИЧЕСКОГО "ИЛИ"
//ИНВЕРТИРУЯ МАСКУ
subnet_boradcast = subnet_ip | max_addr;//ВЫЧИСЛЯЕМ ШИРОКОВЕЩАТЕЛЬНЫЙ
//АДРЕС ПРИ ПОМОЩИ ЛОГИЧЕСКОГО "ИЛИ"
Как реализвать это на .Net? и как это понять, почему так и не иначе?
2.
Цитата:
Цитата:Originally posted by orel
Вот, кстати, нашел в Делфе такую вещь:
компонент IdUDPServer метод Broadcast - посылает данные на всю сеть. Вроде как он шлет данные как обычно, но на адрес 255.255.255.255 Сработает ли такой финт?
Вот, кстати, нашел в Делфе такую вещь:
компонент IdUDPServer метод Broadcast - посылает данные на всю сеть. Вроде как он шлет данные как обычно, но на адрес 255.255.255.255 Сработает ли такой финт?
У нас тоже есть этот Broadcast, но как его реализовать я не знаю(не получается). Я не хочу тупо отправлять на 255.255.255.255, поскольку понял, что это может обрушиться на первом же маршутизаторе.
Я пытаюсь сделать так:
Код:
Imports System.Net.Sockets
Imports System.Net
Public Class Form1
Dim _serversocket As Socket = New Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp)
Dim buffer(10) As Byte
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
_serversocket.EnableBroadcast = True
_serversocket.Send(buffer, buffer.Length, SocketFlags.Broadcast)
End Sub
End Class
Imports System.Net
Public Class Form1
Dim _serversocket As Socket = New Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp)
Dim buffer(10) As Byte
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
_serversocket.EnableBroadcast = True
_serversocket.Send(buffer, buffer.Length, SocketFlags.Broadcast)
End Sub
End Class
пытался всяко менять, но он ругается на _serversocket.Send(buffer, buffer.Length, SocketFlags.Broadcast), говорит: "Предпринятая операция не поддерживается для выбранного типа объекта".
Облазил MSDN и весь инет, не могу решить это...
Помогите пожалуйста
P.S. for hardcase, желательно без UDPClient.... Очень желательно