Я пытаюсь создать симулятор светофора и конечный автомат из 10.4 по ссылке ниже.Ниже находится сокет, и сокет прослушивает пользовательский ввод от клиента, мне нужно смоделировать светофор и вывести текущее состояние индикаторов
http://users.ece.utexas.edu/~valvano/Volume1/E-Book/C10_FiniteStateMachines.htm
/*
C socket server example, handles multiple clients using threads
*/
#include<stdio.h>
#include<string.h> //strlen
#include <sys/ioctl.h>
#include<stdlib.h> //strlen
#include<sys/socket.h>
#include<arpa/inet.h> //inet_addr
#include<unistd.h> //write
#include<pthread.h> //for threading , link with lpthread
//the thread function
void *connection_handler(void *);
//my code
#define SENSORS
#define LIGHTS
// Linked data structure
struct State {
int Out;
int Time;
int Next[4];};
typedef const struct State STyp;
#define goS 0
#define waitS 1
#define goW 2
#define waitW 3
STyp FSM[4]={
{0x21,3000,{goS,waitS,goS,waitS}}, //State 0 (goS) go South.
{0x22, 500,{goW,goW,goW,goW}}, //State 1 (waitS) wait South.
{0x0C,3000,{goW,goW,waitW,waitW}}, //State 2 (goW) go West.
{0x14, 500,{goS,goS,goS,goS}}}; //State 3 (waitW) wait West.
int State; // index to the current state
int Input;
///////////
int main(int argc , char *argv[])
{
int socket_desc , client_sock ,rc, c , *new_sock;
struct sockaddr_in server , client;
int on=1;
//Create socket
socket_desc = socket(AF_INET , SOCK_STREAM , 0);
if (socket_desc == -1)
{
printf("Could not create socket");
}
puts("Socket created");
/*************************************************************/
/* Allow socket descriptor to be reuseable */
/*************************************************************/
rc = setsockopt( socket_desc, SOL_SOCKET, SO_REUSEADDR,
(char *)&on, sizeof(on));
if (rc < 0)
{
perror("setsockopt() failed");
close(socket_desc);
exit(-1);
}
/*************************************************************/
/* Set socket to be nonblocking. All of the sockets for */
/* the incoming connections will also be nonblocking since */
/* they will inherit that state from the listening socket. */
/*************************************************************/
rc = ioctl( socket_desc, FIONBIO, (char *)&on);
if (rc < 0)
{
perror("ioctl() failed");
close(socket_desc);
exit(-1);
}
//Prepare the sockaddr_in structure
server.sin_family = AF_INET;
server.sin_addr.s_addr = INADDR_ANY;
server.sin_port = htons( 8888 );
//Bind
if( bind(socket_desc,(struct sockaddr *)&server , sizeof(server)) < 0)
{
//print the error message
perror("bind failed. Error");
return 1;
}
puts("bind done");
//Listen
listen(socket_desc , 3);
//Accept and incoming connection
puts("Waiting for incoming connections...");
c = sizeof(struct sockaddr_in);
//Accept and incoming connection
puts("Waiting for incoming connections...");
c = sizeof(struct sockaddr_in);
while(1 ){
if ((client_sock = accept(socket_desc, (struct sockaddr *)&client, (socklen_t*)&c))>=0)
{
puts("Connection accepted");
pthread_t sniffer_thread;
new_sock = malloc(sizeof(int));
*new_sock = client_sock;
if( pthread_create( &sniffer_thread , NULL , connection_handler , (void*) new_sock) < 0)
{
perror("could not create thread");
return 1;
}
//Now join the thread , so that we dont terminate before the thread
//pthread_join( sniffer_thread , NULL);
puts("Handler assigned");
}
}
if (client_sock < 0)
{
perror("accept failed");
return 1;
}
return 0;
}
/*
* This will handle connection for each client
* */
char client_message[2000];
void *connection_handler(void *socket_desc)
{
//Get the socket descriptor
int sock = *(int*)socket_desc;
int read_size;
char *message;
//Send some messages to the client
message = "Greetings! I am your connection handler\n";
write(sock , message , strlen(message));
message = "Now type something and i shall repeat what you type \n";
write(sock , message , strlen(message));
//Receive a message from client
while( (read_size = recv(sock , client_message , 2000 , 0)) > 0 )
{
int x = FSM[state].out; // set lights
// delay(FSM[tate].Time);
Input = 1; // read sensors
State = FSM[State].Next[Input];
printf("received %s\n",client_message);
//Send the message back to client
write(sock , client_message , strlen(client_message));
}
if(read_size == 0)
{
puts("Client disconnected");
fflush(stdout);
}
else if(read_size == -1)
{
perror("recv failed");
}
//Free the socket pointer
free(socket_desc);
return 0;
}