2014-12-10 3 views
-1

Я предрек буфер, какЧтения целых чисел над гнездом внутри буфера

char buffer[256]; 

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

read(sock, buffer, 255); 
int r = atoi(buffer); 

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

+0

Какие данных отправляется через сокет? Двоичные целые или целочисленные данные, закодированные как ASCII? – sfjac

+0

@sfjac Его целые данные, закодированные в ASCII. –

+0

Для вызова atoi его нужно будет отключить до нуля. Вы отправляете нуль? – sfjac

ответ

1

С сокеткой TCP вы не обязательно получаете сообщение целиком с одним вызовом recv. У вас должен быть способ узнать, получили ли вы все сообщение. Один из способов - разместить длину сообщения в начале сообщения. Другой способ - прервать сообщение ASCII специальным символом (например, \ n). В конце приема вы должны использовать счетчик, возвращенный recv, и посмотреть полученные данные, чтобы определить, есть ли у вас все сообщение. Если нет, вам нужно снова вызвать recv, чтобы получить больше сообщения.

Вы лечите полученное сообщение в виде массива символов, но символьные массивы должны быть прекращены с NUL, прежде чем безопасно передавать их atoi (или любой другой функции строка C):

buffer[received_length] = '\0'; 
Смежные вопросы