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;
}