Я написал простую 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
связь? Как я могу решить эту проблему?
есть ли ограничение на количество байтов, которые я могу записать в соединении TCP / IP? Как я могу решить эту проблему?
Да — ваш стек TCP (вероятно, часть вашей операционной системы) просто не позволит вашему приложению ставить в произвольном порядке произвольный объем данных, потенциально занимая абсурдные объемы буферной памяти вне вашего приложения. Вместо этого он имеет ограниченный размер буфера, и после того, как он будет заполнен, вы должны будете зацикливаться и помещать в буфер больше данных — путем дальнейших вызовов write
— после того, как некоторые действительно были отправлены по сети. Итак — зациклите и повторите отправку с того места, где предыдущая отправка остановилась: если ваш сокет не был установлен неблокирующим, вызов будет блокироваться до тех пор, пока не будет доступно больше буферного пространства.
Зачем?
Там может быть несколько причин. Там может быть какое-то физическое ограничение (аппаратное обеспечение). Буфер клиента может быть заполнен. Какой-то предел реализации мог быть достигнут. Какой-то сигнал мог быть получен.
есть ли ограничение на количество байтов, которые я могу записать в соединении TCP / IP?
Предел составляет около 2 ^ 32 байта.
Как я могу решить эту проблему?
Следите за тем, сколько отправлено с каждой записью, и продолжайте запись, пока все в буфере не будет записано.
Я не добавил образец, так как на первый вопрос можно было бы ответить, проверив документацию на write (), на второй можно было бы получить быстрый поиск, а на третий вопрос уже есть много примеров.