void nn_stream_init (struct nn_stream *self, struct nn_epbase *epbase, struct nn_usock *usock) { int rc; int protocol; size_t sz; struct nn_iobuf iobuf; /* Redirect the underlying socket's events to this state machine. */ self->usock = usock; self->sink = &nn_stream_state_start; self->original_sink = nn_usock_setsink (usock, &self->sink); /* Initialise the pipe to communicate with the user. */ rc = nn_pipebase_init (&self->pipebase, &nn_stream_pipebase_vfptr, epbase); nn_assert (rc == 0); nn_msg_init (&self->inmsg, 0); nn_msg_init (&self->outmsg, 0); /* Start the header timeout timer. */ nn_timer_init (&self->hdr_timeout, &self->sink, usock->cp); nn_timer_start (&self->hdr_timeout, 1000); /* Send the protocol header. */ sz = sizeof (protocol); nn_epbase_getopt (epbase, NN_SOL_SOCKET, NN_PROTOCOL, &protocol, &sz); errnum_assert (rc == 0, -rc); nn_assert (sz == sizeof (protocol)); memcpy (self->protohdr, "\0\0SP\0\0\0\0", 8); nn_puts (self->protohdr + 4, (uint16_t) protocol); iobuf.iov_base = self->protohdr; iobuf.iov_len = 8; nn_usock_send (usock, &iobuf, 1); }
void nn_stcp_init(struct nn_stcp *self,int32_t src,struct nn_epbase *epbase,struct nn_fsm *owner) { nn_fsm_init(&self->fsm,nn_stcp_handler,nn_stcp_shutdown,src,self,owner); self->state = NN_STCP_STATE_IDLE; nn_streamhdr_init(&self->streamhdr,NN_STCP_SRC_STREAMHDR,&self->fsm); self->usock = NULL; self->usock_owner.src = -1; self->usock_owner.fsm = NULL; nn_pipebase_init(&self->pipebase,&nn_stcp_pipebase_vfptr,epbase); self->instate = -1; nn_msg_init(&self->inmsg,0); self->outstate = -1; nn_msg_init(&self->outmsg,0); nn_fsm_event_init(&self->done); }
void nn_sws_init (struct nn_sws *self, int src, struct nn_epbase *epbase, struct nn_fsm *owner) { nn_fsm_init (&self->fsm, nn_sws_handler, nn_sws_shutdown, src, self, owner); self->state = NN_SWS_STATE_IDLE; nn_wshdr_init (&self->wshdr, NN_SWS_SRC_HANDSHAKE, &self->fsm); self->usock = NULL; self->usock_owner.src = -1; self->usock_owner.fsm = NULL; nn_pipebase_init (&self->pipebase, &nn_sws_pipebase_vfptr, epbase); self->instate = -1; nn_list_init (&self->inmsg_array); self->outstate = -1; nn_msg_init (&self->outmsg, 0); self->continuing = 0; nn_fsm_event_init (&self->done); }