Форум программистов, компьютерный форум, киберфорум
Наши страницы

C# для начинающих

Войти
Регистрация
Восстановить пароль
 
Jesterru
3 / 2 / 2
Регистрация: 19.06.2016
Сообщений: 266
#1

Неполадки с передачей данных по сокетам - C#

30.07.2017, 13:36. Просмотров 165. Ответов 1
Метки нет (Все метки)

Здравствуйте
Я сделал программу, которая передает по сокетам файл. Сокеты - типа Stream с протоколом TCP. Если я запускаю программу на локальном адресе (127.0.0.1), то все в порядке, файлы корректно передаются, без ошибок. Но если я передаю этот файл даже по локальной сети, то передается всего 1920 Байт. Немного изменил структуру кода, теперь передается всего 1460 байт. В чем проблемма? С чем это связано? Как это пофиксить?
Код (Меню для запуска сервера и клиента):
Кликните здесь для просмотра всего текста
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
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
Console.Clear();
Console.WriteLine("Введите 0 для режима "Сервер", 1 для режима "Клиент"");
string _choice = Console.ReadLine();
if (_choice == "0") { Server(); }
if (_choice == "1") { Client(); }
else
{
    Console.Clear();
    Console.WriteLine("Неверно выбран режим сокета");
    Console.ReadKey();
}
 
void Server()
{
    Console.Clear();
    IPEndPoint _EndIP1 = new IPEndPoint(IPAddress.Parse("192.168.1.64"), 47001);
    IPEndPoint _EndIP2 = new IPEndPoint(IPAddress.Parse("192.168.1.64"), 47002);
 
    _RecieveData();
 
    void _RecieveData()
    {
        try
        {
            String _FileName = null;
            
            Console.WriteLine("Ожидание подключений...");
 
            _RecieveFileName();
            _RecieveFileData();
 
            void _RecieveFileName()
                                {
                                    using (Socket _ServerS = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp))
                                    {
                                        _ServerS.Bind(_EndIP1);
                                        _ServerS.Listen(1);
 
                                        using (Socket _ClientS = _ServerS.Accept())
                                        {
                                            Console.WriteLine("Получение данных о файле...");
 
                                            int _Count = 0;
                                            byte[] _Buffer = new byte[256];
 
                                            do
                                            {
                                                _Count = _ClientS.Receive(_Buffer);
                                                _FileName = _FileName + Encoding.Default.GetString(_Buffer, 0, _Count);
                                            } while (_ClientS.Available > 0);
                                            Console.WriteLine("Данные о файле получены...");
                                        }
                                    }
                                }
            void _RecieveFileData()
            {
                using (Socket _ServerS = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp))
                {
                    _ServerS.Bind(_EndIP2);
                    _ServerS.Listen(1);
 
                    using (Socket _ClientS = _ServerS.Accept())
                    {
                        Console.WriteLine("Скачивание файла...");
                        using(MemoryStream _File = new MemoryStream())
                        {
                            int _Count = 0;
                            byte[] _Buffer = new byte[1];
                            do
                            {
                                _Count = _ClientS.Receive(_Buffer);
                                _File.Write(_Buffer, 0, _Count);
                            } while (_ClientS.Available > 0);
 
                            Console.WriteLine("Скачивание файла завершено...");
 
                            using (FileStream _FS = new FileStream(_FileName, FileMode.Create))
                            {
                                _File.Position = 0;
                                _File.CopyTo(_FS);
                                Console.WriteLine("Файл {0} размером {1} Байт сохранен...\n", _FileName, _File.Length);
                            }
                        }
                    }
                }
            }
 
            _RecieveData();
            
        }
        catch (Exception _ex)
        {
            Console.WriteLine(_ex);
            Console.ReadKey();
            _RecieveData();
        }
    }
}
void Client()
                {
                    Console.Clear();
                    Console.WriteLine("Введите конечный IP");
                    IPAddress _IPAddr = IPAddress.Parse(Console.ReadLine());
                    IPEndPoint _EndIP1 = new IPEndPoint(_IPAddr, 47001);
                    IPEndPoint _EndIP2 = new IPEndPoint(_IPAddr, 47002);
 
                    _TransferData();
 
                    void _TransferData()
                    {
                        try
                        {
                            Byte[] _FileName = null;
                            Byte[] _File = null;
 
                            Console.Clear();
                            Console.WriteLine("Нажмите для выбора файла...");
                            Console.ReadKey();
                            OpenFileDialog _OFD = new OpenFileDialog();
                            if ((_OFD.ShowDialog()) != DialogResult.OK)
                            {
                                Console.Clear();
                                Console.WriteLine("Не выбран файл");
                                Console.ReadKey();
 
                                _TransferData();
                            }
 
                            string[] _FileFullName = _OFD.FileName.Split('\\');
                            _FileName = Encoding.Default.GetBytes(_FileFullName[_FileFullName.Length - 1]);
 
                            using (FileStream _FS = new FileStream(_OFD.FileName, FileMode.Open))
                            {
                                _File = new Byte[_FS.Length];
                                _FS.Read(_File, 0, _File.Length);
                            }
 
                            Console.WriteLine("Обработка файла завершена. Соединение с сервером...");
 
                            using (Socket _ClientFI = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp))
                            {
                                _ClientFI.Connect(_EndIP1);
                                Console.WriteLine("Отправка информации о файле...");
                                _ClientFI.Send(_FileName);
                                Console.WriteLine("Информация о файле отправлена...");
                            }
 
                            Thread.Sleep(50);
 
                            using (Socket _ClientFD = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp))
                            {
                                _ClientFD.Connect(_EndIP2);
                                Console.WriteLine("Отправка файла...");
                                _ClientFD.Send(_File);
                                Console.WriteLine("Файл отправлен...");
                            }
 
                            Console.ReadKey();
                            _TransferData();
                        }
                        catch (Exception _ex)
                        {
                            Console.WriteLine(_ex);
                            Console.ReadKey();
                            _TransferData();
                        }
                    }
                }


