Я работал над приложением для загрузки файлов, где сервер непрерывно ожидает новых запросов на подключение от клиентов, когда приходит новое подключение, сервер принимает это подключение и создает новый процесс для обслуживания клиента, недавно подключенного к серверу.Клиенты могут запросить загрузку нескольких файлов с сервера.Для каждого файла стороны клиента и сервера создают новый поток, и передача данных для каждого файла должна выполняться между соответствующими парами потоков сервера и клиента.Я использую C и pthread для потоков.У меня сейчас стабильное сокетное соединение и успешное создание процесса для каждого клиента.
Для потокового файлового трансфера я попытался сделать следующее:
В клиенте я создаю потоки, которые запускают метод для получения файлов:
int k;
for (k = 0; k < fNameCounter; k++)
{
pthread_t thread_id;
int status = pthread_create(&thread_id, NULL, &receiveFile, fName );
if (status != 0)
{
printf("Thread Creation Failed \n");
exit(0);
}
}
Аналогично вна стороне сервера, я создаю такое же количество потоков, как показано ниже:
int k;
for (k = 0; k < fnameCounter; k++)
{
pthread_t thread_id;
int status = pthread_create(&thread_id, NULL, &sendFile, fName );
if (status != 0)
{
printf("Thread Creation Failed \n");
exit(0);
}
}
Функции sendFile и receiveFile просто записывают и считывают байты файлов, указанных в fName (как вы можете видеть в pthread_create) по сокету, в этот моментУ меня есть серьезная проблема:
В этой программе, насколько я думал, могут быть проблемы с тем, что содержимое файлов может отличаться после того, как все потоки завершат получение данных с сервера, потому что функции sendFile и readFile просто читаютиз сокета и пишет в сокет.
Как я могу гарантировать, что каждый поток клиента получает правильные данные из соответствующего потока сервера, как я объяснил ниже:
receive send
cthread1 ----> a.txt <----- sthread1
cthread1 ----> a.txt <----- sthread1
cthread1 ----> a.txt <----- sthread1
ps Мне известно, что при создании многих потоководин сокет не имеет смысла, но это мой hw, и мне нужно сделать так: /.
С уважением.