Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.76/34: Рейтинг темы: голосов - 34, средняя оценка - 4.76
0 / 0 / 0
Регистрация: 26.11.2015
Сообщений: 14

Сокеты и BinaryWriter = Не удается записать данные в транспортное соединение

16.12.2015, 02:06. Показов 7418. Ответов 12
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, пишу клиент-серверное приложение и столкнулся с ошибкой, гуглил и по этому поводу ничего не могу найти, что бы решило проблему. Есть сторона сервера :
Кликните здесь для просмотра всего текста
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
55
56
57
class Program
{
    static List<string> user = new List<string> { "admin 1", "user qwerty", "host yyyyysha" };
 
    static private Socket socket, accept_socket;
    static private bool login_flag;
 
    static private BinaryReader binaryread;
 
    static void Main(string[] args)
    {
        login_flag = false;
        socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.IP);
        socket.Bind(new IPEndPoint(IPAddress.Any, 10));
        socket.Listen(10);
        while (true)
        {
            try
            {
                accept_socket = socket.Accept();
                binaryread = new BinaryReader(new NetworkStream(accept_socket));
                switch (binaryread.ReadInt32())
                {
                    case 1:
                        if (Login_Server(binaryread.ReadString(), binaryread.ReadString()))
                            accept_socket.Send(Encoding.UTF8.GetBytes("Ви успішно залогінились!"));
                        else
                            accept_socket.Send(Encoding.UTF8.GetBytes("Не вірний логін/пароль!"));
                        break;
                }
 
                accept_socket.Shutdown(SocketShutdown.Both);
                accept_socket.Close();
            }
            catch (SocketException e)
            {
                Console.WriteLine(e.Message);
            }
            Console.ReadKey();
        }
    }
 
    static private bool Login_Server(string login, string password)
    {
        foreach (string key in user)
        {
            string[] arr_key = key.Split(' ');
            if (arr_key[0].Trim(' ') == login.Trim(' ') && arr_key[1].Trim(' ') == password.Trim(' '))
            {
                Console.WriteLine("User : { [Login = " + login + "] [Pass = " + password + "] } = Login!");
                login_flag = true;
                break;
            }
        }
        return login_flag;
    }
}

И сторона клиента
Кликните здесь для просмотра всего текста
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
55
56
57
58
59
60
61
public partial class MainWindow : Window
{
 
    private Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.IP);
    private BinaryWriter binarywriter;
 
    public MainWindow()
    {
        InitializeComponent();
    }
 
    private void Client_Form_Loaded(object sender, RoutedEventArgs e)
    {
        try
        {
            this.socket.Connect(new IPEndPoint(IPAddress.Loopback, 10));
            this.binarywriter = new BinaryWriter(new NetworkStream(this.socket));
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }
    }
 
    private void log_Click(object sender, RoutedEventArgs e)
    {
        string data = "";
        try
        {
            if (this.socket.Connected)
            {
                this.binarywriter.Write(1);
                this.binarywriter.Write(login.Text);
                this.binarywriter.Write(password.Password);
 
                byte[] buffer = new byte[1024];
                int size;
                do
                {
                    size = socket.Receive(buffer);
                    data += Encoding.UTF8.GetString(buffer);
                } while (size > 0);
                MessageBox.Show(data);
            }
            else
            {
                MessageBox.Show("Connection error");
            }
 
        }
        catch (IOException ex)
        {
            MessageBox.Show(ex.Message);
        }
        catch (SocketException es)
        {
            MessageBox.Show(es.Message);
        }
    }
 
}


Первый раз когда отправляю данные с клиента, все хорошо :
C#
1
2
3
this.binarywriter.Write(1);
this.binarywriter.Write(login.Text);
this.binarywriter.Write(password.Password);
А когда второй раз, то выдает ошибку на
C#
1
this.binarywriter.Write(login.Text);
что "Не удается записать данные в транспортное соединение".

Как решить эту проблему ? Спасибо за внимание и помощь!

Добавлено через 6 минут
Не дописал полностью, выдает ексепшен что "Не удается записать данные в транспортное соединение: Программа на вашем хост-компьютере разорвала установленное подключение."
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
16.12.2015, 02:06
Ответы с готовыми решениями:

Не удаётся записать правильно данные в БД
Всем привет. Не удаётся подключиться к БД. string myConnectionString = &quot;Database=test;Data Source=11.22.133.166;User...

Не удается записать данные в поток
Доброго времени суток. Создал клиент/сервер, после соединения клиент может отправлять данные серверу, а при попытке отправки сообщения...

Глючит соединение с интернетом. Не открываются сайты, не удается установить DNS соединение
Добрый день! Помогите разобраться с проблемой!!! Есть сеть из 30 ПК, последнее 7 дней стал глючить интернет на некоторых ПК с разными ОС....

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

Решение

SakurasouCat, У вас клиент конектится к серверу только один раз при загрузке формы, в методе Client_Form_Loaded. А сервер разрывает соединение после первого сеанса обмена данных: accept_socket.Close();
Следовательно, когда ваш клиент пытается во второй раз обратиться к серверу, соединение уже разорвано.

Нужно либо клиенту конектится каждый раз при обращении к серверу (я бы так и сделал). Либо же серверу не нужно обрывать связь после первого обмена данными.
1
0 / 0 / 0
Регистрация: 26.11.2015
Сообщений: 14
16.12.2015, 11:59  [ТС]
Когда я так делаю, то выбивает что "Сделан запрос на подключение для уже подключенного сокета 127.0.0.1:10"

Добавлено через 16 минут
Сделал так :
Сторона клиента :
Кликните здесь для просмотра всего текста
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
55
56
57
58
59
60
public partial class MainWindow : Window
{
 
    private Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.IP);
    private BinaryWriter binarywriter;
    private bool socket_flag = false;
    
    public MainWindow()
    {
        InitializeComponent();
    }
 
    private void log_Click(object sender, RoutedEventArgs e)
    {
        if (socket_flag)
        {
            this.socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.IP);
            socket_flag = false;
        }
 
        string data = "";
        try
        {
            this.socket.Connect(new IPEndPoint(IPAddress.Loopback, 10));
            this.binarywriter = new BinaryWriter(new NetworkStream(this.socket));
            if (this.socket.Connected)
            {
                this.binarywriter.Write(1);
                this.binarywriter.Write(login.Text);
                this.binarywriter.Write(password.Password);
                int size = 0;
                byte[] buffer = new byte[1024];
                
                size = socket.Receive(buffer);
                data = Encoding.UTF8.GetString(buffer);  
                MessageBox.Show(data);
            }
            else
            {
                MessageBox.Show("Connection error");
            }
 
        }
        catch (IOException ex)
        {
            MessageBox.Show(ex.Message);
        }
        catch (SocketException es)
        {
            MessageBox.Show(es.Message);
        }
        finally
        {
            socket_flag = true;
            socket.Shutdown(SocketShutdown.Both);
            socket.Close();
        }
    }
 
}

Теперь все хорошо, но зависает на принятие байтов со стороны сервера когда посылаешь второй раз на этом месте :
C#
1
size = socket.Receive(buffer);
0
Эксперт .NETАвтор FAQ
 Аватар для Storm23
10427 / 5157 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
16.12.2015, 12:06
SakurasouCat, У вас отправка и прием сообщений в принципе неправильно сделан.
Нельзя посылать строки просто так. Нужно сначала посылать размер строки (в байтах), а потом сервер/клиент должен читать данные до тех пор, пока не прочтет нужное числ байт.
Ну и метод socket.Receive тоже применяется неправильно. Он НЕ гарантирует чтение всей строки целиком. Он читает столько байт, сколько успел принять до данного момента.
Почитайте про принципы TCP и посмотрите правильные примеры передачи данных через него.

PS Вернее даже не так. Отправлять через BinaryWriter - допустимо. Но почему же вы принимаете через socket.Receve а не через BinaryReader ?
1
0 / 0 / 0
Регистрация: 26.11.2015
Сообщений: 14
16.12.2015, 12:08  [ТС]
Уже все сделал, спасибо. Может кому-то еще нужно будет, оставляю рабочий код :
Сторона сервера :
Кликните здесь для просмотра всего текста
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
55
56
57
class Program
{
    static List<string> user = new List<string> { "admin 1", "user qwerty", "host yyyyysha" };
 
    static private Socket socket, accept_socket;
    static private bool login_flag;
    static private BinaryReader binaryread;
 
    static void Main(string[] args)
    {
        login_flag = false;
        socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.IP);
        socket.Bind(new IPEndPoint(IPAddress.Any, 10));
        socket.Listen(10);
        while (true)
        {
            try
            {
                accept_socket = socket.Accept();
                binaryread = new BinaryReader(new NetworkStream(accept_socket));
                switch (binaryread.ReadInt32())
                {
                    case 1:
                        if (Login_Server(binaryread.ReadString(), binaryread.ReadString()))
                            accept_socket.Send(Encoding.UTF8.GetBytes("Ви успішно залогінились!"));
                        else
                            accept_socket.Send(Encoding.UTF8.GetBytes("Не вірний логін/пароль!"));
                        break;
                }
            }
            catch (SocketException e)
            {
                Console.WriteLine(e.Message);
            }
            finally
            {
                accept_socket.Shutdown(SocketShutdown.Both);
                accept_socket.Close();
            }
        }
    }
 
    static private bool Login_Server(string login, string password)
    {
        foreach (string key in user)
        {
            string[] arr_key = key.Split(' ');
            if (arr_key[0].Trim(' ') == login.Trim(' ') && arr_key[1].Trim(' ') == password.Trim(' '))
            {
                Console.WriteLine("User : { [Login = " + login + "] [Pass = " + password + "] } = Login!");
                login_flag = true;
                break;
            }
        }
        return login_flag;
    }
}

