elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Como proteger una cartera - billetera de Bitcoin


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Almacenar bytes en un char ¡¡AYUDA!!
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Almacenar bytes en un char ¡¡AYUDA!!  (Leído 4,088 veces)
rootLink

Desconectado Desconectado

Mensajes: 4


Ver Perfil
Almacenar bytes en un char ¡¡AYUDA!!
« en: 13 Octubre 2022, 16:23 pm »

Buenas estoy realizando un programa con sockets el cual debo mandar 2 números de 2bytes y un signo de 1 byte.
Ahora el programa ya funciona se ejecuta por consola de esta forma(linux) "./cliente 12 12 -" y el servidor debería regresar un 0, ya lo hace, el problema es que yo del lado del cliente uso 3 send para enviar cada dato y necesito mandarlo en una sola variable, se me propuso ponerlo en un char buffer[5] de 5 bytes, pero ya eh investigado y la verdad no me sale, uso variables de tipo int16_t y para el signo uso char.
Ahora si logro enviar ya juntas las variables ¿Como las puedo separar del lado del servidor?

Es decir del lado del cliente juntar los bytes de 3 variables en una para enviarlo por el socket en un solo send, y del lado del servidor llega la variable y la separo en 3 para hacer las operaciones

Anexo mis programas, espero alguien pueda ayudarme, le estaría eternamente agradecido

Cliente.c

Código:

#include <stdio.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <string.h>
#include<iostream>
#include<stdint.h>
using namespace std;
//#define PORT 8080
#define PORT 8888
 
 
int main(int argc, char const *argv[])
{
int sock = 0, valread;
struct sockaddr_in serv_addr;
 
    int16_t A ;
    int16_t B;
    char *sign;
 
 
if ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0)
{
printf("\n Socket creation error \n");
return -1;
}
 
serv_addr.sin_family = AF_INET;
serv_addr.sin_port = htons(PORT);
 
if(inet_pton(AF_INET, "127.0.0.1", &serv_addr.sin_addr)<=0)
{
printf("\nInvalid address/ Address not supported \n");
return -1;
}
 
if (connect(sock, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0)
{
printf("\nConnection Failed \n");
return -1;
}
 
        A = (int16_t)strtol(argv[1],NULL,10);
B = (int16_t)strtol(argv[2],NULL,10);
sign = (char*)argv[3];
 
A = htons(A);
B = htons(B);
 
char aux = (char)A;
cout<<"aix: "<<aux<<endl;
 
send(sock , &A , sizeof(A), 0 );
    send(sock , &B , sizeof(B) , 0 );
    send(sock, sign , 1 , 0);
printf("Numbers sent!\n");
 
int32_t total;
read(sock,&total,sizeof(total));
total = ntohl(total);
cout<<"La operacion es:"<<total<<endl;
 
 
return 0;
}


Servidor.c

Código:

#include <unistd.h>
#include <stdio.h>
#include <sys/socket.h>
#include <stdlib.h>
#include <netinet/in.h>
#include <string.h>
#include<iostream>
using namespace std;
#define PORT 8888
 
int main(int argc, char const *argv[])
{
int server_fd, new_socket, valread;
struct sockaddr_in address;
int opt = 1;
int addrlen = sizeof(address);
 
int16_t A,B;
char sign;
int32_t total;
char buffer[5];
 
if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) == 0)
{
perror("socket failed");
exit(EXIT_FAILURE);
}
 
if (setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR | SO_REUSEPORT,
&opt, sizeof(opt)))
{
perror("setsockopt");
exit(EXIT_FAILURE);
}
address.sin_family = AF_INET;
address.sin_addr.s_addr = INADDR_ANY;
address.sin_port = htons( PORT );
 
if (bind(server_fd, (struct sockaddr *)&address,
sizeof(address))<0)
{
perror("bind failed");
exit(EXIT_FAILURE);
}
if (listen(server_fd, 3) < 0)
{
perror("listen");
exit(EXIT_FAILURE);
}
 
    if ((new_socket = accept(server_fd, (struct sockaddr *)&address,
(socklen_t*)&addrlen))<0)
{
perror("accept");
exit(EXIT_FAILURE);
}
 
 
read(new_socket,&A,sizeof(A));
 
read(new_socket,&B,sizeof(B));
 
read(new_socket,&sign,sizeof(sign));
 
 
A = ntohs(A);
B = ntohs(B);
 
cout<<A<<endl;
cout<<B<<endl;
cout<<"Signo: "<<sign<<endl;
 
switch(sign){
case '+':
cout<<"Suma"<<endl;
total = A + B;
break;
case '-':
cout<<"Resta"<<endl;
total = A - B;
break;
case '/':
cout<<"Division"<<endl;
total = A / B;
break;
case 'x':
cout<<"Multiplicacion"<<endl;
total = A * B;
break;
}
total = htonl(total);
send(new_socket,&total,sizeof(total),0);
cout<<"Resultado enviado!"<<total<<endl;
return 0;
}



En línea

RayR

Desconectado Desconectado

Mensajes: 239


Ver Perfil
Re: Almacenar bytes en un char ¡¡AYUDA!!
« Respuesta #1 en: 13 Octubre 2022, 17:21 pm »

En el otro tema que habías abierto te había dicho que podías usar memcpy para eso. Si no conoces esa función, búscala en algún manual o tutorial, porque es importante. De cualquier forma, te pongo un ejemplo de cómo podrías juntarlas desde el cliente (esto obviamente iría después de los htons):

Código
  1. memcpy(buffer, &A, sizeof(A));
  2. memcpy(buffer + sizeof(A), &B, sizeof(B));
  3. buffer[sizeof(A) + sizeof(B)] = sign[0];
  4. send(sock, buffer, 5, 0);

En el servidor harías prácticamente lo mismo, pero copiando desde el buffer hacia las variables. De nuevo, si revisas la documentación de memcpy, es simple.

Como también te comenté en el otro tema, normalmente uno no debería simplemente confiar en que todos los bytes se hayan enviado en un solo send (ni, desde el servidor, que se hayan recibido todos en un read), pero aquí estás manejando un número tan pequeño de bytes que igual no vale la pena complicar tu código.


En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines