Quanto dovrebbe essere grande il mio buffer di ricezione quando si chiama recv nella libreria di socket

Ho alcune domande sulla libreria di socket in C. Ecco un frammento di codice a cui farò riferimento nelle mie domande.

char recv_buffer[3000]; recv(socket, recv_buffer, 3000, 0); 
  1. Come decido quanto è grande per rendere recv_buffer? Sto usando 3000, ma è arbitrario.
  2. cosa succede se recv() riceve un pacchetto più grande del mio buffer?
  3. Come posso sapere se ho ricevuto l’intero messaggio senza chiamare nuovamente RECV e averlo aspettato per sempre quando non c’è nulla da ricevere?
  4. c’è un modo in cui posso fare in modo che un buffer non abbia una quantità fissa di spazio, così posso continuare ad aggiungerlo senza temere di rimanere senza spazio? magari usando strcat per concatenare l’ultima risposta recv() al buffer?

So che ci sono un sacco di domande in una, ma apprezzerei molto ogni risposta.