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