Может ли использование strncpy для копирования потока tcp вызвать сбой? - PullRequest
0 голосов
/ 30 мая 2018

Я делаю простой прокси-сервер.И мне очень трудно разобрать ответ.

// Case 1
do {
    memset(buffer, 0, BUFSIZE);
    con = read(sockfd, buffer, BUFSIZE);
    write(client, buffer, con);
} while(con);

// Case 2
do {
    memset(buffer, 0, BUFSIZE);
    con = read(sockfd, buffer, BUFSIZE);
    size += con;
    cachebuf = (char*)realloc(cachebuf, size);
    strncpy(cachebuf+(size-con), buffer, con);
} while(con);
write(client, cachebuf, size);

Эти два примера получают поток TCP от конечного сервера и направляют его в браузер.Единственное отличие состоит в том, что первый перенаправляет поток, как только он его получает, а второй сохраняет поток в указателе cachebuf и отправляет в целом (что я и хочу использовать)

Кажетсято же самое, и оба прекрасно работают, когда он получает файл HTML.Тем не менее, второй не может отправлять изображения.Почему это происходит?

1 Ответ

0 голосов
/ 30 мая 2018

Вы не можете использовать strncpy (и друзей) для копирования двоичных данных.Эта функция копирует байты, пока не встретит nul-terminator ('\0').Двоичные данные, в частности изображения, содержат много этих символов, и строковые функции не копируют их полностью.

Для копирования двоичных данных вы можете использовать memcpy или std::copy.

Кстати, ваш memset до read совершенно не нужен и просто способствует глобальному потеплению, не делая ничего полезного.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...