Я загружаю 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