Проблема чтения () сокетов C unix

Я использую C для реализации клиент-серверного приложения.Клиент отправляет информацию на сервер, а сервер использует ее для отправки информации обратно. В настоящее время я пишу код для обработки получения данных, чтобы гарантировать, что все они действительно получены.

Проблема, с которой я столкнулся, лучше всего объяснить после показа некоторого кода:

int totalRead = 0;
char *pos = pBuffer;
while(totalRead < 6){
if(int byteCount = read(hSocket, pos, BUFFER_SIZE - (pos-pBuffer)>0)){
    printf("Read %d bytes from client\n", byteCount);
    pos += byteCount;
    totalRead += byteCount;
    }else return -1;
}

Приведенный выше код работает на стороне сервера и 6 раз распечатает «Прочитать 1 байт от клиента», и программа продолжит работать нормально. Я жестко запрограммировал 6 здесь, зная, что я пишу 6 байтов со стороны клиента, но я сделаю так, чтобы мой протокол требовал, чтобы первый отправленный байт был длиной оставшейся части буфера.

int byteCount = read(hSocket, pBuffer, BUFFER_SIZE);
printf("Read %d bytes from client", byteCount);

Приведенный выше код, используемый вместо первого сегмента кода, напечатает «Прочитано 6 байт от клиента» и продолжит работать нормально, но это не гарантирует, что я получил каждый байт, если, например, было прочитано только 5 байтов.

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

О, и это происходит в разветвленном дочернем процессе, и я использую tcp / ip.

Примечание: Моя цель - успешно реализовать первый сегмент кода, чтобы я мог убедиться, что читаю все байты, у меня проблемы с его правильной реализацией.

0
задан pandaEater 17 January 2012 в 04:07
поделиться