выберите сокет вызова отправить и синхронизировать 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сек

Ответы на вопрос(1)

Ваш ответ на вопрос