So, hab aus einigen Quellen was zusammengebastellt. Funktinoiert aber nur so halbwegs und ich komme nicht weiter da meine Linux Fähigkeiten nicht die besten sind und es doch sehr nah an der Hardware ist. Die Basisfähigkeit, Daten hin und her zu schicken ist aber schon mal da. Nur schickt er alle Daten zweimal. Auf einem PC habe ich es mit stty -F /dev/tts/1 9600 raw -echo geschafft aber für die Box fehld mir ein passendes Komando. Vielleicht kannst du was rausfinden.
Code: Alles auswählen
#include <stdio.h>
#include <errno.h>
#include <unistd.h>
#include <fcntl.h>
#include <netdb.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#define PORT 21000
#define CP_COUNT 80
#define DEVFILE "/dev/tts/1"
#define CMD_CHAR 255
#define srcrd src
#define srcwr src
int datacp(int srcfd, int destfd)
{
static char buffer[CP_COUNT];
static char output[CP_COUNT];
int i, read_count, write_count = 0;
if((read_count = read(srcfd, buffer, CP_COUNT)) == -1)
{
if(errno != EAGAIN) perror("read");
}
else
{
if(read_count == 0) return 0;
/* strip commands */
write_count = 0;
for(i=0; i<read_count; i++)
{
if(buffer[i] == CMD_CHAR)
{
/* process command */
i++;
if(buffer[i] == CMD_CHAR)
{
/* escaped 0xff */
output[write_count++] = CMD_CHAR;
}
else
{
/* command */
printf("command: %u\n", buffer[i]);
}
}
else
{
/* copy data */
output[write_count++] = buffer[i];
}
}
if(write_count == 0) return 1;
if(write(destfd, output, write_count) == -1) perror("write");
}
return 1;
}
void sockcp(int socket, int src)
{
fd_set inSet;
fcntl(srcrd, O_NONBLOCK);
fcntl(socket, O_NONBLOCK);
FD_ZERO(&inSet);
while(1) {
FD_SET(socket, &inSet);
FD_SET(srcrd, &inSet);
select(FD_SETSIZE, &inSet, NULL, NULL, NULL);
if(FD_ISSET(socket, &inSet))
{
if(!datacp(socket, srcwr)) return;
}
if(FD_ISSET(srcrd, &inSet))
{
if(!datacp(srcrd, socket)) return;
}
}
}
int main(int argc, char **argv)
{
int server_sock, client_sock;
FILE *fd;
struct sockaddr_in server; /* server's address information */
struct sockaddr_in client; /* client's address information */
int sin_size;
if ((server_sock = socket(AF_INET, SOCK_STREAM, 0)) == -1 ) /* prepare TCP/IP socket */
{
printf("socket() error\n");
return 1;
}
server.sin_family = AF_INET;
server.sin_port = htons(PORT); /* Remember htons() from "Conversions" section? =) */
server.sin_addr.s_addr = INADDR_ANY; /* INADDR_ANY puts your IP address automatically */
if(bind(server_sock, (struct sockaddr*)&server, sizeof(struct sockaddr)) == -1) /* calls bind() */
{
printf("bind() error\n");
return 1;
}
if(listen(server_sock, 1) == -1) /* calls listen() */
{
printf("listen() error\n");
return 1;
}
printf("Server started on %u, configure redirector to %d\n", htons(server.sin_port), htons(server.sin_port)-11000);
while(1)
{
sin_size = sizeof(struct sockaddr_in);
if((client_sock = accept(server_sock, (struct sockaddr *)&client, &sin_size)) == -1) /* create real socket */
{
printf("accept() error\n");
return 1;
}
printf("Connection from %s\n", inet_ntoa(client.sin_addr)); /* output client's IP */
fd = fopen(DEVFILE, "rb+");
if(fd)
{
sockcp(client_sock, fileno(fd));
fclose(fd);
}
close(client_sock);
printf("\ndisconnected\n");
}
close(server_sock);
}