Я должен быть запущен в ограничение буфера где-то получать данные из сокета TCP с помощью recv () - PullRequest
0 голосов
/ 28 августа 2010

Я загружаю 6 КБ данных с тестового прибора, подключенного через сокет TCP.Я использую SOCK_STREAM:

if((MySocket=socket(PF_INET,SOCK_STREAM,0))==-1) exit(1);

Я не установил размер буфера, поэтому я предполагаю, что я использую то, что используется по умолчанию.У меня проблема с получением данных.Вот утверждение:

  if((recv(MySocket, &YRaw[indx], sizeChunk*2, 0))==-1)
     {perror("recv()"); exit(9); }  // where sizeChunk=3000; sizeof(YRaw[0])=2

, где YRaw - массив объектов 3000, каждый объект - 2 байта.

Проблема, которую я наблюдаю после выполнения кода, состоит в том, что около 3/4в массиве YRaw есть строка нулей, к которой я инициализировал массив.Похоже, что функция приема работает нормально до 3/4 массива, затем пропускает часть массива YRaw (оставляя инициализированные значения), затем снова поднимается, и массив YRaw заполняется.В буфере остаются данные для чтения, равные количеству пропущенных значений в массиве YRaw.

Я подозреваю, что это связано с некоторым буфером в системе.Кто-нибудь может пролить свет на то, как это исправить?

Я не знаю, связано ли это, но я также установил TCP_NODELAY, как показано здесь:

// TCP_NODELAY option minimizes latency by instructing system to send small msgs immediately
// Insert setsockopt() before connect() occurs
int StateNODELAY = 1; // turn NODELAY on
if(setsockopt(MySocket, IPPROTO_TCP,TCP_NODELAY,
   (void *) &StateNODELAY, sizeof StateNODELAY)==-1) {perror("setsockopt()"); exit(2); };

С уважением, gkk

Ответы [ 2 ]

3 голосов
/ 28 августа 2010

recv() не обязательно заполнять весь буфер. Он просто читает все, что доступно, и возвращает количество прочитанных байтов.

Итак, проверьте возвращаемое значение, чтобы увидеть, сколько данных было доступно, обработайте эти данные и снова вызывайте recv(), пока не получите все ожидаемые данные.

0 голосов
/ 28 августа 2010

Вы должны окончательно сохранить результат recv (т.е. не только проверить, равен ли он -1 или нет). Это размер фактически прочитанных байтов, и вам необходимо знать, сколько байтов допустимо в вашем буфере.

Кроме того, вы должны проверить, можете ли вы читать больше байтов без блокировки, и читать больше, пока он не заблокируется.

Ограничения размера буфера могут быть где угодно в системе, например Ethernet MTU или даже на вашем отправляющем устройстве.

...