Пересылка файла по сети

  • Автор темы Korben
  • Дата начала
K

Korben

#1
Здравствуйте! Очень прошу помочь, так как неимоверно нуждаюсь в этой самой помощи. Есть исходник (прикреплен к сообщению) программы клиент-сервер, которая позволяет пересылать файл от сервера к клиенту. Реализована в одном файле, довольно-таки удобно. Но есть необходимость дополнить её следующим образом: чтобы подключаться мог не один клиент, а несколько, и чтобы сервер рассылал файл всем подключенным клиентам. Что именно нужно модернизировать и куда что дописать? Помогите пожалуйста! Я так понимаю, для того, чтобы в очереди было несколько клиентов, нужно использовать мультипоточность? Если у кого-то есть уже готовый пример, подскажите где его взять.

Заранее огромное спасибо.
 

Вложения

P

pushkin

#2
Вот кусок кода из прикольного вируса, который я когда-то в детстве писал:

Код:
  int		 from_len;	 // Длина структуры данных подключенного клиента
SOCKET	 client_socket; // Сокет клиента
sockaddr_in client_addr;  // Структура, хранящая адрес клиента

// Бесконечный цикл получения соединений
while (true)
{
// Принимаем соединения от клиентов
from_len	 = sizeof(client_addr);
client_socket = accept(m_socket, (LPSOCKADDR)&client_addr, &from_len);

// Проверяем ошибочность соединения
if (client_socket == INVALID_SOCKET)
{
// Это может быть в случае, когда один из потоков клиента закрыл серверный сокет
// Тогда эта функция возвращает ошибочный сокет и мы можем проверить, нужно ли остановить сервер
if (m_bStopServer)
{
//			MessageBox(NULL, "Сервер остановлен", "*цензура*", MB_OK);
return P_YES; // Остановка сервера
}
continue; // Если что опять переходим в режим ожидания соединения
}

// Создаем клиента передаем управление новому потоку
CPushkinServClient *cl = new CPushkinServClient();
cl->m_socket	 = client_socket;
cl->m_client_addr = client_addr;
cl->server_p	 = this;

cout << "Client connected..." << endl;

// Передаем управление новому потоку, который будет работать с этим клиентом
DWORD thread_id;
HANDLE hThread = CreateThread(NULL, 0, ChatWithClient, cl, 0, &thread_id);
}

return P_YES; // Нормальный выход
Конечно же, этот пример у вас не скомпилируется, т. к. у вас нет определений всех моих классов (CPushkinServClient,...), но в нем отображена суть. Здесь не используются никакие компоненты для работы с сетью, а только "голые" сокеты.

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

Внимание! Если очень нужно, я могу заняться этой сетевой передачей файлов вплотную и все сделать, но это только за деньги, естественно.
 
K

Korben

#3
Для: pushkin
Ну, за деньги, это за сколько?
Большая часть-то готова (в моем примере), по сути нужно просто внедрить ее. у меня времени просто мало на это - постоянно на учебе, сейчас сессия уже скоро, некогда все заняться. сколько ты хочешь за такую работу?
 
U

Uldman

#4
Здравствуйте! Очень прошу помочь, так как неимоверно нуждаюсь в этой самой помощи. Есть исходник (прикреплен к сообщению) программы клиент-сервер, которая позволяет пересылать файл от сервера к клиенту. Реализована в одном файле, довольно-таки удобно. Но есть необходимость дополнить её следующим образом: чтобы подключаться мог не один клиент, а несколько, и чтобы сервер рассылал файл всем подключенным клиентам. Что именно нужно модернизировать и куда что дописать? Помогите пожалуйста! Я так понимаю, для того, чтобы в очереди было несколько клиентов, нужно использовать мультипоточность? Если у кого-то есть уже готовый пример, подскажите где его взять.

Заранее огромное спасибо.
У меня подобная проблеиа. Не подскажешь как решил? если решил. Заранее спасибо
 
K

Korben

#5
О чорт... решил как-то да, но я уже и не помню, мужик... Я уже универ закончил как полтора года... :)
 
U

Uldman

#9
C отсылкой данных многим клиентам разобрался:) дело то было всего лишь в паре строк. Но тут сталкнулся с такой проблемой - мне нужно передать группу файлов. Кто знает как это реализовать?
 
S

Setry

#10
Когда к нему коннектится новый клиент, я запоминаю всю информацию о нем в специальном класса (CPushkinServClient) и запускаю новый поток
а вам не кажется, что создание нового потока для каждого клиента это безумная трата ресурсов?
зачем изобретать велосипед, когда можно воспользоваться асинхронными сокетами (почитайте в мсдн про WSADATA)