выберите сокет вызова отправить и синхронизировать recv
Я использую вызов 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);
}
в то время как на стороне получателя // Сначала я отправляю заголовок, который содержит размер, он был принят нормально, но во время следующего вызова отправки я использовал "get_readable_bytes" (используя ioctl), который возвращает мне количество байтов, полученных в сокете `while (size! = 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сек