Добрый день. У меня такой вопрос стал. Можно ли из одного сокета параллельно читать данные и писать в него?
Мне конечно кажется что этого нельзя делать. Я поняла что сам сокет это файл в который ведется запись и из которого производится чтение. И во время выполнения этих операций доступ к этому файлу блокируется. Поправьте меня, пожалуйста, если я не правильно поняла. Я написала простенький сервер и клиента. На мой сервер может подключаться по нескольку клиентов и общаться между собой. Пока что само общение клиентов не реализовано, но реализовано общение с сервером. Передо мной стал вопрос что делать в следующей ситуации:
Клиент А хочет передать клиенту B файл. Сервер постепенно выполняет чтение присылаемых данных файла от клиента A. Но в это время другий 2 клиента D и C шлют простый сообщение клиенту A.
Как мне одновременно читать из сокета данные и передать сообщения на этот же сокет.
Соединение с клиентом я устанавливаю так:
int ns; // идентификатор соединившегося сокета
/*Принимаем входящий запрос*/
if ((ns = accept(s, (struct sockaddr *)&clnt_addr,&addrlen)) == -1)
{
std::perror("Ошибка вызова accept()\n");
std::exit (-1);
}
else
std::printf ("%s","\nЗапрос на connet принят. Обработка...\n");
Полученный идентификатор сокеты при успешном соединении я добавляю в массив и в другом потоке опрашиваю массив сокетов с помощью функции select на наличие данных для чтения. При поступлении этих данных я планирую выбирать из пула потоков свободный поток и считытвать данные из сокета уже в другом потоке.
Хотела сделать так: свободный из пула потоков не только считывает данные из переданного ему сокета, но и пересылает их другому клиенту.
Но сейчас задумалась над тем, а что если сокета того клиента которому нужно послать сообщение сейчас занят?
И занят надолго? Например получение файла происходит. Как мне тогда передать сообщение?
Может кто знает как это реализовано в скайп? Ведь там во время передачи файла возможно и общение со многими контактами.
Помогите, пожалуйста мне разобраться в этом.
Пишу под Linux.