2013-08-05 3 views
0

Я пишу веб-прокси, и он отлично работает с веб-страницами, которые могут быть переведены в текст ASCII. Однако, когда я пытаюсь просмотреть страницы с двоичными данными (Youtube.com - это тот, который я использовал), происходит утечка памяти где-то, и те же самые несколько символов будут повторяться снова и снова в конце строк I 'посылает клиенту (и будет отображаться в других местах, где они явно не должны быть).Сбой памяти сокета только с двоичными данными

Ниже приведена соответствующая часть моего кода. SendHTTPResponse - это функция, которая отправляет ответ веб-страницы клиенту с использованием прокси-сервера и работает правильно.

У кого-нибудь есть понимание?

int numBytes; 
char temp[3000]; 
memset(temp, '\0', 3000); 
numBytes = Read(internetSocket, temp, 2999); 
while (errno = 0, numBytes > 0 || errno == EINTR) 
{ 
    SendHTTPResponse(socket, temp, numBytes); 
    memset(temp, '\0', 3000); 
    numBytes = Read(internetSocket, temp, 2999);  
} 
+0

Здесь не достаточно информации или кода, чтобы ответить на этот вопрос. Вам нужно выполнить некоторую отладку и сузить ее. –

+0

Вам не нужно принимать numBytes == 0 как действительное возвращаемое значение, то есть ничего не было в буфере, но поток все еще открыт, и вы должны продолжать пытаться читать? –

+4

errno = 0, numBytes> 0 ???? что это? почему вы используете такой запятый? и ПОЧЕМУ вы устанавливаете errno на 0? –

ответ

1

Чтобы ответить на ваш вопрос, в этом коде отсутствует утечка памяти.

Также нет причин думать, что утечка памяти имеет какое-либо отношение к этой проблеме.

Однако ваш код неверен. Он не должен устанавливать errno, и он не должен тестировать его, если только метод не вернулся -1. Должно быть:

while ((numBytes = Read(socket, temp, sizeof temp)) > 0 || numBytes == -1 && errno == EINTR) 
{ 
    SendHTTPResponse(socket, temp, numBytes); 
} 

Вам не нужны memset() звонков и вам не нужно оставить места для завершающего нуля, при условии SendHTTPResponse() занимает надлежащее уведомление длины вы передаете его. Конечно, он не должен искать конечные нули.

И 3000 - очень странный размер буфера. Я бы сам использовал 8192.

+0

Если 'numBytes' равно -1,' SendHTTPResponse() 'не следует вызывать, так как нет данных для отправки, но' Read() 'следует вызывать снова, чтобы читать, когда' errno' является 'EINTR'. Вместо этого я бы использовал цикл «do/while», а затем использовал 'break', когда' Read() 'на самом деле терпит неудачу. –

0

Это всего лишь образованное предположение о вашей проблеме. Как говорили другие, вы не разместили достаточно информации, чтобы найти свою ошибку.

Наибольшая разница между двоичными данными и текстовыми данными состоит в том, что бывший (EDIT, thanks EJP) может содержать пустые ('\ 0') байты. Если вы используете строковые функции (например, strlen()), они будут интерпретировать их как конец строки, и поэтому вы будете пропускать данные.

+1

* бывший * может содержать нулевые байты. – EJP

Смежные вопросы