Как соединить 2 компа, подключенных к инету: на одном запустить один экземпляр моей программы, на другом — другой, и чтобы экземпляры общались по TCP?
Ранее работав только с HTTP (протоколом довольно высокоуровневым и простым), сейчас потихоньку спускаюсь глубже, до уровня TCP и более редких протоколов на его базе.
В основном интересуюсь сниффингом и созданием ботов, имитирующих клиенты для уже имеющихся серверов (обычно TCP используют сервера на NodeJS, также есть XMPP и другие протоколы быстрого обмена сообщениями, где TCP + шифрование TLS)
Но заодно решил заняться и прямым назначением TCP/IP, то есть прямым соединением двух компов без стороннего HTTP-сервака (который суть самое простое и тупое решение подобной задачи).
Итак.
Я написал 2 тестовые программы с помощью System.Net.Sockets, одна сервер, другая клиент.
Клиент отправляет серверу тестовый пакет, сервер по его получению шлет ответный пакет клиенту, это не суть. IP и порт задаются юзером и у сервера и у клиента.
На локалхосте все работает.
Но вот есть у меня 2 компа с Windows 8/8.1 (не Server), и надо, чтобы клиент стоят на одном из них, а сервер на другом.
Что для этого надо сделать?
1) На каком IP запустить сервер, к какому IP подключаться с клиента? А что с портами?
2) Что где настроить?
3) Вообще, конечно, хотелось бы, чтобы физически компы не были никак связаны, только через интернет. Причем подключены не обязательно к одной точке.
Возможно такое?
Но, если надо, можно создать и свою Wi-Fi-точку/сеть, можно и кабелем подключить.
Что именно из этого необходимо?
Насчет гугла, попрошу не писать.
Я умею гуглить, и параллельно ожиданию ответов на мой вопрос я буду гуглить.
Но это дело совсем не легкое, у меня и так это получается лучше многих других. Но сейчас у меня настроение хреновое, и если честно, вообще ничего делать неохота. А надо.
UPD: Блин-как-же-всё-сложно-неохота. Гори оно все огнем, возьму http
Максим Ванюшкин: Да я не про свой HTTP-сервак поднимать. Готовый хост на хостинге создать и все.
Собственно варианта 2
1) юзаю хостинг
2) юзаю TCP, обхожусь без хостинга
Я бы так и сделал. Купил бы VPS рублей за 500 в месяц и на него бота перенес, работает автономно, пить/есть не просит. Попутно на хостинге еще проекты можно разворачивать.
1) На каком IP запустить сервер, к какому IP подключаться с клиента? А что с портами?
2) Что где настроить?
3) Вообще, конечно, хотелось бы, чтобы физически компы не были никак связаны, только через интернет. Причем подключены не обязательно к одной точке.
1) Если серверной машине не выдается динамический IP от провайдера, то все просто либо на 0.0.0.0 либо к внешнему IP серверной машины делать привязку в программе. Если серверная машина находится за NAT, то нужно пробрасывать порты, как правило NAT включен на домашнем роутере, либо у провайдера. Если NAT нет, то всё просто, на каком порту открыл сервер, на тот и подключаешься с клиента
2) Проверить, что серверный порт не блокирует фаервол/антивирус и что выбранный порт не конфликтует с заранее заданным значением (номер порта лучше выбирать > 1000).
3) TCP работает поверх IP, а протокол IP вообще нас изолирует от понятия "физически связаны", на IP уровне и выше мы оперируем асбтрактным понятием "маршрут", а не "витая пара" или "вифи коннект"
IP динамический по идее... Я ж не хостер, просто квартира, подключенная к GPON от МГТС. Может этот динамический IP просто в программе вручную вводить и все? Норм будет?
Максим Ванюшкин: значит серверное приложение я запускаю на своем динамическом IP, и в клиентском приложении указываю тот же IP? А порт? Я внепонятках про NAT?
VZVZ: Да, тот же IP. Порт указываете тот, на который делаете привязку, когда создаете TcpListener в коде. Про NAT лучше гугле почитать, в двух словах не объяснить.
Максим Ванюшкин: пробую создать TcpListener на этом IP. Исключение: " System.Net.Sockets.SocketException: Требуемый адрес для своего контекста неверен" Че это?
Максим Ванюшкин: то есть сервак ведет себя так же, как будто указываю вообще левый адрес. Клиент этот адрес без проблем слушает, а сервак не могу запустить.
Максим Ванюшкин: ну как я и думал. Не работает. Когда на одном компе - все норм, а когда на разных - клиент просто не видит сервака и наоборот. И кстати, TcpListener не имеет метода Create (и слава Богу, для этого вообще-то new есть, по-правильного таких методов вообще не должно быть)
Максим Ванюшкин: херово вы матчасть знаете, если сами даете ссылку, при этом не замечая что оно доступно только с .NET 4.5, и у вас это не вызвает определенных мыслей.
Что вы разжевали? Если я перейду таки на .NET 4.5 и вместо new буду юзать Create, то все заработает?
Если у вас на кабеле от провайдера сидит через роутер несколько устройств, то вы не сможете присоединиться на внешний айпи (выданный провайдером) изнутри (с одного из устройств за роутером), если только у вас не продвинутый роутер, умеющий правильно обрабатывать такую ситуацию. Чтобы конектиться на внешний айпи, вы должны находиться снаружи (не в локальной сети).
Максим Ванюшкин: да нафиг мне его надо, конфликта. И так все ебанулись и конфликты на ровно месте возникают, то в магазине нахамят, то на дороге сами нарушают и мне еще сигналят, дескать это я им мешаю. Аж на улицу лишний раз выходить не хочется.
Насчет спасибо, так вы помогите, я скажу спасибо. Пока вы мне не помогли.
Если сравнить с тем, как я пишу туториалы для CodeProject и др., помогая разобраться людям в тех вещах, где я компетентен, то вы даже не начинали мне помогать.
Юрий Чудновский: Получается, что я делаю так:
new TcpListener(IPAddress.Parse("127.0.0.1"), 9999);
...
new TcpClient("127.0.0.1", 9999);
Ну так это и не работает.
Юрий Чудновский: вот это меня сразу навело на мысль. Хотя мне тут советовали именно подобное, еще и возмущались, что я им спасибо не сказал. Похоже, никто сам не знает.
Да здесь, походу, вы один этого не знаете, но при этом кичитесь своими "скилами" и ставите вопрос как маленький капризный ребенок, у которого не получается что-либо сделать и он просит не помощи в работе, а требует, чтобы работа была сделана за него .
Максим Ванюшкин: > как маленький капризный ребенок
Блин, да за что вы все детей так ненавидите, что слово "ребенок" для вас уже ругательным стало?
Завидуете детям, что они пока еще не успели так ипануться, а вы уже успели?
> требует, чтобы работа была сделана за него
На, глянь: codeproject.com/Tips/1065669/How-To-Build-Web-Site...
Это что, не работа, сделанная мной за других?
Это работа. Пусть и не доведенная до конца (ответ в формате HTML - это черновая времянка, а никак не полноценное кроссплатформенное REST API), но - таки работа, и немалая.
Ну так и я тоже не прошу все до конца разжевать, просто объяснить, как мне наладить связь в моем случае, и чтоб работало, в отличие от совета юзать локалхост для сервера и клиента.
Получается, мне не слабо, а тебе слабо?
Ну и пшёл в жёпь, без тебя разберусь.
как пример сервер у вас стоит на ip 192.168.0.101 вещает и слушает на 1000 порту, клиент стоит на пк с ип 192.168.0.102 стоит клиент который слушает и принимает пакеты на 1000 порту. почитайте про клиент-серверные приложения
На сервере у вас должен быть public IP. Для его получения обратитесь к провайдеру.
Далее если ваш копьютер в локальной сети (за роутером или сервером), то через NAT нужно сделать проброс порта от сервера/роутера, до копьютера, где установленно серверная часть приложения.
IPAddress.Any порт любой какой пожелаете, у каждого сетевого интерфейса есть адрес, его и указывать на удалённой машине, ну или в DNS прописывать. Все адреса системы можно получить через Dns.GetHostAddresses (Dns.GetHostName())
Разве, что брандмауэр настроить, если включен
С компом имеющим "белый" IPv4-адрес или IPv6-адрес любой может запросить соединение независимо от сети и расстояния до этой сети. В случае компа за NAT, только находящиеся в той же сети или через UDP + STUN