send(2)
по умолчанию возвращается только тогда, когда все данные были успешно скопированы в буферы отправки. Возможные способы заставить его отправлять меньше байтов сильно зависят от обстоятельств.
Если вы 1. можете получить доступ к сокету 2. не хотите изменять поведение всех вызовов на send
в связанном двоичном файле ,
тогда вы можете установить неблокирование сокета. Затем вызов send
отправит как можно больше октетов. Количество отправляемых октетов зависит в основном от объема свободной памяти в буфере отправки сокета, на который вы хотите отправить. Таким образом, если вы получили
uint8_t my_data[NUM_BYTES_TO_SEND] = {0}; /* We don't care what your buffer actually contains in this example ... */
size_t num_bytes = sizeof(my_data);
send(fd, my_data, num_bytes);
и хотите, чтобы send
отправил меньше num_bytes
, вы можете попытаться уменьшить буфер отправки вашего сокета fd
. Возможно ли это, как выполнить sh, это может зависеть от вашей ОС.
В разделе Linux вы можете попытаться уменьшить буфер отправки, установив размер буфера вручную, используя setsockopt(2)
через опция SO_SNDBUF
, описанная в man-странице `socket (7):
uint8_t my_data[NUM_BYTES_TO_SEND] = {0};
size_t num_bytes = sizeof(my_data);
size_t max_bytes_to_send = num_bytes - 1; /* Force to send at most 1 byte less than in our buffer */
/* Set the socket non-blocking - you should check status afterwards */
int status = fcntl(fd, F_SETFL, fcntl(fd, F_GETFL, 0) | O_NONBLOCK);
/* reduce the size of the send buffer below the number of bytes you want to send */
setsockopt (fd, SOL_SOCKET, SO_SNDBUF, &max_bytes_to_send, sizeof (size_t));
...
send(fd, my_data, num_bytes);
/* Possibly restore the old socket state */
Возможно, вам также придется возиться с опцией SO_SNDBUFFORCE
.
Дополнительная информация для
В любом случае, лучший способ для go для вас зависит от обстоятельств. Если вы ищете надежное решение для проверки кода, к которому вы, возможно, даже не можете получить доступ, но можете динамически ссылаться на ваш проект, вы можете go воспользоваться другим подходом, предложенным здесь: затемните символ send
в скомпилированном коде. С другой стороны, это повлияет на все вызовы send
в вашем коде (вы, конечно, можете обойти эту проблему, например, если ваша замена send
будет зависеть от некоторых флагов, которые вы можете установить).
Если вы можете получить доступ к сокету fd и хотите, чтобы на него влияли только определенные вызовы c send
(как я полагаю, это касается вас, поскольку вы говорите о модульных тестах и проверке на отправку меньшего количества байтов чем ожидалось во всех ваших тестах, вероятно, не то, что вы хотите?), тогда путь к уменьшению буфера отправки может быть способом к go.