2009-11-22 2 views
0

Я использую этот код для чтения из сокета:функция чтения в сети Программирование в C

int n ; 
char buffer[256]; 
n = read(newsockfd, buffer, 255); 
    if (n < 0) 
    { 
     error("ERROR reading from socket"); 
    } 

, если данные, которые должны быть считаны больше, чем 255 байт (например, 1000), изменение которых должно быть произошло?

Я знаю изменение char buffer[1000], мне нужно другое решение.

+0

Я думаю, что правильный код зависит от того, как вы хотите обрабатывать входящие данные, как обрабатывать сигналы, как тайм-ауты сокетов, и является 'newsockfd' в режиме блокировки или неблокирования? – sambowry

ответ

5

Просто прочитайте несколько раз из гнезда, пока не получите все данные, которые хотите получить.

Например, чтобы получить 1000 байт, то это может выглядеть следующим образом (на успех read возвращает количество считанных байт):

int received = 0; 
while (received < 1000) { 
    n = read(newsockfd, buffer, 255); 
    // error checking... 
    // do something with the partial data in "buffer"... 
    received += n; 
} 
+0

в петле, может быть? – bmargulies

+0

Как использовать цикл, что является переменной цикла – SjB

+0

Я добавил пример. То, что нужно делать с данными в 'buffer' на каждой итерации, зависит от того, как вы хотите обрабатывать дальше то, что вы получаете. – sth

4

использовать что-то вроде:

char buffer[256]; 
memset(buffer, 0, sizeof(buffer)); 
char* pBuf = buffer; 
int bytesLeft = sizeof(buffer) - sizeof(char); 

while(bytesLeft > 0) 
{ 
    int n = read(newsockfd, pBuf, bytesLeft); 
    if (n < 0) 
    { 
     error("ERROR reading from socket"); 
     break; 
    } 
    if(n == 0) 
    { 
     error("peer shutted down"); 
     break; 
    } 
    pBuf += n; 
    bytesLeft -= n; 
} 
+1

+1 но ... было бы лучше, если бы был «размер» в поле зрения - 255 ==> sizeof (buffer) -1, я предполагаю (в соответствии с вопросом). Я не понимаю, почему байт остался неиспользованным; предположительно для конечного нуля в строке. Кроме того, Q спросил о «более 255 байт», но ответ этого не делает. Условие while (true) будет лучше, чем 'while (bytesLeft> 0)', и вы можете избежать последнего условия в цикле. Если вы беспокоитесь о «n == 0» (EOF - другой конец сокета пропал)? –

+0

Как это будет читать более 255 байт? Этот код будет читать не более 255 байт; просто чтобы он читал его в кусках. Может быть, я чего-то не хватает. Пожалуйста, взорвите меня, если я есть :) – Vaibhav

+0

'char pBuf = buffer;' должен быть 'char * pBuf = buffer;' или я не думаю, что он даже скомпилировался. – billyswong

1

ли изменений третьего параметра чтения 1000 работы или нет? т.е.

char buffer[1001]; 
read(newsockfd, buffer, 1000); 

Если функция read не принимает счетчик, что большой, вы можете прочитать его несколько раз. В цикле отслеживайте, сколько символов вы прочитали до сих пор и используете read(newsockfd, buffer+m, 1000-m);

0

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

+0

Вы имеете в виду с realloc()? – Suppressingfire

+0

Да, может перераспределить тот же буферный массив. – Vaibhav

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