Estou escrevendo um programa simples de cliente TCP e soquete de servidor em C.
O que não entendo é o seguinte: no meu código de cliente, parece que ter um único soquete para receber e enviar é adequado.
Mas no código do meu servidor, preciso ter dois soquetes: um soquete para aceitar a conexão e outro diferente para enviar pacotes ao cliente.
Não entendo como isso faz sentido. Se posso ENVIAR e RECEBER no lado A usando um único soquete, por que não posso fazer o mesmo no lado B?
Um soquete representa um par de terminais. Os dados enviados de um endpoint são recebidos pelo outro endpoint.
Para um cliente TCP, 1 soquete é suficiente, pois representa exclusivamente a conexão entre o ip/porta local ao qual o cliente está vinculado e o ip/porta do servidor remoto ao qual o cliente está conectado. É por isso que você pode usar 1 soquete para enviar e receber dados do aplicativo.
Para um servidor TCP, 1 soquete não é suficiente. O soquete de escuta representa apenas o ip/porta local em que o servidor aceita clientes, mas não há nenhum cliente remoto conectado a este soquete, portanto, o terminal está sempre vazio. Você não pode enviar ou receber dados de aplicativos neste soquete.
accept()
retorna um novo soquete que representa a conexão entre o ip/porta local do servidor em que o cliente foi aceito e o ip/porta remoto de onde esse cliente se conectou. Além disso, pense em quando há vários clientes conectados ao servidor ao mesmo tempo. Cada conexão deve ser representada de forma única. Você não pode fazer isso com apenas 1 par de terminais em 1 soquete de escuta, daí a necessidade de um novo soquete por conexão aceita.