Conectar dos ordenadores en linux
Necesito conectar dos ordenadores por el puerto serie en linux de tal forma que se envíen y reciban los datos que yo le diga para una práctica de una asignatura de transmisión de datos y redes de computadores. En vez de dos ordenadores, estoy usando uno en el que conecto los dos puertos serie que tiene mediante el cable adecuado para ello. Mi problema es que, una vez que establezco la comunicación en un sentido (tengo un programa emisor y un receptor) no puedo luego establecerla en el otro sin cerrar el puerto, cosa que no nos permiten los profesores. Yo envío datos del emisor al receptor, el receptor me los recibe sin problema, y cuando el receptor crea una trama de confirmación y se la envía al emisor, ambos procesos se quedan colgados de tal forma que, aunque no me bloquean el ordenador, sí me bloquean los puertos y tengo que reiniciar el ordenador. Los profesores dicen que debo tener algún error tonto en el código, pero se niegan a mirármelo, y tengo que entregar la práctica (con otras dos partes que no puedo hacer hasta que no tenga acabada esta) el martes de la semana que viene! ¿Puedes ayudarme? ¿Se te ocurre que puede estar pasándome? Te pongo aquí el código, por si puedes mirarlo tú y ves qué puede estar dándome problemas. Por cierto, está escrito en C, y el linux que tengo es RedHat 9 en el que actúo como root para esta práctica:
Emisor.c
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <termios.h>
#include <stdio.h>
#define BAUDRATE B9600 //B38400
#define MODEMDEVICE "/dev/ttyS0"
#define MODEMDEVICE1 "/dev/ttyS1"
#define _POSIX_SOURCE 1 /*fuentes cumple POSIX*/
#define FALSE 0
#define TRUE 1
volatile int STOP=FALSE;
int EnviaDatos(int fd,char *datos,int longitud){
int iret,total=0;
while(total<longitud){
iret=write(fd,&datos[total],longitud-total);
if(iret<0) return(iret);
else total += iret;
};
return(total);
};
int RecibeDatos(int fd, char *datos, int longitud){
return(read(fd,datos,longitud));
};
void ConfiguraPuerto(int fd, struct termios * newtio){
newtio->c_cflag=BAUDRATE|CRTSCTS|CS8|CLOCAL|CREAD;
newtio->c_iflag=IGNPAR;
newtio->c_oflag=0;
/*pone el modo entrada (no-canónico, sin eco,...)*/
newtio->c_lflag=0;
newtio->c_cc[VTIME]=0; /*temporizador entre carácter, no usado*/
newtio->c_cc[VMIN]=0; /*no bloquea lectura*/
tcflush(fd,TCIFLUSH);
tcsetattr(fd,TCSANOW,newtio);
}
void RestauraPuerto(int fd, struct termios * oldtio){
tcsetattr(fd,TCSANOW,oldtio);
}
main(int argc, char *argv[]){
int fd, fd1, c,res;
struct termios oldtio, newtio;
char buf[255];
int contador;
if(argc!=2){
printf("Error en los argumentos del programa.\n");
printf("Se ejecuta como ./redes <puerto> (siendo puerto 1 para COM1 o 2 para COM2)\n");
exit(-1);
}
if(atoi(argv[1])==1){
fd=open(MODEMDEVICE, O_RDWR| O_NOCTTY);
fd1=open(MODEMDEVICE, O_RDWR| O_NOCTTY);
if(fd<0) { perror(MODEMDEVICE);exit(-1); }
if(fd1<0) { perror(MODEMDEVICE);exit(-1); }
}else{
if(atoi(argv[1])==2){
fd=open(MODEMDEVICE1, O_RDWR| O_NOCTTY);
fd1=open(MODEMDEVICE1, O_RDWR| O_NOCTTY);
if(fd<0) { perror(MODEMDEVICE1);exit(-1); }
if(fd1<0) { perror(MODEMDEVICE1);exit(-1); }
}
else{
printf("Error en los argumentos del programa.\n");
printf("Se ejecuta como ./redes <puerto> (siendo puerto 1 para COM1 o 2 para COM2)\n");
exit(-1);
}
}
tcgetattr(fd,&oldtio);
bzero(&newtio,sizeof(newtio));
ConfiguraPuerto(fd, &newtio);
for(contador=0; contador<50; contador++){
buf[contador]='z';
}
//enviar
EnviaDatos(fd, buf, 50);
RestauraPuerto(fd, &oldtio);
}
RECEPTOR.C
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <termios.h>
#include <stdio.h>
#define BAUDRATE B9600 //B38400
#define MODEMDEVICE "/dev/ttyS0"
#define MODEMDEVICE1 "/dev/ttyS1"
#define _POSIX_SOURCE 1 /*fuentes cumple POSIX*/
#define FALSE 0
#define TRUE 1
volatile int STOP=FALSE;
int EnviaDatos(int fd,char *datos,int longitud){
int iret,total=0;
while(total<longitud){
iret=write(fd,&datos[total],longitud-total);
if(iret<0) return(iret);
else total += iret;
};
return(total);
};
int RecibeDatos(int fd, char *datos, int longitud){
return(read(fd,datos,longitud));
};
void ConfiguraPuerto(int fd, struct termios * newtio){
newtio->c_cflag=BAUDRATE|CRTSCTS|CS8|CLOCAL|CREAD;
newtio->c_iflag=IGNPAR;
newtio->c_oflag=0;
/*pone el modo entrada (no-canónico, sin eco,...)*/
newtio->c_lflag=0;
newtio->c_cc[VTIME]=0; /*temporizador entre carácter, no usado*/
newtio->c_cc[VMIN]=0; /*no bloquea lectura*/
tcflush(fd,TCIFLUSH);
tcsetattr(fd,TCSANOW,newtio);
}
void RestauraPuerto(int fd, struct termios * oldtio){
tcsetattr(fd,TCSANOW,oldtio);
}
main(int argc, char *argv[]){
int fd,fd1,c,res;
struct termios oldtio, newtio;
char buf[255];
if(argc!=2){
printf("Error en los argumentos del programa.\n");
printf("Se ejecuta como ./redes <puerto> (siendo puerto 1 para COM1 o 2 para COM2)\n");
exit(-1);
}
if(atoi(argv[1])==1){
fd=open(MODEMDEVICE, O_RDWR| O_NOCTTY);
fd1=open(MODEMDEVICE, O_RDWR| O_NOCTTY);
if(fd<0) { perror(MODEMDEVICE);exit(-1); }
if(fd1<0) { perror(MODEMDEVICE);exit(-1); }
}else{
if(atoi(argv[1])==2){
fd=open(MODEMDEVICE1, O_RDWR| O_NOCTTY);
fd1=open(MODEMDEVICE1, O_RDWR| O_NOCTTY);
if(fd<0) { perror(MODEMDEVICE1);exit(-1); }
if(fd1<0) { perror(MODEMDEVICE1);exit(-1); }
}
else{
printf("Error en los argumentos del programa.\n");
printf("Se ejecuta como ./redes <puerto> (siendo puerto 1 para COM1 o 2 para COM2)\n");
exit(-1);
}
}
tcgetattr(fd,&oldtio);
bzero(&newtio,sizeof(newtio));
ConfiguraPuerto(fd, &newtio);
while(STOP==FALSE){
res=RecibeDatos(fd, buf, 255);
buf[res]=0;
if(res>0){
printf(":%s:%d\n",buf,res);
STOP=TRUE;
}
}
RestauraPuerto(fd, &oldtio);
}
Emisor.c
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <termios.h>
#include <stdio.h>
#define BAUDRATE B9600 //B38400
#define MODEMDEVICE "/dev/ttyS0"
#define MODEMDEVICE1 "/dev/ttyS1"
#define _POSIX_SOURCE 1 /*fuentes cumple POSIX*/
#define FALSE 0
#define TRUE 1
volatile int STOP=FALSE;
int EnviaDatos(int fd,char *datos,int longitud){
int iret,total=0;
while(total<longitud){
iret=write(fd,&datos[total],longitud-total);
if(iret<0) return(iret);
else total += iret;
};
return(total);
};
int RecibeDatos(int fd, char *datos, int longitud){
return(read(fd,datos,longitud));
};
void ConfiguraPuerto(int fd, struct termios * newtio){
newtio->c_cflag=BAUDRATE|CRTSCTS|CS8|CLOCAL|CREAD;
newtio->c_iflag=IGNPAR;
newtio->c_oflag=0;
/*pone el modo entrada (no-canónico, sin eco,...)*/
newtio->c_lflag=0;
newtio->c_cc[VTIME]=0; /*temporizador entre carácter, no usado*/
newtio->c_cc[VMIN]=0; /*no bloquea lectura*/
tcflush(fd,TCIFLUSH);
tcsetattr(fd,TCSANOW,newtio);
}
void RestauraPuerto(int fd, struct termios * oldtio){
tcsetattr(fd,TCSANOW,oldtio);
}
main(int argc, char *argv[]){
int fd, fd1, c,res;
struct termios oldtio, newtio;
char buf[255];
int contador;
if(argc!=2){
printf("Error en los argumentos del programa.\n");
printf("Se ejecuta como ./redes <puerto> (siendo puerto 1 para COM1 o 2 para COM2)\n");
exit(-1);
}
if(atoi(argv[1])==1){
fd=open(MODEMDEVICE, O_RDWR| O_NOCTTY);
fd1=open(MODEMDEVICE, O_RDWR| O_NOCTTY);
if(fd<0) { perror(MODEMDEVICE);exit(-1); }
if(fd1<0) { perror(MODEMDEVICE);exit(-1); }
}else{
if(atoi(argv[1])==2){
fd=open(MODEMDEVICE1, O_RDWR| O_NOCTTY);
fd1=open(MODEMDEVICE1, O_RDWR| O_NOCTTY);
if(fd<0) { perror(MODEMDEVICE1);exit(-1); }
if(fd1<0) { perror(MODEMDEVICE1);exit(-1); }
}
else{
printf("Error en los argumentos del programa.\n");
printf("Se ejecuta como ./redes <puerto> (siendo puerto 1 para COM1 o 2 para COM2)\n");
exit(-1);
}
}
tcgetattr(fd,&oldtio);
bzero(&newtio,sizeof(newtio));
ConfiguraPuerto(fd, &newtio);
for(contador=0; contador<50; contador++){
buf[contador]='z';
}
//enviar
EnviaDatos(fd, buf, 50);
RestauraPuerto(fd, &oldtio);
}
RECEPTOR.C
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <termios.h>
#include <stdio.h>
#define BAUDRATE B9600 //B38400
#define MODEMDEVICE "/dev/ttyS0"
#define MODEMDEVICE1 "/dev/ttyS1"
#define _POSIX_SOURCE 1 /*fuentes cumple POSIX*/
#define FALSE 0
#define TRUE 1
volatile int STOP=FALSE;
int EnviaDatos(int fd,char *datos,int longitud){
int iret,total=0;
while(total<longitud){
iret=write(fd,&datos[total],longitud-total);
if(iret<0) return(iret);
else total += iret;
};
return(total);
};
int RecibeDatos(int fd, char *datos, int longitud){
return(read(fd,datos,longitud));
};
void ConfiguraPuerto(int fd, struct termios * newtio){
newtio->c_cflag=BAUDRATE|CRTSCTS|CS8|CLOCAL|CREAD;
newtio->c_iflag=IGNPAR;
newtio->c_oflag=0;
/*pone el modo entrada (no-canónico, sin eco,...)*/
newtio->c_lflag=0;
newtio->c_cc[VTIME]=0; /*temporizador entre carácter, no usado*/
newtio->c_cc[VMIN]=0; /*no bloquea lectura*/
tcflush(fd,TCIFLUSH);
tcsetattr(fd,TCSANOW,newtio);
}
void RestauraPuerto(int fd, struct termios * oldtio){
tcsetattr(fd,TCSANOW,oldtio);
}
main(int argc, char *argv[]){
int fd,fd1,c,res;
struct termios oldtio, newtio;
char buf[255];
if(argc!=2){
printf("Error en los argumentos del programa.\n");
printf("Se ejecuta como ./redes <puerto> (siendo puerto 1 para COM1 o 2 para COM2)\n");
exit(-1);
}
if(atoi(argv[1])==1){
fd=open(MODEMDEVICE, O_RDWR| O_NOCTTY);
fd1=open(MODEMDEVICE, O_RDWR| O_NOCTTY);
if(fd<0) { perror(MODEMDEVICE);exit(-1); }
if(fd1<0) { perror(MODEMDEVICE);exit(-1); }
}else{
if(atoi(argv[1])==2){
fd=open(MODEMDEVICE1, O_RDWR| O_NOCTTY);
fd1=open(MODEMDEVICE1, O_RDWR| O_NOCTTY);
if(fd<0) { perror(MODEMDEVICE1);exit(-1); }
if(fd1<0) { perror(MODEMDEVICE1);exit(-1); }
}
else{
printf("Error en los argumentos del programa.\n");
printf("Se ejecuta como ./redes <puerto> (siendo puerto 1 para COM1 o 2 para COM2)\n");
exit(-1);
}
}
tcgetattr(fd,&oldtio);
bzero(&newtio,sizeof(newtio));
ConfiguraPuerto(fd, &newtio);
while(STOP==FALSE){
res=RecibeDatos(fd, buf, 255);
buf[res]=0;
if(res>0){
printf(":%s:%d\n",buf,res);
STOP=TRUE;
}
}
RestauraPuerto(fd, &oldtio);
}
1 Respuesta
Respuesta de chissum
1