|
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 #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 #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 #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
|
|
|
|
|
|
|