Сторона клиента :
Кликните здесь для просмотра всего текста
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
public partial class MainWindow : Window
{
 
    private Socket socket;
    private BinaryWriter binarywriter;
    
    public MainWindow()
    {
        InitializeComponent();
    }
 
    private void log_Click(object sender, RoutedEventArgs e)
    {
        this.socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.IP);
        
        string data = "";
        try
        {
            this.socket.Connect(new IPEndPoint(IPAddress.Loopback, 10));
            this.binarywriter = new BinaryWriter(new NetworkStream(this.socket));
            if (this.socket.Connected)
            {
                this.binarywriter.Write(1);
                this.binarywriter.Write(login.Text);
                this.binarywriter.Write(password.Password);
                int size = 0;
                byte[] buffer = new byte[1024];
                
                size = socket.Receive(buffer);
                data = Encoding.UTF8.GetString(buffer);  
                MessageBox.Show(data);
            }
            else
            {
                MessageBox.Show("Connection error");
            }
 
        }
        catch (IOException ex)
        {
            MessageBox.Show(ex.Message);
        }
        catch (SocketException es)
        {
            MessageBox.Show(es.Message);
        }
        finally
        {
            socket.Shutdown(SocketShutdown.Both);
            socket.Close();
        }
    }
}
0
Эксперт .NETАвтор FAQ
 Аватар для Storm23
10427 / 5157 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
16.12.2015, 12:14
Цитата Сообщение от SakurasouCat Посмотреть сообщение
оставляю рабочий код
Нет, он не рабочий. Когда вы попытаетесь отправлять сообщения действительно через сеть (а не на 127.0.0.1) и строки будут побольше - вы убедитесь, что он не работает.
1
0 / 0 / 0
Регистрация: 26.11.2015
Сообщений: 14
16.12.2015, 12:16  [ТС]
PS Вернее даже не так. Отправлять через BinaryWriter - допустимо. Но почему же вы принимаете через socket.Receve а не через BinaryReader ?
Потому что когда посылаю с сервера --> клиенту получаю такое = "Чтение после конца потока невозможно."

Добавлено через 1 минуту
Нет, он не рабочий.
А как сделать правильно ? Потому-что начали учить только вот вчера сокеты, толком ничего учитель не объяснил, а дз на сегодня сдать нужно.
0
Эксперт .NETАвтор FAQ
 Аватар для Storm23
10427 / 5157 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
16.12.2015, 13:16
SakurasouCat, Ну так замените хотя бы socket.Receive(buffer); на binaryread.ReadString() (так же как вы в сервере принимаете строку). Ну это так, что бы сдать
А что бы разобраться - книжки читать нужно, я вам в одну строчку не объясню как сетевой стек работает.
1
0 / 0 / 0
Регистрация: 26.11.2015
Сообщений: 14
16.12.2015, 13:34  [ТС]
Я так и делаю в итоге ошибка - "Чтение после конца потока невозможно."
0
Эксперт .NETАвтор FAQ
 Аватар для Storm23
10427 / 5157 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
16.12.2015, 13:41
Цитата Сообщение от SakurasouCat Посмотреть сообщение
Я так и делаю в итоге ошибка - "Чтение после конца потока невозможно."
Приведите полностью код (а лучше весь проект целиком).
0
0 / 0 / 0
Регистрация: 26.11.2015
Сообщений: 14
16.12.2015, 13:53  [ТС]
Прикрепил проект. ConsoleAplication 3 - сервер. Sokcet_User - клиент.
Вложения
Тип файла: zip Projects.zip (27.4 Кб, 10 просмотров)
0
Эксперт .NETАвтор FAQ
 Аватар для Storm23
10427 / 5157 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
16.12.2015, 16:53
SakurasouCat,
1) Ну и где там BinaryReader? Там по прежнему socket.Receive в клиенте.
2) Ошибка "Чтение после конца потока невозможно" у меня нигде не выпадает. Данные посылаются и принимаются во второй раз успешно.
1
0 / 0 / 0
Регистрация: 26.11.2015
Сообщений: 14
16.12.2015, 17:06  [ТС]
Можете код привести как вы сделали ? Может я что-то не так делал...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
16.12.2015, 17:06
Помогаю со студенческими работами здесь

Не удается установить соединение с удаленным помощником, не удается сопоставить DNS-имя удаленного компьютера.
Здравствуйте.Пытаюсь подключиться к другому компу через приглашение по удалённому помощнику и в процессе соединения пишет: &quot; Не...

Соединение по IP (сокеты)
Здравствуйте, есть программа клиент-сервер написанная на сокетах. Запуская на 1 компе и клиент и сервер, все отлично работает. Но может кто...


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
BOINC: 22 года — и всё ещё работает
Programma_Boinc 12.03.2026
BOINC: 22 года — и всё ещё работает Дэвид Андерсон написал ретроспективу. Кратко: в 2001 году он ушёл из United Devices, где был CTO, и за несколько месяцев написал ядро BOINC — клиент, сервер,. . .
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru