Я использую 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 раз выведет «Read 1 bytes from client», и программа продолжит работать нормально.Я жестко запрограммировал 6 здесь, зная, что я пишу 6 байтов со стороны клиента, но я заставлю свой протокол требовать, чтобы первый отправленный байт был длиной остальной части буфера.
int byteCount = read(hSocket, pBuffer, BUFFER_SIZE);
printf("Read %d bytes from client", byteCount);
Приведенный выше код, используемый вместо первого сегмента кода, напечатает «Чтение 6 байтов из клиента» и продолжит работать нормально, но это не гарантирует, что я получил каждый байт, если, например, было прочитано только 5.
Может кто-нибудь объяснить мне, почему это происходит и возможное решение?Я предполагаю, что первый метод обеспечивает доставку всех байтов, но кажется неэффективным чтение одного байта за раз ...
О, и это происходит в разветвленном дочернем процессе, и я использую tcp / ip.
Примечание. Моя цель - успешно реализовать первый сегмент кода, чтобы убедиться, что я читаю все байты, у меня возникают проблемы с его правильной реализацией.