имя файла из сообщения UDP - PullRequest
       6

имя файла из сообщения UDP

0 голосов
/ 04 февраля 2019

У меня есть простая программа на C (клиент, сервер) UDP.Клиент отправляет сообщение с именем файла или источником в текстовый файл, и сервер открывает этот файл и показывает первую строку.как отформатировать buf так, чтобы файл можно было правильно открыть?

CLIENT

bzero(buf,BUF_SIZE);
fgets(buf, BUF_SIZE-1, stdin);
n = sendto(sfd, buf, strlen(buf), 0, rp->ai_addr, rp->ai_addrlen);

SERVER

peer_addr_len = sizeof(struct sockaddr_storage);
n = recvfrom(sfd, buf, BUF_SIZE, 0,
            (struct sockaddr *) &peer_addr, &peer_addr_len);
FILE *fp;
char buff[255];
fp = fopen(buf,"r");

fgets(buff, 255, (FILE *)fp);
printf("First line: %s \n", buff);

fclose(fp);

1 Ответ

0 голосов
/ 04 февраля 2019

Функция fopen нуждается в строке с нулевым символом в конце, поэтому перед передачей в fopen необходимо убедиться, что имя файла из полученного буфера имеет нулевое значение.Благодаря реализации в ваших фрагментах кода за именем файла могут следовать произвольные данные, если вы не заполните buf с помощью '\0' перед вызовом recvfrom.

Существуют различные варианты выполнения этого требования.

Отправьте имя файла , включая '\0':

/* use strlen(buf)+1 to include the terminating '\0' */
n = sendto(sfd, buf, strlen(buf)+1, 0, rp->ai_addr, rp->ai_addrlen);

В этом случае получатель получит буфер, включающий '\0'.Но было бы неплохо проверить, что полученная строка на самом деле заканчивается '\0'.

Или добавьте '\0' после получения строки:

/* use BUF_SIZE-1 to reserve at least 1 byte for '\0' */
n = recvfrom(sfd, buf, BUF_SIZE-1, 0,
        (struct sockaddr *) &peer_addr, &peer_addr_len);
if(n >= 0) {
    buf[n] = '\0';
}

Добавление обеих модификаций приведет кПрограмма более устойчива.

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

...