Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/47: Рейтинг темы: голосов - 47, средняя оценка - 5.00
 Аватар для SunRain
13 / 13 / 2
Регистрация: 03.09.2012
Сообщений: 133

Правильное переподключение к сокету

09.06.2016, 09:23. Показов 9236. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
В очередной раз прошу помощи у Гуру.
У меня проблема с переподключением к сокету по TPC/IP
При вызове метода RequestTickets() происходят подключение к сокету сервера, операция с ним и отключение.
Первый раз все отрабатывает отлично, но при попытке переподключения я ловлю ошибку:

System.Net.Sockets.SocketException (0x80004005): Подключение не установлено, т.к. конечный компьютер отверг запрос на подключение 127.0.0.1:5003
в System.Net.Sockets.Socket.Connect(IPAddr ess[] addresses, Int32 port)


Напрашивается мысль, что сокет не закрывается.
Что я делаю не так..?

P.S. К данному сервису существуют клиенты, которые корректно умеют подключатся и отключатся, но как и у самого сервиса код их закрыт, так что просто посмотреть, увы, не могу..

Код ниже:
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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
class TofAdapter
  {
        private Socket socket;
 
        public string[] RequestTickets()
        {
            string[] result = null;
            try
            {
                Connect("127.0.0.1", 5003);
                
                byte[] outStream = Encoding.ASCII.GetBytes("SomeRequestText");
                socket.Send(outStream, outStream.Length, SocketFlags.None);
 
                byte[] inStream = new byte[socket.ReceiveBufferSize];
                socket.Receive(inStream, socket.ReceiveBufferSize, SocketFlags.None);
                string responseString = Encoding.ASCII.GetString(inStream).Trim('\0');
                
                Disconect();
 
            }
            catch (Exception ex)
            {
                ErrorFormatted("При получения списка произошла ошибка: {0} - {1}", ex.Message, ex.ToString());
            }
            return result;
        }
 
        private void Connect(string address, int port)
        {
            try
            {
                socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                socket.Connect(address, port);
            }
            catch (Exception ex)
            {
                ErrorFormatted("При подключении к сокету произишла ошибка: {0} - {1}", ex.Message, ex.ToString());
            }
        }
 
        private void Disconect()
        {
            try
            {
                socket.Shutdown( SocketShutdown.Both);
                socket.Close();
            }
            catch (Exception ex)
            {
                ErrorFormatted("При отключения от сокета произишла ошибка: {0} - {1}", ex.Message, ex.ToString());
            }
        }
    }
Добавлено через 22 часа 30 минут
Up!
Неужели никто не работает с сокетами..?
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
09.06.2016, 09:23
Ответы с готовыми решениями:

Подойдут ли вентиляторы от сокету 1150 к сокету 1151
Хочу собирать компьютер на сокете 1151 , но не вижу вентиляторов к такому процессору , подойдут ли вентиляторы к сокету 1150. И ещё вопрос...

Передача БД по сокету
Как передать БД(Access) с сервера(консоль) на клиент(Форма) по сокету?

Правильное swprintf, правильное wprintf ?
Вродеж бы по ,,инструкции,,.... ..... wchar_t str = L"tanya"; // обозначает, что строка не однобайтная, а двуб ...

7
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
09.06.2016, 13:48
Цитата Сообщение от SunRain Посмотреть сообщение
Неужели никто не работает с сокетами..?
Подождите, вот тов. Storm23 появится, он вроде с ними прямо на ты. Сразу подскажет, уверен.
1
Эксперт .NETАвтор FAQ
 Аватар для Storm23
10425 / 5155 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
09.06.2016, 15:41
Лучший ответ Сообщение было отмечено SunRain как решение

Решение

Цитата Сообщение от SunRain Посмотреть сообщение
Неужели никто не работает с сокетами..?
В вашем коде почти все нормально, поэтому никто вам и не отвечает.
Единственно что смущает - это то что вы читаете данные и не проверяете сколько байт вы прочитали (строка 16), и то , что вы не закрываете и не диспозите сокет в случае ошибки при приеме (то есть ваш вызов Disconect() должен быть в finally, ну и кроме Close лучше еще вызвать Dispose для Socket).
Но наврядли это все влияет на то, что вам сервер не отвечает. Проблема либо в сервере (может он не хочет открывать второй коннект на том же IP), либо в том, что вы не закрываете сокет (то есть у вас процесс не доходит до Disconect), либо вы как-ото неправильно конектитесь во второй раз.
1
484 / 397 / 68
Регистрация: 14.02.2014
Сообщений: 1,930
09.06.2016, 15:53
SunRain, MSDN Socket.Connect
Если сокет был раньше отключен, нельзя использовать этот метод для восстановления подключения.Для повторного подключения воспользуйтесь одним из асинхронных методов BeginConnect.Это ограничение основного поставщика.
1
 Аватар для SunRain
