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


  Mostrar Temas
Páginas: [1]
1  Programación / Programación C/C++ / 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;
}

2  Programación / Programación C/C++ / Sockets no orientados a conexion usando select en: 5 Septiembre 2022, 14:36 pm
Buenas tengo problema entendiendo este tema de select, con ayuda de unos compañeros logramos armar un servidor usado select siguiendo la documentación dentro del man de linux
Pero lamentablemente nos salió bien por azares de la vida, no lo termine de entender bien y ahora nos piden que reciba varios clientes(ya lo hace) pero que cuando un cliente envié un mensaje el servidor lo transmita a todos y no tengo ni idea de como comenzar el cliente

Este es el codigo

Código:

#include <sys/socket.h>
#include <netinet/in.h>
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/select.h>

#define TAM 1024

int main(int argc, char *argv[]) {
int i, s, s_conec, leido, ndesc;
unsigned int tam_dir;
struct sockaddr_in dir, dir_cliente;
char buf[TAM];
int opcion=1;
fd_set desc_sockets;
fd_set desc_sockets_copia;

if (argc!=2) {
                fprintf(stderr, "Uso: %s puerto\n", argv[0]);
                return 1;
        }
if ((s=socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) {
perror("error creando socket");
return 1;
}
/* Para reutilizar puerto inmediatamente */
        if (setsockopt(s, SOL_SOCKET, SO_REUSEADDR, &opcion, sizeof(opcion))<0){
                perror("error en setsockopt");
                return 1;
        }
dir.sin_addr.s_addr=INADDR_ANY;
dir.sin_port=htons(atoi(argv[1]));
dir.sin_family=PF_INET;
if (bind(s, (struct sockaddr *)&dir, sizeof(dir)) < 0) {
perror("error en bind");
close(s);
return 1;
}

if (listen(s, 5) < 0) {
perror("error en listen");
close(s);
return 1;
}

FD_ZERO(&desc_sockets);
FD_SET(s, &desc_sockets);
while (1) {
desc_sockets_copia=desc_sockets;
if ((ndesc=select(FD_SETSIZE, &desc_sockets_copia,
NULL, NULL, NULL))<0) {
perror("error en select");
close(s);
return 1;
}
if (FD_ISSET(s, &desc_sockets_copia)) {
ndesc--;

tam_dir=sizeof(dir_cliente);
if ((s_conec=accept(s, (struct sockaddr *)&dir_cliente,
&tam_dir))<0){
perror("error en accept");
close(s);
return 1;
}
FD_SET(s_conec, &desc_sockets);
}
for (i=0; ndesc; i++) {
if (FD_ISSET(i, &desc_sockets_copia)) {
ndesc--;
if ((leido=read(i, buf, TAM))>0) {
if (write(i, buf, leido)<0) {
perror("error en write");
close(s);
return 1;
}
}

if (leido<0) {
perror("error en read");
close(s);
return 1;
}
if (leido==0) { // cliente cierra conexión
close(i);
FD_CLR(i, &desc_sockets);
}
}
}
}

close(s);

return 0;
}


Lo tengo probado bajo la consola de linux, los sockets son un tema muy complicado para mi y alguien pudiera instruirme o darme luz se lo agradecería de verdad muy fuerte, gracias por leerme y espero puedan ayudarme a salir de este relajo
3  Programación / Programación C/C++ / Programa de Calculadora con sockets en: 31 Agosto 2022, 18:38 pm
Hola, estoy cursando la materia de redes en mi escuela, y el profesor es de esos que llegan y dicen lo que vas a hacer todo e semestre y no lo vuelve a ver hasta el final. En fin , hasta ahora eh podido con todos los programas, en este estoy mas que atascado, el problema es el siguiente:

Realizar una calculadora con sockets. El cliente envia 2 numeros enteros de 2 bytes cada uno mas el simbolo de la operacion (+, - , / , *) de 1 byte, el mensaje tendria que ser asi "35003500-" . De este lado hay cosas que no entiendo, a que se refiere con un entero de 2 bytes, segun yo es -32k hasta 32k aprox pero entonces como puedo delimitar eso y a como entro y envio la informacion, el buffer debe ser char o que tipo de dato.
Mientras que el cliente recibe la cadena, la interpreta y regresa la operacion como 1 entero de 4 bytes, ahi de nuevo con los bytes

Si alguno puede ayudarme con el code o con algo estaria mas que agradecido, estoy en mi ultimo chance de pasar la materia o me cargo el año ): Hoy por mi mañana por ustedes xc

 Cliente.cpp

// IP y puerto fijos; envia y recibe un mensaje
#include <stdio.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <string.h>
#include<iostream>
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;
   //char *hello = "Hello from client 1";
    char A[1024],B[1024],sign[1024]; //2 bytes 1 byte
   char buffer[1024] = {0};
   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);
   
   // 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("\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;
   }

    cout<<"Entero A:"<<endl;
    cin>>A;
    cout<<"Entero B:"<<endl;
    cin>>B;
    cout<<"Signo:"<<endl;
    cin>>sign;

    //cast bitwise
   send(sock , A , 1024 , 0 );
    send(sock , B , 1024 , 0 );
    send(sock, sign , 1024 , 0);
   printf("Numbers sent!\n");

   //valread = read( sock , buffer, 1024);
   //printf("%s\n",buffer );
   return 0;
}

    Servidor.cpp

// Server side C/C++ program to demonstrate Socket programming
// El servidor recibe y luego envia un mensaje

#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

//Caracteristicas: puerto fijo TCP
int main(int argc, char const *argv[])
{
   int server_fd, new_socket, valread;
   struct sockaddr_in address;
   int opt = 1;
   int addrlen = sizeof(address);
   char buffer[1024] = {0};
   
   // Creating socket file descriptor
   if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) == 0)
   {
      perror("socket failed");
      exit(EXIT_FAILURE);
   }
   
   // Forcefully attaching socket to the port 8080
   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 );
   
   // Forcefully attaching socket to the port 8080
   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);
   }


    while(1){
       
   valread = read( new_socket , buffer, 1024 );
   printf("%s\n",buffer );

   //send(new_socket , hello , strlen(hello) , 0 );
   //printf("Hello message sent\n");

    }


   
   return 0;
}
4  Programación / Programación C/C++ / Realización de un servidor TFTP en C/C++ en: 14 Marzo 2022, 21:16 pm
Tengo que realizar un servidor y un cliente de un protocolo TFTP, se que debo enviar el archivo a trozos(debe de ser de 512 me parece), lo único que eh realizado con sockets es un chat udp, que ya me sirve, la verdad estoy muy perdido en el tema, si existe un ser que me pueda orientar lo apreciaría, buen día o noche gente  gracias por leer :D
Páginas: [1]
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines