Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
0 / 0 / 3
Регистрация: 08.01.2018
Сообщений: 25
.NET 4.x

Открытие портов

11.07.2018, 11:51. Показов 1137. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте! Я делал socket - client. Узнал что можно связаться с компьютером удаленно через проброс портов на роуторе. Порт я пробросил, он работает. Удаленно клиент подключается к серверу, но проблема в том что данные от клиента или от сервера не доходят не тому не другому. То есть когда клиент подключается сервер должен отправить ему строку, но это до него не доходит. Вот код
Сервера:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class Program
    {
        static TcpListener server = new TcpListener(IPAddress.Any,5050);
        static void Main(string[] args)
        {
            server.Start();
            Console.WriteLine("Wait connect");
 
            TcpClient client = server.AcceptTcpClient();
            Console.WriteLine("Client Connected!");
 
            NetworkStream stream = client.GetStream();
 
            string message = Console.ReadLine();
            byte[] data = Encoding.UTF8.GetBytes(message);
 
            stream.Write(data,0,data.Length);
 
            Console.ReadKey();
        }
    }
Код клиента:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class Program
    {
        static TcpClient client = new TcpClient();
        static void Main(string[] args)
        {
            client.Connect("my_ip", 5050);//Через локал сообщение доходит, через глобал - нет
            byte[] data = new byte[256];
            StringBuilder response = new StringBuilder();
            NetworkStream stream = client.GetStream();
 
            do
            {
                int bytes = stream.Read(data, 0, data.Length);
                response.Append(Encoding.UTF8.GetString(data, 0, bytes));
            }
            while (stream.DataAvailable); // пока данные есть в потоке
 
            Console.WriteLine(response.ToString());
            Console.ReadKey();
        }
    }
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
11.07.2018, 11:51
Ответы с готовыми решениями:

Открытие портов UPnP
Подскажите как открыть порты. Просто через сокет не работает, тк у меня роутер. Вычитал что торрент и скайп используют upnp, подскажите...

Программный проброс портов
Скажем есть программа, работающая по порту 4321, но в роутере этот порт закрыт. Нужно написать программу, которая будет открывать этот...

Определение активности com-портов
Пишу программу для связи с машиной, который подключается через com порт. Как сделать автоматическое определение com портов, т.е. выводится...

8
0 / 0 / 0
Регистрация: 11.07.2018
Сообщений: 24
11.07.2018, 20:11
может потому что "my_ip" не зарегистрирован? там вроде бы должно в DNS службе регистрироваться, чтоб к нему по имени можно было подключиться.

Добавлено через 33 секунды
пробуй по ip подключиться
0
0 / 0 / 3
Регистрация: 08.01.2018
Сообщений: 25
13.07.2018, 18:27  [ТС]
я и подключаюсь по ip просто я его скрыл. Еще раз говорю, соединение устанавливается, а данные не доходят.
0
0 / 0 / 0
Регистрация: 11.07.2018
Сообщений: 24
14.07.2018, 20:27
B_im, сделай stream.Flush на сервере. и client.GetStream() в using заверни. походу просто из-за того что используется буферизованная передача данных, пока буфер не заполнится, данные не отправятся. и я конечно не уверен, но по моему using через dispose автоматом отправляет данные из буфера не смотря на его заполнение

Добавлено через 1 минуту
B_im, обязательно используй using, а то клиент может только по таймауту понять, что сервер перестал работать и больше не пришлет данные
0
0 / 0 / 3
Регистрация: 08.01.2018
Сообщений: 25
19.08.2018, 20:34  [ТС]
Цитата Сообщение от An70ni Посмотреть сообщение
B_im, сделай stream.Flush на сервере. и client.GetStream() в using заверни. походу просто из-за того что используется буферизованная передача данных, пока буфер не заполнится, данные не отправятся. и я конечно не уверен, но по моему using через dispose автоматом отправляет данные из буфера не смотря на его заполнение

Добавлено через 1 минуту
B_im, обязательно используй using, а то клиент может только по таймауту понять, что сервер перестал работать и больше не пришлет данные
А можно поконкретнее насчет
Цитата Сообщение от An70ni Посмотреть сообщение
client.GetStream() в using заверни
?
0
Эксперт .NET
 Аватар для Wolfdp
3790 / 1767 / 371
Регистрация: 15.06.2012
Сообщений: 6,543
Записей в блоге: 3
20.08.2018, 04:06
Цитата Сообщение от B_im Посмотреть сообщение
?
https://docs.microsoft.com/ru-... -statement

хотя все равно странно, ведь вьі явно не сразу глушете программу сервера, и на нем стоит ReadKey... Вообще как определяете, что соединение есть, но данньіе не приходят?
0
0 / 0 / 0
Регистрация: 11.07.2018
Сообщений: 24
20.08.2018, 06:24
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
 using(TcpClient client = server.AcceptTcpClient())
{
            Console.WriteLine("Client Connected!");
 
          using(  NetworkStream stream = client.GetStream())
{
 
            string message = Console.ReadLine();
            byte[] data = Encoding.UTF8.GetBytes(message);
 
            stream.Write(data,0,data.Length)
}
}
клиент:
C#
1
2
3
4
5
6
7
8
9
10
11
12
client.Connect("my_ip", 5050);//Через локал сообщение доходит, через глобал - нет
            byte[] data = new byte[256];
            StringBuilder response = new StringBuilder();
            using(NetworkStream stream = client.GetStream())
 {
            do
            {
                int bytes = stream.Read(data, 0, data.Length);
                response.Append(Encoding.UTF8.GetString(data, 0, bytes));
            }
            while (stream.DataAvailable); // пока данные есть в потоке
}
Но сначала вам где-то нужно начать писать. вы, подключившись, начинаете читать из потока и на сервере и на клиенте. И вот они сидят и ждут пока кто-то напишет, а никто не пишет: все ждут.
0
Эксперт .NETАвтор FAQ
 Аватар для Storm23
10427 / 5157 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
20.08.2018, 08:52
Цитата Сообщение от An70ni Посмотреть сообщение
C#
1
while (stream.DataAvailable); // пока данные есть в потоке
Нельзя так писать. Свойство DataAvailable показывает сколько принятых данных есть в потоке. Данные, которые еще не пришли на сокет, DataAvailable не показывает.

Для нормальной отправки данных нужно сначала посылать длину пакета, а клиенту нужно прочитать эту длину и ждать нужное число байт.
0
0 / 0 / 0
Регистрация: 11.07.2018
Сообщений: 24
20.08.2018, 09:09
вообще лучше сделать как в http: если нет длины пакета, то читать, пока другая сторона не разорвет соединение. А на сервере ведь используется ReadLine, то чтение закончится когда увидит в конце последовательность "\r\n"
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
20.08.2018, 09:09
Помогаю со студенческими работами здесь

Помогите с обработкой портов
Мне нужно отслеживать все данные полученые из клавиатурного порта. Ответте пожалуйста, не молчите! Хоть скажите, что сами...

Перечисление открытых сетевых портов
приветствую, нужна помощь знающих людей. есть задача, а именно нужно написать в форме программу, с использованием winAPI которая будет...

Сканер портов (заблокирован, отфильтрован)
Написал программу для сканирования потоков. Создал TCPClient в try создаю подключение, если подключился вывожу его на экран, если же не...

Перенаправленные портов сервер клиент
Здравствуйте, хочу сделать программку типа лаунчер, но и что бы она слушала определенный порт и в дальнейшем передавала с него данные по...

Проверка открытых/закрытых портов
Написал тестовую программe которая посматривает определенный порт, а потом выводи соответствующее сообщение. Но, она работает не...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru