Поведение сокетов
зависит от реализации.В целом, когда вы отправляете (), нет гарантии, сколько байтов будет помещено в сокет.Так как ядро контролирует это, оно может быть любым числом, обычно в диапазоне 1500 или меньше.Итак, вам нужно проверить код возврата send () и продолжать помещать данные в сокет, пока вы не закончите.В этом примере предполагается, что вы уже установили неблокирование сокета с помощью:
fcntl(s, F_SETFL, O_NONBLOCK);
int sendall(int s, char *buf, int *len)
{
int total = 0; /* how many bytes we've sent */
int bytesleft = *len; /* how many we have left to send */
int n=0;
int retries=0;
struct timespec tp={0,500};
while(total < *len)
{
n = send(s, buf+total, bytesleft, 0);
if (n == -1)
{
/* handle errors here,
plus check for EWOULDBLOCK
and then nanosleep()
*/
}
total += n;
bytesleft -= n;
}
Чтобы ответить на ваш вопрос - нет ограничений, вы просто не можете отправить все свои данные одним вызовом send ().