Итак, у меня есть клиент-серверная программа на основе протокола TCP.Во-первых, сервер отправляет клиенту число байтов для чтения (4 байта (длина строки) и 2 байта для кода), и это работает нормально, но затем я отправляю строку с указанным длиной, и клиент перестает работать должным образом.
Код сервера:
// char *array = malloc(20000);
// ....
if (write(msg_sock, &filesSendHeader, sizeof(struct AllFiles)) != sizeof(struct AllFiles))
syserr("partial / failed write");
if (write(msg_sock, array, howMany + 1) != howMany + 1)
syserr("partial / failed write");
msg_sock - это сокет для получения от функции accept.
array - массив символов размера 20000,
howMany + 1 - длина строки(включая 0 символов)
filesSendHeader является экземпляром struct AllFiles и содержит один 4-байтовый и 2-байтовый номер
Код клиента:
// char *array = malloc(20000);
// ....
//For reading first struct
prev_len = 0;
while (prev_len < sizeof(struct AllFiles)) {
received = read(sock, ((char*)&file_info) + prev_len, sizeof(struct AllFiles) - prev_len);
if (received < 0)
syserr("reading from server socket");
prev_len += received;
}
// Printing struct AllFiles fields and converting them with ntoh...
// Then reading a string
uint32_t to_read = ntohl(file_info.value);
printf("Bytes read:%ld\n", read(sock, array, to_read));
printf("Hey");
sock - сокет, клиентподключается к серверу через (из getaddrinfo)
file_info - экземпляр struct AllFiles
Код сервера после записи в сокет выполняется нормально.Клиент печатает правильное количество прочитанных байтов, но затем он перестает работать (программа запускается, но ничего после второй до последней инструкции не выводится).«ЭЙ» не распечатывается.
Что я делаю не так?
Редактировать:
Я попытался запустить программу с помощью valgrind, но не выдал проблем с памятью.Я также сделал file_info.value = ntohl(file_info.value);
в клиентской части перед отправкой строки, но, как я сказал, struct AllFiles получена правильно (я распечатал ее).