示例#1
0
//-----------------------------------------------------------------------------
static void logic_tick(void *d)
{
	TcpClientState *state = (TcpClientState *) d;

	float currTime = glfwGetTime();
	if (state->waiting || currTime < state->last_post_time + state->post_delay)
		return;
	state->last_post_time = currTime;
	
	uint32_t packet_size = 5;	
	Netcmd *cmd;
		
	while ((cmd = queue_first(state->out)) != NULL) {
		memcpy(packet + packet_size, cmd, command_size(cmd));
		packet_size += command_size(cmd);	
		queue_pop(state->out);
	}
		
	uint32_t data_size = packet_size - sizeof(uint32_t)-1;
	packet[0] = TCP_MSG_CMDS;
	memcpy(packet+1, &data_size, sizeof(uint32_t));
			
	tcpclient_write(state->socket, packet, packet_size);
	state->waiting = 1;
	state->wait_start = glfwGetTime();
}
示例#2
0
int
hokuyo::Laser::laserWrite(const char* msg)
{
#if HOKUYO_INTERFACE_ETHERNET

   ssize_t len = strlen(msg);
   ssize_t retval = tcpclient_write(&tcpclient, msg, len);

#else
  // IO is currently non-blocking. This is what we want for the more common read case.
  int origflags = fcntl(laser_fd_,F_GETFL,0);
  fcntl(laser_fd_, F_SETFL, origflags & ~O_NONBLOCK); // @todo can we make this all work in non-blocking?
  ssize_t len = strlen(msg);
  ssize_t retval = write(laser_fd_, msg, len);
  int fputserrno = errno;
  fcntl(laser_fd_, F_SETFL, origflags | O_NONBLOCK);
  errno = fputserrno; // Don't want to see the fcntl errno below.
#endif
  
  if (retval != -1)
  {
#ifdef USE_LOG_FILE
    if (strlen(msg) > 1)
    {
      long long outtime = timeHelper();
      fprintf(logfile, "Out: %lli.%09lli %s\n", outtime / 1000000000L, outtime % 1000000000L, msg);
    }
#endif
    return retval;
  }
  else
    HOKUYO_EXCEPT(hokuyo::Exception, "fputs failed -- Error = %d: %s", errno, strerror(errno));
}
示例#3
0
//-----------------------------------------------------------------------------
void tcpclientstate_login(void *d, void *login_data, uint32_t ldsize)
{
	TcpClientState *state = (TcpClientState *) d;
	packet[0] = TCP_MSG_LOGIN;
	memcpy(packet+1, &ldsize, 4);
	memcpy(packet+5, login_data, ldsize);
	tcpclient_write(state->socket, packet, 5+ldsize);

	tcpclientstate_wait_for_snapshot(d);	
}
示例#4
0
static void
_recv(void *env,rain_routine_t src,struct rainMsg msg,rain_session_t session)
{
    tcpsvr_t * svr = (tcpsvr_t *)env;
    tcp_cmd_t * p = (tcp_cmd_t *)(msg.data);
    tcpclient_t *cli = tcpsvr_query(svr,p->id);
    if(cli) {
        if(p->cmd == CMD_SEND) {
            int ret = tcpclient_write(cli,NULL,0);
            if(ret < 0) {
                printf("send:error");
            }
        } else if(p->cmd == CMD_CLOSE) {
            tcpclient_destroy(cli);
        }
    } else if(session != RAIN_INVALID_SESSION) {
        char buf[]="error_cmd";
        struct rainMsg tmpmsg= {buf,sizeof(buf),-1};
        rain_responce(svr->ctx,src,tmpmsg,RAIN_COPY,session);
    }
    free(msg.data);
}
示例#5
0
//-----------------------------------------------------------------------------
static void send_confirmation(TcpClientState *state)
{
	packet[0] = TCP_MSG_CONFIRM;
	memset(packet+1, 0, 4);
	tcpclient_write(state->socket, packet, 5);
}