2015-12-29 12 views
0

Я написал простую связь tcp/ip между клиентом и сервером в localhost в c++. Он отправляет по tcp/ip массив из unsigned char. Размер этого массива заключается в следующем:C++ предельные данные о подключении tcp

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? Как я могу решить эту проблему?

ответ

2

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

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

+0

Так что я должен зацикливаться на стороне сервера, пока я читаю? –

+0

@ L.Joe сторона сервера немного другая - вы можете * или * loop или - на реализациях, которые ее поддерживают, использовать флаг 'MSG_WAITALL', см. [' Recv'] (http://linux.die.net/ человек/2/RECV). –

0

Почему?

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

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

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

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

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^