Заранее пре-благодарен тем, кто помог
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.07.2017, 13:36
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Неполадки с передачей данных по сокетам (C#):

.NET 4.x Запрет запуска нескольких экземпляров приложения, с передачей данных - C#
вообщем моя проблема заключается в следующем: Я пишу музыкальный проигрыватель, столкнулся с проблемой, когда кликаю два раз по mp3 он...

Имитация функционирования упрощенной схемы идентификации с нулевой передачей данных - C#
Разработайте программу, имитирующую функционирование упрощенной схемы идентификации с нулевой передачей данных. Значения необходимых...

Неполадки с неполным обсчитыванием данных - C#
Здравствуйте! Подскажите пожалуйста, почему программа обсчитывает только до 37х37 (включительно, а дальше Результат работы с массивом ... :...

Нужна литература по сокетам - C#
Подскажите пожалуйста какую небудь литературу где описывается работа с сокетами в С#. Заранее спасибо.

Посоветуйте литературу по сокетам - C#
Посоветуйте литературу по сокетам для c#. Создание клиент серверных приложений. Желательно с примерами и нормальными объяснениями.

Передача информации по сокетам - C#
Здравствуйте. Хочу сделать клиент\сервер'ную программу, которая через сокеты через протокол TCP отправляет файлы. И у меня возникло...

1
Usaga
Эксперт .NET
3315 / 2734 / 488
Регистрация: 21.01.2016
Сообщений: 10,703
Завершенные тесты: 2
30.07.2017, 14:11 #2
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Jesterru, проблема в строке №50:

C#
1
} while (_ClientS.Available > 0);
Проверять нужно значение переменной _Count. _ClientS.Available показывает сколько байт ещё лежит в буфере и не более того.

Добавлено через 6 минут
Протокол TCP не передаёт (и никак не следит) никакую информацию о размере передаваемых данных. Размер есть только у каждого принимаемого пакета, но общий объём отправленных данных нигде не отслеживается.
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.07.2017, 14:11
Привет! Вот еще темы с ответами:

Отправка байтов по сокетам - C#
Ну вот хочу написать программу но никак не могу. Проблема в том что я хочу отправлять байты по сокетам но мне не удается ...

Прием файлов по сокетам - C#
Реализую прием файлов по сокетам. Проблема в том, что файл приходит не весь. Причем если тестирую в местной сети, то все нормально. Но...

Передача больших файлов по сокетам - C#
Как можно решить проблему? У меня на входе массив байт разного размера. Передаю по сокетам второй программе, и она принимает до byte....

Отправка POST или GET запросов по сокетам - C#
Кто то может подсказать как осушествить по сокетам передачу к примеру пост запроса с текстом ...


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru