|
15 / 15 / 2
Регистрация: 20.11.2009
Сообщений: 452
|
|||||||||||
Сокеты отправка сообщений при перессылке файлов31.05.2011, 15:37. Показов 2315. Ответов 18
Метки нет (Все метки)
Нужно переслать файлы с клиента на сервер.
сама пересылка идет. Не получается передать имена. Их решил передавать обычным сообщением По наблюдениям ошибка в клиенте. у клиента возникает ошибка Program has been terminated receiving signal 13 (Broken pipe) код сервера
0
|
|||||||||||
| 31.05.2011, 15:37 | |
|
Ответы с готовыми решениями:
18
ICQ отправка сообщений через сокеты
Сокеты. Отправка сообщений всем клиентам или только одному |
|
1259 / 650 / 44
Регистрация: 06.02.2011
Сообщений: 1,654
|
|
| 31.05.2011, 16:31 | |
|
У вас же socket(AF_INET, SOCK_STREAM, 0) соответственно сервер сначала должен сделать accept, а потом уже принимать данные, будет ли это read/recv/recvfrom/recvmsg не важно. Для клиента все тоже самое - сначала connect(), потом отправка.
0
|
|
|
15 / 15 / 2
Регистрация: 20.11.2009
Сообщений: 452
|
|||||||||||
| 31.05.2011, 17:03 [ТС] | |||||||||||
|
Имя файла передалось. Но срывается сама передача
Код сервера
Код клиента
результат выданный сервером 1.tar.gz1635003953 Left to read: 1635003953 Left to read: 1635003701
0
|
|||||||||||
|
15 / 15 / 2
Регистрация: 20.11.2009
Сообщений: 452
|
|
| 31.05.2011, 17:26 [ТС] | |
|
я не совсем понимаю как отделить имя файла от самих данных?
вбить после имени какие-либо символы и их ловить на сервере? но это будет огород
0
|
|
|
1259 / 650 / 44
Регистрация: 06.02.2011
Сообщений: 1,654
|
|
| 31.05.2011, 17:33 | |
|
Не, "огород" это то что вы пытаетесь изобразить.
Сделайте например так: Клиент: FILE размер имя\n Сервер: OK/ERR\n Клиент: данные Сервер: OK/ERR\n Если же вам очень хочется бинарный протокол то так: Клиент:uint8_t name_len; off_t file_size; char name[name_len]; data Сервер: recv()/close()
0
|
|
|
15 / 15 / 2
Регистрация: 20.11.2009
Сообщений: 452
|
|
| 31.05.2011, 17:46 [ТС] | |
|
все равно не понял как сервер "поймет" что имя файла ему уже передано если оно меньше 256?
0
|
|
|
1259 / 650 / 44
Регистрация: 06.02.2011
Сообщений: 1,654
|
|
| 31.05.2011, 17:56 | |
|
В разделе для начинающих вам наверное с удовольствием объяснят как из строки типа "XXX размер имя\n" выдернуть и проверить на валидность размер и имя...
Если же вы про вариант с бинарным протоколом, то длину имени клиент передает первым байтом...
1
|
|
|
15 / 15 / 2
Регистрация: 20.11.2009
Сообщений: 452
|
|
| 31.05.2011, 18:16 [ТС] | |
|
выделить я и сам могу.
я про ситуацию когда серверу передались все символы а он продолжает ожидать все до 256. вот что меня смущает. Посылка сообщения от клиента со знаком завершения не спасает
0
|
|
|
1259 / 650 / 44
Регистрация: 06.02.2011
Сообщений: 1,654
|
|
| 31.05.2011, 18:25 | |
|
А зачем он продолжает чего-то ждать то?
Если вы считаете что recv(,, 255, 0) будет ждать пока в буфере появиться именно 255 байт, то это ни так (по крайней мере если не играться с SO_RCVLOWAT). В конце концов, если не можете иначе, делайте: recv(, &namelen, 1, 0); recv(, &filesize, sizeof(off_t), 0); recv(, name, (size_t)namelen, 0); Не эффективно да, но вам наверное не важно.
0
|
|
|
15 / 15 / 2
Регистрация: 20.11.2009
Сообщений: 452
|
||
| 31.05.2011, 18:51 [ТС] | ||
|
1.tar.gz\n1635003953 Left to read: 1635003953 Left to read: 1635003701 те клиент выслал одни данные, завершил строку начал высылать другие. но сервер не воспринял завершение?
0
|
||
|
1259 / 650 / 44
Регистрация: 06.02.2011
Сообщений: 1,654
|
|
| 31.05.2011, 19:32 | |
|
Что отправили, то и получили. Почему вы решили, что recv() как-то должен реагировать на "завершил строку" я не знаю. Если вас сильно смущает, что отдельные send() "склеиваются" на сервере - отключите nagle (TCP_NODELAY) на клиенте.
Хотя по-уму отправив имя и размер клиенту не плохо бы подождать какой-то реакции сервера, типа "все ok посылай" / "извиняй имя кривое/нет места на дисках/итп"... Добавлено через 16 минут Если вы про TCP_NODELEY, то это заставит клиент отправлять в сеть сразу то, что передает send() не ожидая пока данных накопится на полноценный пакет, например если делать send(,,1,0) будут отправляться пакеты с tcp_payload размер 1 байт. Но то что сервер будет их получать так же по одному не гарантирует. Перечитал весь топик еще раз: ну читаете вы 1й килобайт в чем проблема то выудить оттуда байт длины имени, размер и имя файла, а все что сверх того если же таковое имеется считать данными. Для случая если получено меньше чем 1+sizeof(off_t)+1й байт запомнить что пришло и читать дальше?
0
|
|
|
15 / 15 / 2
Регистрация: 20.11.2009
Сообщений: 452
|
|
| 31.05.2011, 19:46 [ТС] | |
|
если после получения имени от сервера придет ответ, это будет гарантировать разрыв?
0
|
|
|
1259 / 650 / 44
Регистрация: 06.02.2011
Сообщений: 1,654
|
|
| 31.05.2011, 19:50 | |
|
Да, если клиент не начнет посылать сам файл пока не прочитает этот ответ. Но сервер по любому должен быть написан так, что б не начудить при _любом_ поведении клиента.
0
|
|
|
15 / 15 / 2
Регистрация: 20.11.2009
Сообщений: 452
|
|
| 31.05.2011, 20:07 [ТС] | |
|
Попробовал сделать - теперь уперся в вопрос, как нормально передать ип клиента серверу ? те та же проблема.
клиент продолжает отправлять данные, при этом не ожидая ответ сервера
0
|
|
| 31.05.2011, 20:08 | |
|
Не по теме: мне вот любопытно стало... на сколько минимальным можно написать код передачи файлов по сети? :)
0
|
|
|
15 / 15 / 2
Регистрация: 20.11.2009
Сообщений: 452
|
|
| 31.05.2011, 20:15 [ТС] | |
|
да в сетях 0, в линуксах 0, но собственно из-за этого я и полез на форум
0
|
|
|
1259 / 650 / 44
Регистрация: 06.02.2011
Сообщений: 1,654
|
|
| 31.05.2011, 20:23 | |
|
По большому счету тут ни сети ни юниксы не причем.
Представьте, что вам нужно прочитать блок данных определенного формата в памяти или из файла и в качестве инструмента чтения у вас есть функция которая за раз читает не больше (меньше может, а больше ни-ни) чем вы ей указываете байт. И надо постараться уложиться в как можно меньшее к-во вызовов этой функции.
0
|
|
| 31.05.2011, 20:23 | |
|
Помогаю со студенческими работами здесь
19
Отправка сообщений, файлов и т.д Отправка сообщений и файлов по сети Отправка mail сообщений с вложением файлов Асинхронные сокеты: Как организовать разделение на прием сообщений и прием файлов Отправка сообщений при регистрации Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Первый деплой
lagorue 16.01.2026
Не спеша развернул своё 1ое приложение в kubernetes.
А дальше мне интересно создать 1фронтэнд приложения и 2 бэкэнд приложения
развернуть 2 деплоя в кубере получится 2 сервиса и что-бы они. . .
|
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ *
Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам
Кирхгофа, решает её и находит токи на L и напряжения на C в установ. режимах до и. . .
|
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым.
Но восстановить их можно так.
Для этого понадобится консольная утилита. . .
|
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
|
|
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
|
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11
— это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
|
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11
Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
|
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
|