Nisso tutorial,
 vou explicar como como a comunicação servidor-cliente usa TCP/IP.  Eu já expliquei sobre soquete e Como criar soquete no Linux.  Antes da explicação, vamos ver algumas visões básicas da terminologia. 
 
Três coisas principais são necessárias para estabelecer a conexão entre os modelos servidor-cliente:
1) Protocolo de transporte (TCP ou UDP)
2) Soquete
3) Endereço IP e porta
Protocolo de transporte (TCP):
TCP é um protocolo orientado a conexão que significa protocolo de controle de transferência.  É um protocolo confiável e seguro.  No TCP, o receptor pode gerar a confirmação do pacote recebido, portanto o remetente (cliente) precisa aguardar uma confirmação e se a resposta não vier ou algum erro de pacote for gerado, ele será reenviado para o cliente.
Soquete:
O soquete é uma conexão de ponto final para comunicação entre duas máquinas.  É como um caminho de conectividade de dados entre dois terminais sem fio.  O soquete é necessário em ambos os lados do servidor e do cliente.  Você pode consultar o tutorial 
soquete e 
Como criar soquete  no Linux.
Endereço IP e porta
O endereço IP é um endereço numérico exclusivo de cada computador e dispositivo.  Ele desempenha um papel importante no domínio da rede com protocolo da Internet.  No modelo servidor-cliente, o servidor precisa saber qual dispositivo está conectado a ele e com quem o servidor estabelece a conexão.  O endereço IP desempenha um papel importante na comunicação entre modelos servidor-cliente.
Em termos de rede, a porta é o local para onde as informações são enviadas.  Vários protocolos atribuem diferentes números de porta.  Um número de porta específico é necessário para a comunicação entre servidor-cliente de acordo com o protocolo usado.
Vamos verificar como obter o endereço IP do usuário.  Digite o seguinte comando no terminal de comando:
ifconfig
Ele exibe informações de rede como endereço, pacote de dados, etc. Certifique-se de qual tipo de conexão com a Internet está em seu sistema.
O endereço IP do sistema está localizado por 
“inet endereço”.  É o endereço IP do seu sistema.
Por exemplo, endereço inet: xxx.xx.xx.xx
Aqui, x representa o valor numérico.
Servidor – Comunicação Cliente usando TCP/IP
O modelo servidor-cliente é o modelo de comunicação para compartilhar o recurso e fornecer o serviço para diferentes máquinas.  Servidor é o principal sistema que fornece os recursos e diversos tipos de serviços quando o cliente solicita utilizá-lo.
Vejamos, comunicação servidor-cliente através de programação de soquete usando TCP/IP.  Achei que você conhecesse a programação C básica e o soquete.  Por favor, consulte o tutorial 
soquete e 
Como criar soquete  no Linux antes de aprender este tutorial.
                                                                    Comunicação servidor-cliente usando TCP/IP
