Я использую вызов select и принимаю соединение от «X» ни одного из клиентов.
Я установил дуплексное соединение, то есть сервер с клиентом и клиент с сервером.
Когда будет установлено соединение между двумя объектами, я собираюсь отправить
данные кусками от одного объекта к другому.
Во время отправки я читаю один файл кусками и отправляю данные кусками.
while(file_size !=0)
{
read_bytes = read(fd, buff, sizeof(buff));
cnt_ = send(_sock_fd,buff,actually_read,0);
file_size = file_size - cnt_;
printf("total sent remaining %d : %d\n",size,actually_read);
}
на стороне приемника
// Сначала я отправляю заголовок, который содержит размер, он был принят нормально, но во время следующего вызова send я использовал "get_readable_bytes" (используя ioctl), который возвращает мне количество байтов, полученных в сокете
`while (размер! = 0)
{
int test_ = 0;
while(((cnt_= get_readable_bytes(_sock_fd))== 0) )//&& test_ == 0
{
cnt_= get_n_readable_bytes(_sock_fd);
printf("Total bytes recved %d\n",cnt_);
//test_ = test_ + 1;
}
while(cnt_ != 0)
{
actually_read = recv(_sock_fd, buff, sizeof(buff),0);
int _cnt = get_n_readable_bytes(_sock_fd);
printf("Total bytes recved %d\n",cnt_-_cnt);
write(_fd,buff,actually_read);
cnt_ = cnt_ - actually_read;
test_ = 0;
}
`Теперь проблема в том,
1. Во время этого выполнения функции управления приемом автоматически переходят к функции выбора, и он пытается выполнить всю функцию приема снова, так что есть ли способ синхронизировать отправителя и получателей так, чтобы, когда отправитель завершил, запустил приемник или как только отправитель запустился получатель ?
2. И как мне вести подсчет отправленных и полученных байтов.
и это мой выборочный звонок
`is_read_availble = select(maxfd + 1,&read_set,NULL,NULL,&timeout)`
с тайм-аутом 10сек.