Вероятность нахождения такого исходника невелика. Поэтому попробую подтолкнуть к одному из вариантов:
Нужно писать отдельный поток (это Вы уже определили) на передачу файла. Причем - гораздо выгоднее писать один поток для 2х действий (что бы не зависал клиент не только получателя но и отправителя) - передача и прием файлов, которые вызываться будут в зависимости от поступившей на основной сокет команды. Этот поток должен содержать свой сокет (или основной сокет переводить на режим совместимости с потоками. Давно не баловался - нюансов не помню).
В итоге должна быть примерно следующая схема:
1.При попытке отправить файл - стартует поток с задачей "отправить файл", порт сокета рекомендуется использовать отличный от "коммуникационного". Клиент-отправитель направляет по коммуникационному порту запро на принятие файла
2.Клиент-получатель при получении запроса на принятие файла стартует поток с задачей "получить файл" (в качестве параметров можно использовать ip адрес клиента-отправителя и порт). Далее уже поток направляет запрос о том, что "готов принять файл" и готовит сокет для принятия файла
3.Клиент-отправитель при получении запроса о принятии файла - "стартует" передачу.
В дополнение можно прикрутить кучу дополнительных плюшек в виде формы с отображением процесса передачи, проверка CRC по завершению передачи для фиксирования целостности файла, при нарушении CRC - повторная попытка передать файл и многое другое, чего душе угодно.
В общем, поскольку с сетями по всей видимости разобрались - достаточно почитать немного литературы об организации потоков. Так же хочу предупредить - локализация ошибок в потоках бывает довольно сложным занятием, будьте внимательны к мелочам.
|