Kqueue / epoll (FreeBSD / Linux) с неблокирующим сокетом: когда можно освободить буферную память после записи / отправки / отправки? - PullRequest
0 голосов
/ 23 октября 2019

У меня есть неблокирующий сокет (сокет TCP или UPD) с использованием kqueue / epoll (FreeBSD / Linux). Когда я хочу передать байты другой стороне, я могу использовать write / send / sendto. Каждый из них использует char * buffer для передачи, но я не понимаю, когда мне нужно освободить память буфера после вызова write / send / sendto.

  1. Правильно ли, что если при записи / отправке / отправке возвращается количество принятых байтов и это число равно размеру буфера, я могу немедленно освободить память буфера? Или я должен ждать событий EVFILT_WRITE (kqueue) или EPOLLOUT (Linux), чтобы освободить память буфера?
  2. Правильно ли, что при записи / отправке / отправке возвращается количество принятых байтов, и это число не равноРазмер буфера, я могу освободить только байты, принятые немедленно, и я должен ждать событий EVFILT_WRITE (kqueue) или EPOLLOUT (Linux), чтобы продолжить передачу непринятых байтов и следующих байтов? Или я должен ждать событий EVFILT_WRITE (kqueue) или EPOLLOUT (Linux), чтобы освободить память буфера и передать следующие байты?
  3. Правильно ли, что при записи / отправке / отправке возвращается EAGAIN (kqueue) или EAGAIN ||EWOULDBLOCK (Linux), я не могу освободить память буфера и мне приходится ждать события EVFILT_WRITE (kqueue) или EPOLLOUT (Linux), чтобы повторно передать те же байты?
...