As seguintes tarefas são realizadas no lado do cliente:
• Crie um soquete para comunicação
• Configure o protocolo TCP com endereço IP do servidor e número da porta
• Conecte-se ao servidor através de soquete
• Aguarde a confirmação do servidor
• Enviar mensagem para o servidor
• Receber mensagem do servidor
As seguintes tarefas são realizadas no lado do servidor:
• Crie um soquete para comunicação
• Vincule a porta local e o endereço de conexão
• Configure o protocolo TCP com número de porta
• Ouvir a conexão do cliente
• Aceitar conexão do cliente
• Enviar confirmação
• Receber mensagem do cliente
• Enviar mensagem ao cliente
Aqui escrevi dois programas individuais, um para o lado do servidor e outro para o lado do cliente.  Precisamos de um computador com ambiente Linux.  Mas não se preocupe;  você pode se comunicar com apenas um único sistema.
Programa do lado do cliente:
//*********************************TCP_client.c************ ********************//
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
int principal 
{
        char enviarMensagem(512),receberMensagem(512);
        meia interna, resultado;
        estrutura hostent *host;
        estrutura sockaddr_in serverAdd;
        host = gethostbyname(“xxx.xx.xx.xx”);
        if ((meia = soquete(AF_INET, SOCK_STREAM, 0)) == -1)
  {
            perror(“Falha na criação do soquete”);
            saída(1);
        }
        serverAdd.sin_family = AF_INET;
        serverAdd.sin_port=htons(5000);
        serverAdd.sin_addr = *((struct in_addr *)host->h_addr);
        bzero(&(servidorAdd.sin_zero),8);
        if (connect(sock, (struct sockaddr *)&serverAdd, sizeof(struct sockaddr)) == -1)
        {
            perror(“Falha na conexão”);
            saída(1);
        }
        enquanto(1)
        {
        resultado = recv(meia,receberMensagem,1024,0);
          receberMensagem(resultado) = ”;
  printf(“nMensagem recebida: %s”, recebeMensagem);
          printf(“nENVIAR A mensagem: “);
          fgets(sendMessage,512,stdin);
            enviar(meia,enviarMensagem,strlen(enviarMensagem), 0);
        }
        retornar 0;
}
//*********************************TCP_client.c************ ********************//
Programa do lado do servidor:
//*********************************TCP_server.c************ *******************//
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
int principal 
{
         char enviarMensagem(1024), receberMensagem(1024);
         int meia, conectado, resultado;
         estrutura sockaddr_in serverAdd, clientAdd;
         comprimento interno;
        if ((meia = soquete(AF_INET, SOCK_STREAM, 0)) == -1)
        {
            perror(“Falha na criação do soquete”);
            saída(1);
        }
        if (setsockopt(meia,SOL_SOCKET,SO_REUSEADDR,&1,tamanho(int)) == -1)
        {
            perror(“Definir opção de soquete”);
            saída(1);
        }
        serverAdd.sin_family = AF_INET;
        serverAdd.sin_port=htons(5000);
        serverAdd.sin_addr.s_addr=INADDR_ANY;
        bzero(&(servidorAdd.sin_zero),8);
        if (bind(sock, (struct sockaddr *)&serverAdd, sizeof(struct sockaddr))== -1)
       {
            perror(“Não foi possível vincular”);
            saída(1);
        }
        if (ouvir(meia, 3) == -1)
        {
            perror(“Ouvir”);
            saída(1);
        }
        printf(“TCPServer aguardando conexão do clienten”);
        flush(stdout);
        enquanto(1)
        {
            comprimento = sizeof(struct sockaddr_in);
            conectado = aceitar(meia,(struct sockaddr *)&clientAdd,&length);
            printf(“O servidor está conectado com o endereço IP %se porta %d n”,inet_ntoa(clientAdd.sin_addr),ntohs(clientAdd.sin_port));
enquanto (1)
            {
              printf(” ENVIE a mensagem: “);
              fgets(sendMessage,100,stdin);
      enviar(conectado, enviarMensagem,strlen(enviarMensagem), 0);
resultado = recv(conectado,receberMensagem,512,0);
receberMensagem(resultado) = ”;
printf(“Mensagem recebida: %sn”, recebeMensagem);
              flush(stdout);
            }
        }
        retornar 0;
}
//*********************************TCP_server.c************ *******************//
Salve o arquivo no diretório e compile-o.  Após a compilação bem-sucedida, execute o arquivo executável no terminal de comando.  Você pode consultar o tutorial Como fazer o primeiro programa C no Linux se não estiver ciente do processo de compilação e execução.
Observação: Anote o endereço IP do seu servidor no lugar de “xxx.xxx.xx.xx”.  no programa do lado do cliente.
Execute o programa servidor –cliente no mesmo  sistema
Você pode executar o programa cliente-servidor na mesma máquina.  Primeiro encontre o endereço IP do seu PC cliente conforme descrevi acima.  Agora, se você quiser rodar no mesmo PC o mesmo IP é inserido no código fonte do cliente.  Salve o código-fonte do servidor e do cliente no mesmo PC.
Abra o terminal de comando e execute o primeiro arquivo executável do servidor.  O código do lado do servidor está em modo de execução.  Não interrompa o código.  Abra outro terminal de comando e execute o arquivo executável do lado do cliente.
Nota: Se você não executar lado do servidor  código e tente executar o primeiro código do lado do cliente, ocorrerá um erro de conexão recusada.
Veja a imagem a seguir para compreensão:
Aqui, as partes pretas da imagem indicam o endereço IP do cliente conectado e o número da porta.  Agora, insira a mensagem do terminal do servidor.
Agora você pode enviar dados do cliente para o servidor.  O modelo servidor-cliente é comunicado usando TCP/IP.  Insira os dados do cliente terminal e verifique.
Aqui, não terminei a conexão.  Assim, ambos podem se comunicar até a conexão está fechada.  Pressione ctrl + C de qual terminal você deseja sair.