Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.85/13: Рейтинг темы: голосов - 13, средняя оценка - 4.85
0 / 0 / 0
Регистрация: 25.12.2016
Сообщений: 17

Клиент/сервер не работает через Socket

06.04.2019, 00:35. Показов 2782. Ответов 6

Студворк — интернет-сервис помощи студентам
Доброго дня форумчане.
Прошу консультации - пишу для работы приложение для связи БД и мобильного приложения. Возникли проблемы при создании сетевого соединения через сокет.
Изначально на одном компе в с# создал и сервер, и клиент. При запуске на одном компе - все работало хорошо. При переносе клиента на мобильную платформу - все останавливалось на стадии подключения и заканчивалось исключением по времени ожидания.
Возникла уверенность в блокировании брандмауэром соединения. В брандмауэре порт открыл и на входящие, и на исходящие подключения по нужному порту. Подключения все одно не случалось. Т.к. клиент делал в Android Studio на Java, то начал грешить на собственную криворукость и попробовал его в Xamarine на c#. Результат такой же.
Программа мониторящая сетевую активность показывала обращение от клиента к серверу. При детализации - сервер сразу после обращения отправлял пакет клиенту. Соединения при этом не происходит.
Совсем не могу понять в чем проблема.
Начал искать еще варианты - самый первый, при тех же настройках брандмауэра, заработал - с использованием TcpListener.
Проконсультируйте начинающего - что не верно при соединении с сокетом?
И вот еще вопрос - по практике использования который из вариантов лучше Socket или TcpListener?
Сервер сокет
Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
        static String ServerIP = "192.168.0.8";
        static Int16 ServerPort = 11000;
        static int TotalConnect = 0;
 
        public delegate void DelegateNewRequest(Socket Request);
 
        static void Main()
        {
            IPHostEntry ipHost = Dns.GetHostEntry(ServerIP);
            IPAddress ipAddr = ipHost.AddressList[0];
            IPEndPoint ipEndPoint = new IPEndPoint(ipAddr, ServerPort);
            Socket sListener = new Socket(ipAddr.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
            try
            {
                sListener.Bind(ipEndPoint);
                sListener.Listen(10);
                while (true)
                {
                    Console.WriteLine("Ожидаем соединение через порт {0}", ipEndPoint);
                    Socket handler = sListener.Accept();
                    DelegateNewRequest ThisRequest = new DelegateNewRequest(AnalyzRequest);
                    IAsyncResult ar = ThisRequest.BeginInvoke(handler, null, null);
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.ToString());
            }
            finally
            {
                Console.ReadLine();
            }
        }
        public static void AnalyzRequest(Socket NewRequest)//метод определения типа запроса и выборки данных
        {
            //обработка запроса
        }

Клиент сокет
Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
        static String ServerIP = "192.168.0.8";
        static Int16 ServerPort = 11000;
 
            public static void SendRequestServerAuto(string ServerIP, int ServerPort, string Request, ref TransData AnswerData)
            {
                try
                {
                    string IncomingAnswer = null;
                    IPHostEntry ipHost = Dns.GetHostEntry(ServerIP);
                    IPAddress ipAddr = ipHost.AddressList[0];
                    IPEndPoint ipEndPoint = new IPEndPoint(ipAddr, ServerPort);
                    Socket Sender = new Socket(ipAddr.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
                    Sender.Connect(ipEndPoint);
                    Console.WriteLine("Соединение установлено.");
                    byte[] bytes = new byte[2048];
                    byte[] msg = Encoding.UTF8.GetBytes(Request);
                    int bytesSent = Sender.Send(msg);
                    Console.WriteLine("Запрос отправлен.");
                    int bytesRec = Sender.Receive(bytes);
                    IncomingAnswer = Encoding.UTF8.GetString(bytes, 0, bytesRec);
                    AnswerData = JsonConvert.DeserializeObject<TransData>(IncomingAnswer);
                    Sender.Shutdown(SocketShutdown.Both);
                    Sender.Close();
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.ToString());
                }
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
06.04.2019, 00:35
Ответы с готовыми решениями:

Socket не могу понять в чем дело, не закрывается клиент или сервер
Где то в просторах инета (возможно даже на этом форуме) нашел пример по клиент серверу на цокетах, смастерил клиент и сервер, все хорошо...

Передача файлов через Socket. Клиент получает текст в неверной кодировке
Нужно передать файл от приложения-сервера к приложению-клиенту. На сервере используется код с MSDN:...

Не работает клиент-сервер
В общем на примерах разбираюсь с клиент-серверными приложениями. То есть например одно консольное приложение = сервер, второе приложение...

6
Эксперт .NETАвтор FAQ
 Аватар для Storm23
10427 / 5157 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
06.04.2019, 01:18
Лучший ответ Сообщение было отмечено Usaga как решение

Решение

Цитата Сообщение от Медведина Посмотреть сообщение
И вот еще вопрос - по практике использования который из вариантов лучше Socket или TcpListener?
Лучше TcpListener + TcpClient + BinaryReader/BinaryWriter/BinaryFormatter повешенные поверх NetworkStream из TcpClient.

Цитата Сообщение от Медведина Посмотреть сообщение
Проконсультируйте начинающего - что не верно при соединении с сокетом?
Ну сразу бросается в глаза:
На сервере BeginInvoke есть, а EndInvoke - нет. А его нужно вызывать.
В клиенте - принимается некоторое количество байт: int bytesRec = Sender.Receive(bytes);. А остальные байты - не принимаются. То есть принимается только первый кусок сообщения.
1
0 / 0 / 0
Регистрация: 25.12.2016
Сообщений: 17
06.04.2019, 18:30  [ТС]
Storm23
Лучше TcpListener + TcpClient + BinaryReader/BinaryWriter/BinaryFormatter повешенные поверх NetworkStream из TcpClient.
Спасибо за совет. Если не затруднит - почему лучше?
Storm23
На сервере BeginInvoke есть, а EndInvoke - нет. А его нужно вызывать.
Спасибо!

И все же - крайне любопытно почему не происходит соединения через сокет?
0
Эксперт .NETАвтор FAQ
 Аватар для Storm23
10427 / 5157 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
06.04.2019, 18:37
Цитата Сообщение от Медведина Посмотреть сообщение
Спасибо за совет. Если не затруднит - почему лучше?
Потому что Socket - это низкоуровневый класс. А TcpListener + TcpClient + BinaryReader/BinaryWriter/BinaryFormatter - это более высокоуровневые надстройки над Socket которые как раз и предназначены для упрощения коммуникации через сокет.
Цитата Сообщение от Медведина Посмотреть сообщение
И все же - крайне любопытно почему не происходит соединения через сокет?
Исправьте ошибки, о которых я писал, и если проблема останется - выложите проект целиком. Наверняка там еще куча ошибок.
0
548 / 355 / 120
Регистрация: 17.08.2014
Сообщений: 1,351
06.04.2019, 21:26
Медведина, не работает как минимум потому что слушатель настроен только на свой ip а не на все
C#
1
2
3
4
5
6
7
8
9
10
11
12
 static String ServerIP = "192.168.0.8";
        static Int16 ServerPort = 11000;
        static int TotalConnect = 0;
 
        public delegate void DelegateNewRequest(Socket Request);
 
        static void Main()
        {
            IPHostEntry ipHost = Dns.GetHostEntry(ServerIP);
            IPAddress ipAddr = ipHost.AddressList[0];
            IPEndPoint ipEndPoint = new IPEndPoint(ipAddr, ServerPort);
            Socket sListener = new Socket(ipAddr.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
сделайте
C#
1
static String ServerIP = "0.0.0.0";
и проверьте. 90% что все заработает
0
0 / 0 / 0
Регистрация: 25.12.2016
Сообщений: 17
07.04.2019, 18:07  [ТС]
Andreyip
Заменил адрес на 0.0.0.0
На строке 9 при компиляции выбивает исключение
C#
1
IPHostEntry ipHost = Dns.GetHostEntry(ServerIP);
"Исключение типа "System.ArgumentException" в System.dll
Дополнительные сведения: Адрес IPv4 0.0.0.0 и адрес IPv6 ::0 - это неопределенные адреса, которые нельзя использовать в адресе назначения."

Storm23 в первом посте весь код который связан с соединением.
Сервер переходит к строке 20 и ждет подключений. Клиент отрабатывает до 13 строки, на этой строке, через время, выбивает исключение по времени.
0
Эксперт .NETАвтор FAQ
 Аватар для Storm23
10427 / 5157 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
07.04.2019, 21:16
Медведина,
В коде сервера напишите так:
C#
1
2
            IPEndPoint ipEndPoint = new IPEndPoint(IPAddress.Any, ServerPort);
            Socket sListener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
И еще, лучше использовать порты больше чем 32768. По спецификации первые 32768 портов - служебные. Прикладное ПО должно использовать вторую часть диапазона - от 32768.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
07.04.2019, 21:16
Помогаю со студенческими работами здесь

TCP клиент-сервер через интернет
Ситуация такая: Есть два компа. На одном сервер на другом клиент. Все реализована на TcpListener/TcpClient. Клиент передает на...

Клиент-сервер TCP через маршрутизатор
Пишу программу для сетевого взаимодействия клиент-сервер. Назначение - возможно чат. Писал на блокирующих сокетах TCP по документации...

Работа с сокетами: клиент-сервер работает только из под отладки
Пытаюсь осилить сетевое программирование, отойдя чуть дальше простых примеров. В отладчике работает на 50%, а при запуске из консоли не...

Создать клиент-сервер через интернет. Какие IP следует задать
Товарищи программисты, попаучайте меня, совсем ничего не знаю. Я выхожу в интернет через маршрутизатор, который выдает мне IP по DHCP....

Передача xml - файла через клиент-сервер
Доброго времени суток! Вопрос вот в чем: 1. Клиент хочет подгрузить БД и отправляет запрос серверу 2. Сервер выгружает данные с mysql...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
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