/* Attempts to receive a packet from 'rc'. If successful, returns the packet; * otherwise, returns a null pointer. The caller is responsible for freeing * the packet (with ofpbuf_delete()). */ struct rfpbuf * rconn_recv(struct rconn *rc) { if (rc->state & (S_ACTIVE | S_IDLE)) { struct rfpbuf *buffer; int error = vconn_recv(rc->vconn, &buffer); if (!error) { if (rc->state == S_IDLE) { state_transition(rc, S_ACTIVE); } return buffer; } else if (error != EAGAIN) { if(error == ECONNRESET) { printf("The connection has been closed\n"); rconn_disconnect(rc); return NULL; } else { printf("An error has occured\n"); rconn_disconnect(rc); } } } return NULL; }
int main(void) { int i = 0; int k = 0; int status = 0; int tape[N] = {0,0,1,1,0,0,1,1,1,0,0}; while(status != 5){ state_transition(&status,tape,&i); printf("<step%d>\n", i-1); if(status < 5){ printf("state:q_%d\n", status); }else{ printf("state:q_H\n"); } print_array(tape); k++; } return 0; }
/* Drops any existing connection on 'rc', then configures 'rc' to use * 'vconn'. If the connection on 'vconn' drops, 'rc' will not reconnect on it * own. * * By default, the target obtained from vconn_get_name(vconn) is used in log * messages. If 'name' is nonnull, then it is used instead. It should * presumably give more information to a human reader than the target, but it * need not be acceptable to vconn_open(). */ void rconn_connect_unreliably(struct rconn *rc, struct vconn *vconn, const char *name) { assert(vconn != NULL); rconn_disconnect(rc); rconn_set_target__(rc, vconn_get_name(vconn)); // rc->reliable = false; rc->vconn = vconn; // rc->last_connected = time_now(); state_transition(rc, S_ACTIVE); }
void rconn_disconnect(struct rconn *rc) { if (rc->state != S_VOID) { if (rc->vconn) { vconn_close(rc->vconn); rc->vconn = NULL; } rconn_set_target__(rc, "void"); state_transition(rc, S_VOID); } }
void rconn_connect_unreliably(struct rconn *rc, const char *name, struct vconn *vconn) { assert(vconn != NULL); rconn_disconnect(rc); free(rc->name); rc->name = xstrdup(name); rc->reliable = false; rc->vconn = vconn; rc->last_connected = time_now(); state_transition(rc, S_ACTIVE); }
static void run_CONNECTING(struct rconn *rc) { int retval = vconn_connect(rc->vconn); if (!retval) { printf("%s: connected", rc->target); state_transition(rc, S_ACTIVE); } else if (retval != EAGAIN) { printf("%s: connection failed (%s)", rc->target, strerror(retval)); rconn_disconnect(rc); } }
void rconn_disconnect(struct rconn *rc) { if (rc->state != S_VOID) { if (rc->vconn) { vconn_close(rc->vconn); rc->vconn = NULL; } rconn_set_target__(rc, "void", NULL); rc->reliable = false; rc->backoff = 0; rc->backoff_deadline = TIME_MIN; state_transition(rc, S_VOID); } }
void rconn_disconnect(struct rconn *rc) { if (rc->state != S_VOID) { if (rc->vconn) { vconn_close(rc->vconn); rc->vconn = NULL; } free(rc->name); rc->name = xstrdup("void"); rc->reliable = false; rc->backoff = 0; rc->backoff_deadline = TIME_MIN; state_transition(rc, S_VOID); } }
static void reconnect(struct rconn *rc) { int retval; retval = vconn_open(rc->target, RFP10_VERSION, &rc->vconn, DSCP_DEFAULT); if (!retval) { // rc->remote_ip = vconn_get_remote_ip(rc->vconn); // rc->local_ip = vconn_get_local_ip(rc->vconn); // rc->remote_port = vconn_get_remote_port(rc->vconn); state_transition(rc, S_CONNECTING); } else { printf("%s: connection failed (%s)", rc->target, strerror(retval)); rconn_disconnect(rc); } }
void error_recoverable_error (void) { error_broadcast_error_code (err_sev_recoverable, error_code); state_transition (state_idle); }