Вместо передачи buffer
в recv()
, передайте адрес следующего элемента buffer
, который будет назначен, и накапливайте индекс, регулируя аргумент размера recv()
для учета уже записанные данные:
char buffer[300] ;
ssize_t buffer_index = 0 ;
ssize_t chunk = 0 ;
do
{
chunk = recv( socket_fd,
&buffer[buffer_index],
sizeof(buffer) - buffer_index - 1 ) ;
if( chunk > 0 )
{
buffer_index += chunk ;
buffer[buffer_index] = '\0' ;
}
} while( buffer_index < sizeof(buffer) - 1 &&
chunk > 0 ) ;
Если вместо простого заполнения буфера или тайм-аута вам необходимо использовать ограничитель, такой как \n
, то вам нужно будет читать и проверять по одному символу за раз:
char buffer[300] ;
ssize_t buffer_index = 0 ;
ssize_t status = 0 ;
do
{
status = recv( socket_fd,
&buffer[buffer_index],
1 ) ;
if( status > 0 )
{
buffer_index++ ;
buffer[buffer_index] = '\0' ;
}
} while( ch != '\n' &&
buffer_index < sizeof(buffer) - 1 &&
status > 0 ) ;
Более полный пример функции сокета readline()
можно найти, например, по адресу http://man7.org/tlpi/code/online/dist/sockets/read_line.c.html.