сокеты — C ++ ограничивает данные по TCP-соединению

Я написал простую tcp/ip соединение между клиентом и сервером в localhost в c++, Он передает через TCP / IP массив unsigned char, Размер этого массива следующий:

unsigned char *bytes = (unsigned char*)malloc(sizeof(unsigned char)*96000000);

//array is filled

Однако, когда я пишу на сокете

    n = write(sockfd,bytes,96000000);
if(n<0){
cout << "error writing"<< endl;
exit(1);
} else{
cout << "bytes written " << n <<endl;
}

количество записанных байтов ( n переменная), что стандартный вывод выводится 5196978 и не 96000000 как я и предполагал. Зачем? есть ли ограничение на количество байтов, которые я могу записать в TCP /IP связь? Как я могу решить эту проблему?

0

Решение

есть ли ограничение на количество байтов, которые я могу записать в соединении TCP / IP? Как я могу решить эту проблему?

Да — ваш стек TCP (вероятно, часть вашей операционной системы) просто не позволит вашему приложению ставить в произвольном порядке произвольный объем данных, потенциально занимая абсурдные объемы буферной памяти вне вашего приложения. Вместо этого он имеет ограниченный размер буфера, и после того, как он будет заполнен, вы должны будете зацикливаться и помещать в буфер больше данных — путем дальнейших вызовов write — после того, как некоторые действительно были отправлены по сети. Итак — зациклите и повторите отправку с того места, где предыдущая отправка остановилась: если ваш сокет не был установлен неблокирующим, вызов будет блокироваться до тех пор, пока не будет доступно больше буферного пространства.

2

Другие решения

Зачем?

Там может быть несколько причин. Там может быть какое-то физическое ограничение (аппаратное обеспечение). Буфер клиента может быть заполнен. Какой-то предел реализации мог быть достигнут. Какой-то сигнал мог быть получен.

есть ли ограничение на количество байтов, которые я могу записать в соединении TCP / IP?

Предел составляет около 2 ^ 32 байта.

Как я могу решить эту проблему?

Следите за тем, сколько отправлено с каждой записью, и продолжайте запись, пока все в буфере не будет записано.

Я не добавил образец, так как на первый вопрос можно было бы ответить, проверив документацию на write (), на второй можно было бы получить быстрый поиск, а на третий вопрос уже есть много примеров.

0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector