Обновление: я добавляю while
, чтобы получить оставшиеся данные, проблема решена.спасибо, ребята.
while(res != rcvread->size + 4) {/* do not get full data */
tmp = recv(connfd, (void *)rcvread + res, rcvread->size + 4 - res, 0);
if(tmp == -1)
printf("error:%s\n",(char *)strerror(errno));
res+=tmp;
}
Я хочу отправить структуру mfsio
через сокет, возвращаемое значение write
равно 37772, но когда я получил его из другой программы, возвращаемое значение read
равно 32768, это действительно странно.
Определение этой структуры здесь
struct mfsio{
size_t size;
char buf[];
};
Код отправки здесь
struct mfsio *sndread;
sndread = malloc(sizeof(struct mfsio) + rcvcmd->size);
res = pread(fd, &(sndread->buf), rcvcmd->size, rcvcmd->offset);
sndread->size = res;
res = write(connfd, sndread, sizeof(struct mfsio) + res);
Код получения здесь
struct mfsio *rcvread;
rcvread = malloc(sizeof(struct mfsio) + size);
res = 0;
res = read(connfd, rcvread, sizeof(struct mfsio) + size);
size
равно rcvcmd->size
, а рез pread
- 32678, рез write
- 32772. но рез read
- 32678.
Как такое могло случиться?Я что-то здесь не так делаю?
Если нет ввода от write
, функция read
будет просто ожидать некоторые данные и просто зависать там
Если я используюцикл, чтобы избежать такой проблемы, как я могу, наконец, получить всю структуру данных, я имею в виду, если я буду читать цикл, я получу оставшиеся байты из сокета, но как я могу объединить эти клипы, которые я получу?