logo

Programação de soquete em C/C++

No mundo de hoje, as redes de computadores desempenham um papel importante no campo da transferência de dados. É um assunto que todo programador deve conhecer. Na rede de computadores, a programação de soquetes é um dos tópicos mais importantes no mundo da programação. Neste tópico, discutiremos a programação de soquete e os diferentes métodos de programação de soquete que são implementados em C++.

Em C++, a programação de soquete é um método que combina dois ou mais nós entre si em uma rede para que os nós possam compartilhar os dados sem qualquer perda de dados. Nesta conexão, um nó escuta uma porta que está conectada a um endereço IP específico. Quando o cliente chega ao servidor, o servidor cria o ouvinte de soquete.

O que é um soquete?

Vamos entender sobre o soquete falando no exemplo em tempo real. Um soquete é um tipo de meio que fornece uma conexão entre dois dispositivos. A tomada pode ser um carregador de telefone que fornece a conexão entre a tomada e o telefone ou entre o telefone e o laptop. Com a ajuda de um soquete, diferentes aplicativos são conectados à rede local com diferentes portas. Cada vez que o soquete é criado, o servidor especifica o programa, e esse programa especifica o soquete e o endereço do domínio.

matriz java dinâmica

O soquete é um tipo de mecanismo usado para trocar dados entre diferentes processos. Aqui, esses processos estão presentes em dispositivos diferentes ou no mesmo dispositivo conectado em uma rede. Depois que a conexão para o soquete for criada, os dados poderão ser enviados em ambas as direções e continuarão até que um dos terminais feche a conexão.

Programação de soquete em C/C++

Procedimento na comunicação cliente-servidor

Existem alguns procedimentos que devemos seguir para estabelecer a comunicação cliente-servidor. São os seguintes.

    Soquete:Com a ajuda de um soquete, podemos criar uma nova comunicação.Vincular:Com a ajuda disso podemos anexar o endereço local ao soquete.Ouvir:Com esta ajuda; podemos aceitar a conexão.Aceitar:Com esta ajuda; podemos bloquear a conexão de entrada até que a solicitação chegue.Conectar:Com esta ajuda; podemos tentar estabelecer a conexão.Enviar:Com a ajuda disso; podemos enviar os dados pela rede.Receber:Com esta ajuda; podemos receber os dados pela rede.Fechar:Com a ajuda disso, podemos liberar a conexão da rede.

Estágios para criação de soquete de servidor

Existem alguns estágios pelos quais podemos criar o soquete para o servidor. São os seguintes.

    soquete interno:Soquete (domínio, tipo, protocolo)Soquete:É um tipo inteiro e é como um manipulador de arquivos.Domínio:É um domínio de comunicação e é do tipo inteiro.Tipo:É um tipo de comunicação.SOCK_DGRAM:É um tipo de UDP que não é confiável e não tem conexão.Protocolo:É utilizado para atribuir o valor do protocolo ao endereço IP, que é 0. O valor do protocolo é semelhante ao valor que aparece no campo protocolo do cabeçalho IP do pocket.

O que é uma conexão?

Uma conexão é um tipo de relacionamento entre duas máquinas em que os dois softwares se conhecem. Esses dois softwares sabem como estabelecer uma conexão entre si; ou seja, podemos dizer que esses dois softwares sabem enviar os bits pela rede. Uma conexão do soquete significa que as duas máquinas devem conhecer todas as informações entre si, como número de telefone, endereço IP e porta TCP.

pandas criando dataframe

Um soquete é um tipo de objeto semelhante ao arquivo que permite ao programa aceitar a conexão de entrada e enviar ou receber a conexão de entrada. Além disso, é um tipo de recurso atribuído ao processo do servidor.

O servidor pode criar o soquete com a ajuda de socket(). Este soquete não pode ser compartilhado com nenhum outro processador.

    Setsockopt:Com a ajuda do Setsockopt, podemos manipular as diversas opções do soquete, que são referenciadas pelo descritor de arquivo do soquete. Este processo é totalmente opcional. Com a ajuda do Setsockopt, podemos reutilizar a porta e o endereço do cliente e do servidor. Quando o servidor apresenta o erro 'endereço já em uso', podemos evitá-lo com a ajuda do Setsockopt.Vincular:Podemos vincular o soquete ao endereço e à porta com a ajuda da função bind. Esta operação é feita após a criação do soquete. Por exemplo, se tentarmos vincular o servidor ao host local, usaremos INADDR_ANY para definir o endereço IP do servidor.Ouvir:Podemos fazer um soquete de modo de conexão com a ajuda da função listen to (). Um exemplo de soquete de modo de conexão é SOCK_STREAM. Isso pode ser definido pelo argumento socket. Isso é usado para aceitar a conexão de entrada, executar a operação de fila para a conexão de entrada e executar o backlog da conexão de entrada. Quando uma conexão de entrada solicita confirmação do servidor, o soquete é colocado no modo passivo. O parâmetro backlog do servidor refere-se ao fato de que ele não pode permitir mais de uma conexão ao servidor por vez. Se alguma conexão de entrada chegar e a fila estiver cheia, o servidor fornecerá ao erro uma indicação de 'ECONNREFUSED.' Com a ajuda de listen(), a conexão de entrada fica em espera e, quando a fila está vazia, chama todas as conexões de entrada para o servidor.Aceitar:Com a ajuda da chamada de sistema accept(); podemos fazer o soquete baseado em conexão. Alguns soquetes baseados em conexão são SOCK_STREAM e SOCK_SEQPACKET. Ele extrai todas as conexões de entrada que chegam primeiro e permite que sua solicitação vá para o servidor. A lista recém-conectada não consegue escutar com a ajuda de outro argumento para a criação do novo soquete.

Etapas para o cliente

    Conexão de soquete:É exatamente igual ao método de criação do servidor.Conectar:Podemos iniciar uma conexão com o soquete com a ajuda da chamada de sistema connect(). Se o parâmetro do soquete for do tipo SOCK_DGRAM, então podemos definir o datagrama como permanente com a ajuda de connect(). Se o soquete for do tipo SOCK_STREAM, podemos tentar fazer outra conexão para o servidor. Com a ajuda da função connect(), também podemos criar uma conexão para a associação estrangeira. Se o soquete não estiver vinculado, o sistema atribuirá o valor exclusivo à associação local. Quando as chamadas do sistema forem concluídas com êxito, o soquete estará pronto para enviar ou receber qualquer tipo de dados.Enviar receber:As funções send() e recv() podem realizar a operação abaixo.
  • O soquete no qual os dados podem ser comunicados entre si.
  • O buffer de armazenamento pode armazenar dados sobre o endereço, como addr_of_data e addr_of_buffer.
  • Lida com o tamanho do buffer, como len_of_data e len_of_buffer.
  • Trata-se da flag que diz como os dados serão enviados.

Passos para estabelecer a conexão no soquete

Estabelece uma conexão entre os diferentes clientes e o servidor. Mas tanto o cliente quanto o servidor podem lidar com a conexão do soquete. Cada processo deve estabelecer uma conexão para seu próprio soquete.

As etapas envolvidas no estabelecimento de um soquete no lado do cliente são as seguintes:

  • Ele cria um soquete com a ajuda de uma chamada de sistema socket().
  • Então temos que nos conectar ao endereço do soquete do servidor com a ajuda de uma chamada system().
  • Então temos que enviar e receber os dados. Podemos fazer isso de várias maneiras. podemos fazer esta função read() e write().

As etapas envolvidas no estabelecimento de um soquete no lado do servidor são as seguintes:

while e faça loop while em java
  • Primeiro ele cria um soquete com a ajuda de uma chamada de sistema socket().
  • Em seguida, ele vincula o soquete a um endereço com a ajuda da chamada de sistema bind(). Um endereço consiste em um número de porta para o soquete do servidor na máquina host.
  • Em seguida, ele escuta a conexão com a ajuda da chamada de sistema listen().
  • Em seguida, o servidor aceita a conexão de entrada com a ajuda da chamada de sistema accept(). Ele também bloqueia todos os comandos recebidos até que um cliente esteja conectado a um servidor.
  • Em seguida, inicia-se o processo de envio e recebimento de dados.

