C/Visual C - Ayuda con trabajo para la universidad

 
Vista:
Imágen de perfil de Linkcito

Ayuda con trabajo para la universidad

Publicado por Linkcito (1 intervención) el 13/10/2022 16:12:08
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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
#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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
#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;
}
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de SuperIndio
Val: 47
Ha mantenido su posición en C/Visual C (en relación al último mes)
Gráfica de C/Visual C

Ayuda con trabajo para la universidad

Publicado por SuperIndio (42 intervenciones) el 19/10/2022 19:51:48
Ok, bueno programo Socket hace muchos años, y te cuento que lo mas comun es enviar todo junto en un String Ej:
DJ90S00056012876FU001720000000830000000120221019 es un mensaje enviado por el Cleinte donde
D = debito
J90S0 = job a ejecutar
0056 = Sucursal
012876 = Numero Cliente
FU00172 = Referencia del movimiento
00000008300000 = importe
043 = tipo de movimiento
20221019 = fecha efecto

el servidor deberia parcear o extraer asi

strncpy(ccRefer, &pMensaje[16], 7) ;
Para esto tenes que establecer un PseudoProtocolo para cada mensaje si envias y recibis un solo tipo de mensaje es facil pero se complica cuando tenes muchos tipos de mensajes por lo que dividir ese mensaje tendras que tener varios pseudosprotocolos, entonces para ello yo hago esto y me parece mejor:
El mensaje es asi:
D;J90S0;0056;012876;FU00172;00000008300000;043;20221019;
y para parcear son simplemente hacer un bucle y usando ls funcion strtok()
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar