LINUX.ORG.RU

TCP Клиент-Сервер(linux, C++)


0

1

Добрый день!Мне необходимо написать TCP клиент-сервер (linux, C++). Клиент: авторизуется на сервере и передает файл, производит реконнект при потере связи с сервером. Сервер:при корректной авторизации клиента сохраняет переданный клиентом файл на жестком диске. Не подскажете сразу по нескольким вопросам: 1. Для передачи данных необходимо установить сначала TCP-соединение.То есть, если я сначала напишу,например,TCP-клиент, запущу tcpdump , указав порт,который слушает сервер, в дампе я не увижу данных,передаваемых клиентом(напрример, логин и пароль)? 2. Каким образом можно осуществлять кодировку логина и пароля на клиенте? Например, не отображать набор пароля (**********) и передача по сети параметров авторизации в закодированном виде? 3. Каким образом сервер сможет понять,что закончился логин,начался пароль,закончился пароль и передается файл? 4. Как лучше обработать ситуацию, когда клиент передал часть файла и произошло разъединение?


Добрый день!

Мне необходимо написать TCP клиент-сервер (linux, C++).

Клиент: авторизуется на сервере и передает файл, производит реконнект при потере связи с сервером.
Сервер: при корректной авторизации клиента сохраняет переданный клиентом файл на жестком диске.

Не подскажете сразу по нескольким вопросам:
1. Для передачи данных необходимо установить сначала TCP-соединение. То есть, если я сначала напишу, например, TCP-клиент, запущу tcpdump, указав порт, который слушает сервер, в дампе я не увижу данных,передаваемых клиентом (например, логин и пароль)?
2. Каким образом можно осуществлять кодировку логина и пароля на клиенте? Например, не отображать набор пароля (**********) и передача по сети параметров авторизации в закодированном виде?
3. Каким образом сервер сможет понять, что закончился логин, начался пароль, закончился пароль и передается файл?
4. Как лучше обработать ситуацию, когда клиент передал часть файла и произошло разъединение?

// GO FOR THE EYES, BOO, GO FOR THE EYES!

anonymous
()

2. Каким образом можно осуществлять кодировку логина и пароля на клиенте? Например, не отображать набор пароля (**********) и передача по сети параметров авторизации в закодированном виде

Самый простой вариант: при подключении сервер отправляет клиенту некий рандомный токен, клиент определенным (известным для сервера) способом модифицирует пароль с помощью токена (например, просто конкатенирует их), снимает с результата хэш-сумму и отправляет серверу. Сервер в свою очередь проделывает те же операции с известным ему паролем юзера и сравнивает полученные хеши. Сошлись - значит всё ок.

3. Каким образом сервер сможет понять,что закончился логин,начался пароль,закончился пароль и передается файл?

Тут надо свой небольшой протокол придумать. Конечный автоматик накидать.

yoghurt ★★★★★
()
Ответ на: комментарий от anonymous

Ты не поверишь, но даже разбор того примитивного формата, что предложен выше, прекрасно ложится на конечный автомат

yoghurt ★★★★★
()
Ответ на: комментарий от yoghurt

Поверю, но прекрасно можно обойтись и без конечного автомата.

anonymous
()

4. сервер сообщает размер принятой части файла и контрольную сумму, клиент принимает решение

anonymous
()

Для начала прочитай про inetd. А дальше — учебник по C++. inetd возьмёт на себя сетевое взаимодействие, остальные задачи тривиальны.

i-rinat ★★★★★
()

А зачем в 2012г. это программировать вручную? Не, ну можно, конечно, но получится ли хотя бы сравнимо с scp/sftp/ftps? Или с webdav/whatever over https?

Deleted
()
Ответ на: комментарий от Deleted

То есть берем libssh2 или libcurl и программируем за день (ну, условно) то что надо. Глобально, надежно.

В перерывах читаем про конечные автоматы, ввод паролей звездочками и придумываем протоколы передачи, если уж сильно хочется

Deleted
()

1. 3. 4. http://www.ozon.ru/context/detail/id/1151795/ Полистай эту книгу я точно видел ответы на эти вопросы где-то на первых 120 страницах (дней пять назад читал)

2. Нужно смотреть литературу по информационной безопасности; если сверху планируется построить HTTP или FTP, то копай в сторону POST (самое тупое) и SFTP

tar
()

вы ещё забыли стадию идентификации: клиент и сервер должны обменяться информацией о версиях и протоколах ДО обмена токенами и начала аутентификации.

а по литературе могу только посоветовать искать (ещё советских времён) книги по темам - Эталонная модель ЭМ ВОС, Протоколы и сети передачи данных. Проектирование и моделирование протоколов. Современной грамотной литературы на русском языке по теме НЕТ.

MKuznetsov ★★★★★
()

Маша, что вы делаете в воскресенье?

Приглашаю вас к себе, на чай с плюшками и лекцию по основам сетевого программирования.
За чаем всё объясню в лучшем виде.
:D

dmitryalexeeff
()
Ответ на: комментарий от MKuznetsov

Так толсто, да еще КАПСОМ, предлагать «грамотную литературу»... и не по теме :) (Точнее, тема, наброшенная ТСом, не по той литературе - существенно не хватает метки «БЫСТРОА!» - на чтение наброшенной вами «талмудистики» (буде «технический евангелизм» не такой КАТЕГОРИЧНЫЙ - и литературы современной набросали сразу и советов, без отсылок в «протоколы советских мудрецов»:) у Маши явно нет времени (или цель не в этом - капчу гугла, видать, до сих пор разгадывает :))

slackwarrior ★★★★★
()
Ответ на: комментарий от slackwarrior

Да...Честно говоря, я все еще нахожусь в поисках ответов на свои вопросы...Сейчас листаю Дугласа...

Masha
() автор топика
Ответ на: комментарий от slackwarrior

Не подскажете, почему при запуске run из gdb моя прорамма не выполняется, а тут же завершается? gdb tcp_client.x GNU gdb Fedora (6.8-29.fc10) Copyright (C) 2008 Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html> This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. Type «show copying» and «show warranty» for details. This GDB was configured as «x86_64-redhat-linux-gnu»... (gdb) run Starting program: /home/tcp_client.x

[14]+ Stopped gdb tcp_client.x

Masha
() автор топика
Ответ на: комментарий от slackwarrior

Код программы использует закрытые библиотеки, в принципе он вряд ли что-то скажет,может быть просто у кого-о возникали подобные ситуации....Непонятно,в каких случаях это может быть...

Masha
() автор топика
Ответ на: комментарий от Masha

Код программы использует закрытые библиотеки

Гм... хозяин-барин, хотя вопрос о помощи при недостатке инфы отдает гаданием :) Клиент Х - жутко навороченный/продвинутый из продакшена, что прямиком подпадает под «раскрытие комменрческой информации» и сразу приведет к недополученной прибыли? Или это все-таки учебный пример, на котором вы шышки набиваете?

Непонятно,в каких случаях это может быть...

ulimit -c unlimited и перезапустить. Возможно gdb в корку падает от щастья при встрече с закрытыми библиотеками (поздравляю! вы нашли баг дебаггера:)) - засуньте выданную корку... например, в gdb и посмотрите ошметки стека.

slackwarrior ★★★★★
()
Ответ на: комментарий от Masha

Извините, не совсем относится к теме обсуждения,но связано с моей задачей. Не подскажете,что-нибудь в C++ типа gets, что считывало бы информацию из std, но не в char*, а в unsigned char*?

Masha
() автор топика
13 июня 2013 г.
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.