| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Общие вопросы > передача файлов через сеть |
| Автор: gabriil 20.8.2006, 13:10 |
| вобщем я пишу прогу на языке СИ,цель которой копиревать фаил с одного компа на другой. проблема в том что программа работает на ура уменя на компютере,но когда прошу друга про тестить она отказывает. вот мой сокет socket(AF_INET, SOCK_STREAM, 0) чтобы отослать фаил я открываю его так fopen(c,"rb") далее я записываю в массив 1024 байта,отсылаю его сайз а затем сам стринг send(l,c,sizeof©, 0) между двомя отсылками стоит параметр слип. затем ваил повторяется,до тех пор пока не дошел до EOF,затем посылается сайз остатка и сам остаток файла. затем посылается "done" при виде которого клиент заканчивает принятие. вот как я и говорил,уменя на машине всё работает,копирует любой фаил,но когда пытаюсь сделать тоже самое через сеть он принимает только четверть. тоесть сервер говорит что отсылает 1024 байта а клиент принимает 0,каждый четвёртый стринг клиент принимает нормально. у когонить есть понятие почему происходит такая каша? |
| Автор: Romikgy 20.8.2006, 14:42 |
| весь код в студию и клиента и сервера (сдобреного кнопачками "код") |
| Автор: gabriil 20.8.2006, 14:56 | ||||
|
| Автор: Romikgy 20.8.2006, 15:16 |
| gabriil, в дальнейшем , если шлешь 2 файла потрудись их разбить на 2 кода, читать легче |
| Автор: Romikgy 20.8.2006, 15:36 | ||
| имхо код написан корявенько нашел пару крупную ошибку в клиенте
знаешь че у тя будет при первом сравнении в while ? и вообще отсылай все строки с завершающим 0 сзаду, дабы потом проблем не было Добавлено @ 15:37 gabriil, уже краще |
| Автор: gabriil 20.8.2006, 15:58 |
| а разве memset не обнуляет автоматом масив? а тот кусочек кода это всеголишь принятие имени файла,эта ошибка не влияет на мою проблему.(наверное) но я исправил спс. а не аккуратно,это потомучто я полный наб. а может быть чисто теоритически,какие проблемы могут быть в передачи через инет,которых не может быть в передачи на одном компе. а вобще когджа запускаешь сервер и клиент на одном компе то нужно подключение к инету? |
| Автор: gabriil 20.8.2006, 20:12 |
| да хотябы один вобще мистика одна |
| Автор: Rockie 21.8.2006, 00:45 | ||
что значит "отказывает"? пишет что не может найти dll/bpl? или запускается и не работает. Для певого случая: Если компилятор BCB: Project->Options->Linker снять галку use Dynamic RTL Project->Options->Packajes->Build with runtime packajes снять галку Project->Options->Compiler жмешь Release Если компилятор VC то можно почитать http://forums.realcoding.net/lofiversion/index.php?t13011.html |
| Автор: gabriil 21.8.2006, 03:53 | ||||||
|
| Автор: gabriil 21.8.2006, 04:20 |
| прошу прощения!!! не четверть! с разными фалами по разному,если фаил маленький то примерно четверть,если больше то скакогото момента клиент начинает принимать место 1024 битов просто 24 бита.(каждая третея-четвёртая строка,остальные как и раньше НОЛЬ) |
| Автор: kirjanov 21.8.2006, 10:41 |
| gabriil, вообще че-то не пойму, ты тспользуешь SOCK_STREAM и UDP функциии. Ты лучше определись, UDP у тебя или TCP |
| Автор: Romikgy 21.8.2006, 11:00 |
это где ? Добавлено @ 11:05 gabriil, попробуй покурить это http://www.sources.ru/cpp/cpp_pb_sockets.shtml а то у тя в коде слишком много ошибок , меня лично захарило править ошибки, у мя теряются первые байты , где ты мешаешь и что делаешь типа размер передаешь и сами данные передаешь , это все может смешатся в кучу, так что кури выше приведеную ссылку |
| Автор: gabriil 21.8.2006, 12:25 | ||
upd хз где,ткните пальцем я исправлю. за ссылку спс,но к сожалению я понимаю только язык Си,всё что включает в себя "::" для меня дремучий лес. а почему это может смешаться в кучу? |
| Автор: Romikgy 21.8.2006, 12:57 |
| потому как вывод в сокет , имхо, действует наподобии вывода в файл , и вот если ты быстро передаешь и текст и данные , в разных send ' ах , они могут прийти и принятся одним recv еще один вариант не передавать сразу весь файл и пусть сокет сам его фрагментирует Добавлено @ 13:07 а выучить? |
| Автор: gabriil 21.8.2006, 13:21 | ||
уменя по этому поводу были соображения.чтобы избежать этой проблемы я поставил Слип.но также можно попробывать запросить от клиента конформацию получения,типо сэнд размер - рисив конфармэйшин - сэнд стринг - рисив конфармэйшин. также попробую передать фаил одним блоком,хотя не знаю как это возможно... если фаил весит 10 мб то придётся аллокиревать массив на 10мб(это вобще можно?!),а если фаил весит 100мб?! а нащёт выучить,дак вот учу пока Си,и так уже перешел с Борланд Си на Дев++,маюсь вторую неделю без clrscr() |
| Автор: Romikgy 21.8.2006, 15:06 | ||
при этом ты собираешься так файл читать?
ты хоть представляешь сколько он времени будет так читатся? имхо можно главное что б у тя памяти хватило, или юзай файлы спроецированые в память хорошая среда , но средства отладки там |
| Автор: ptr 21.8.2006, 15:41 |
| recv возвращает только то, что есть в данный момент в буфере. Он конечно может быть и виноват. Но проблема не в нём, а в криво написанном коде Бесполезное решение. А разница? Можно то можно, но нужно ли |
| Автор: Romikgy 21.8.2006, 19:34 |
от аффтара зависит разделять потом! |
| Автор: ptr 22.8.2006, 05:37 |
Не понял. Потом это когда? |
| Автор: gabriil 22.8.2006, 07:32 |
| ptr,я язык знаю совсем поверхностно,поетаму уменя средств подойти с другой стороны не так много. где именно в этой программе чтото не так. и это чтото не так,теоритически плохо или реализовано криво? п.с. потОм или пОтом? |
| Автор: Romikgy 22.8.2006, 09:36 |
после приема |
| Автор: bel_nikita 22.8.2006, 09:40 |
| Народ! Протокол FTP еще никто не отменял |
| Автор: ptr 22.8.2006, 12:09 | ||
Ну а что тогда с сокетами связался. Да везде. И то и другое. gabriil, я могу поправить программы, но они будут сильно отличаться от того, что есть сейчас. Romikgy, я не то процитировал |
| Автор: gabriil 22.8.2006, 12:15 | ||
с чегото начинать надо |
| Автор: ptr 22.8.2006, 12:23 |
Сокеты - не лучший выбор. |
| Автор: Romikgy 22.8.2006, 12:26 |
и что не так? |
| Автор: ptr 22.8.2006, 15:00 |
Да нет всё нормально. Только что это изменит? |
| Автор: Romikgy 22.8.2006, 15:03 |
ни ля ля не понял, дафай пополочкам, что и где изменит (всю мысль давай, а не частями) |
| Автор: ptr 22.8.2006, 15:17 |
| Ладно проехали |
| Автор: gabriil 22.8.2006, 20:13 | ||||
почему это ничего не даст,где конкретно ошибка? теоритически план пересылки распиши пожалуйста.
а что лучше? я изучил книгу дейтелов "как программиревать на Си" и в школе немного прошел. сейчас считаю что пора начать работу с сетью,а затем переходить на функции виндуса. |
| Автор: Romikgy 23.8.2006, 10:00 | ||
имхо всегда делается наоборот хотя он и сложнее |