13 / 13 / 2
Регистрация: 03.09.2012
Сообщений: 133
09.06.2016, 19:15  [ТС]
Storm23,
это то что вы читаете данные и не проверяете сколько байт вы прочитали (строка 16)
А зачем это нужно, если сообщения, в любом случае не превысят буффер?
Если не затруднит, с несколькими строками примера, возможно я что-то недопонимаю..
Столкнулся с такой проблемой: если не делать задержку хотя бы в 100 миллисекунд, то сервер не успевает добавить в ответ весь свой текст и я, соответственно, забираю кусками. Решил краткой паузой, но, как понимаю, это неверно?

(то есть ваш вызов Disconect() должен быть в finally, ну и кроме Close лучше еще вызвать Dispose для Socket).
Конечно, Вы правы..)
Я поместил его туда просто для теста, но проблема, увы, не в этом.
Сейчас единственным решением вижу вообще не закрывать коннект, не слишком надежно, но лучше вариантов пока не вижу..

aquaMakc,
Благодарю, попробую
0
Эксперт .NETАвтор FAQ
 Аватар для Storm23
10425 / 5155 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
09.06.2016, 20:20
Цитата Сообщение от SunRain Посмотреть сообщение
А зачем это нужно, если сообщения, в любом случае не превысят буффер?
А дело и не в размере буфера. TCP это протокол с фрагментацией. Это значит что вам за раз может придти произвольное число байт. Может придти 1000 байт, а может и только один байт. При чем это не зависит от того, какими кусками данные отправлялись. Поэтому вам нужно принимать байты, считать их количество, накапливать. И когда будет принято нужное число байт (ну или ждать на протяжении какого-то интервала времени, зависит от протокола), только тогда преобразовывать принятые байты в строку. Прием нулевого числа байт, означает что сервер разорвал подключение.
И кстати, тогда вам и не придется делать вот эти костыли с .Trim('\0').

Цитата Сообщение от aquaMakc Посмотреть сообщение
Если сокет был раньше отключен, нельзя использовать этот метод для восстановления подключения.
Там сокет создается заново при каждом конекте.
1
 Аватар для SunRain
13 / 13 / 2
Регистрация: 03.09.2012
Сообщений: 133
10.06.2016, 11:32  [ТС]
Storm23,
И кстати, тогда вам и не придется делать вот эти костыли с .Trim('\0').
Я же все равно не могу установить длину равную serverStream *свалится с эксепшеном NotSupportedException при попытке обращения к Length (.NET4.0, если что, выше нельзя)*, так что в массиве как ни крути будут нулевые байты, а использовать тут List<byte> как-то не комильфо..

В любом случае, спасибо, тема для меня новая и я рад, что с ней поработал..)
0
Эксперт .NET
 Аватар для Usaga
14087 / 9305 / 1348
Регистрация: 21.01.2016
Сообщений: 34,932
10.06.2016, 11:42
Цитата Сообщение от SunRain Посмотреть сообщение
а использовать тут List<byte> как-то не комильфо..
Отчего же? Задай начальный размер в пару килобайт и спокойно копи принимаемые байты.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
10.06.2016, 11:42
Помогаю со студенческими работами здесь

подключение к сокету сервера
private void SetupServerSocket() { // Получаем информацию о локальном компьютере IPHostEntry localMachineInfo = ...

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

Передача TList по сокету
Здравствуйте. У меня вопрос, можно более грамотно передать данные с TList с помощью сокетов? Открыл забытый проект, хочется доделать. ...

Передача байтов по сокету
Добрый день. Возник вопрос с отправкой определенных байтов по сети. В С++ есть такой код byte x = 0xF7 И при отправке я мог видеть...

Передача файлов по сокету
Здраствуйте. Я уже писала тему, но уже решила передачу сообщений через сокеты, сейчас делаю передачу файлов по сокетам. Примеров на с++...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru