К примеру у меня есть сокет, который в цикле (2 итерации к примеру) записывает данные подряд. При этом на другом конце (где этот сокет прослушивается) в это время происходит считывание. Так вот, что будет когда происходит вторая попытка записи данных в сокет, когда на другом конце еще считывается первая часть пересланых данных?
Ответ
Если сокет блокирующий и на чтение запрошено больше данных, чем Вы отправляете - будет ждать "второй итерации".
Если сокет неблокирующий - вычитает, сколько сможет, и затем Вам снова придется опрашивать сокет.
В связи с комментарием @VTT хочу дать немного более развернутый ответ.
Если вызывается одна из функций read/recv/recvfrom для блокируемого сокета и при этом в буфере нет никаких данных - сокет переходит в спящее состояние до тех пор, пока не придут какие-либо данные. Достаточно одного байта.
Тем не менее, мы можем задать флаг MSG_WAITALL - в этом случае мы будем ждать до тех пор, пока не будет доступно фиксированное (запрошенное нами) количество байт.
В случае неблокируемого сокета - если не удовлетворены условия ввода - то ф-ия вернет управление установив ошибку EWOULDBLOCK
Если вызывается одна из функций write/send/sendto - данные копируются из буфера приложения в буфер отправки сокета. Для блокируемого сокета - если в буфере отправки недостаточно места, процесс переходит в состоянии оидания до тех пор, пока это самое место не освободится.
Для неблокируемого сокета - если в буфере отправки недостаточно места - ф-ия вернет управление, установив ошибку EWOULDBLOCK
Комбинируйте и предполагайте наиболее вероятный результат того, чем же все-таки окончится посылка двух сообщений :)
Комментариев нет:
Отправить комментарий