Conectando vários clientes sem multithreading

Existem vários exemplos nos quais vemos como um único usuário pode se conectar ao servidor. No mundo da programação atual, vários usuários estão conectados ao servidor com soquetes diferentes.

Existem várias maneiras de conseguir isso. Um deles é o multithreading. Com a ajuda do multithreading, podemos conseguir isso. Podemos implementar um processo multithreading com a ajuda da função select().

Exemplo:

Código para o cliente:

 // Client side C/C++ program to demonstrate Socket // programming #include #include #include #include #include #define PORT 8080 int main(int argc, char const* argv[]) { int sock = 0, valread, client_fd; struct sockaddr_in serv_addr; char* hello = &apos;Hello from client&apos;; char buffer[1024] = { 0 }; if ((sock = socket(AF_INET, SOCK_STREAM, 0)) <0) 0 8080 { printf('
 socket creation error 
'); return -1; } serv_addr.sin_family="AF_INET;" serv_addr.sin_port="htons(PORT);" convert ipv4 and ipv6 addresses from text to binary form if (inet_pton(af_inet, '127.0.0.1', &serv_addr.sin_addr) <="0)" printf( '
invalid address not supported ((client_fd="connect(sock," (struct sockaddr*)&serv_addr, sizeof(serv_addr))) 0) printf('
connection failed send(sock, hello, strlen(hello), 0); printf('hello message sent
'); valread="read(sock," buffer, 1024); printf('%s
', buffer); closing the connected close(client_fd); 0; code for server: server side c c++ program demonstrate programming #include #define port int main(int argc, char const* argv[]) server_fd, new_socket, valread; struct sockaddr_in address; opt="1;" addrlen="sizeof(address);" buffer[1024]="{" }; char* hello="Hello from server" ; creating file descriptor ((server_fd="socket(AF_INET," sock_stream, 0)) perror('socket failed'); exit(exit_failure); forcefully attaching (setsockopt(server_fd, sol_socket, so_reuseaddr | so_reuseport, &opt, sizeof(opt))) perror('setsockopt'); address.sin_family="AF_INET;" address.sin_addr.s_addr="INADDR_ANY;" address.sin_port="htons(PORT);" (bind(server_fd, sockaddr*)&address, sizeof(address)) perror('bind (listen(server_fd, 3) perror('listen'); ((new_socket="accept(server_fd," (socklen_t*)&addrlen)) perror('accept'); send(new_socket, close(new_socket); listening shutdown(server_fd, shut_rdwr); pre> <p> <strong>Compiling:</strong> </p> <img src="//techcodeview.com/img/c-tutorial/33/socket-programming-c-c-2.webp" alt="Socket Programming in C/C++"> <p> <strong>Output:</strong> </p> <img src="//techcodeview.com/img/c-tutorial/33/socket-programming-c-c-3.webp" alt="Socket Programming in C/C++"> <h2>Uses of Socket Programming</h2> <p>Socket programs are used to communicate between various processes, usually running on different systems. It is mostly used to create a client-server environment. This post provides the various functions used to create the server and client program and an example program.</p> <p>In the example, the client program sends a file name to the server, and the server sends the contents of the file back to the client. Socket programming usually pertains to basic communication protocols like TCP/UDP and raw sockets like ICMP. These protocols have a small communication overhead when compared to underlying protocols such as HTTP/DHCP/SMTP etc.</p> <p> <strong>Some of the basic data communications between the client and server are:</strong> </p> <ul> <li>File Transfer: Sends name and gets a file.</li> <li>Web Page: Sends URL and gets a page.</li> <li>Echo: Sends a message and gets it back.</li> </ul> <h2>Disadvantages</h2> <ul> <li>C++ can establish communication only with the machine requested and not with any other machine on the network.</li> <li>Sockets allow only raw data to be sent. This means that the client and server need mechanisms to interpret the data.</li> </ul> <hr></0)>