GestureServer.cpp
上传用户:lijia5631
上传日期:2008-11-10
资源大小:1214k
文件大小:13k
源码类别:

视频捕捉/采集

开发平台:

MultiPlatform

  1. /**
  2.   * HandVu - a library for computer vision-based hand gesture
  3.   * recognition.
  4.   * Copyright (C) 2004 Mathias Kolsch, matz@cs.ucsb.edu
  5.   *
  6.   * This program is free software; you can redistribute it and/or
  7.   * modify it under the terms of the GNU General Public License
  8.   * as published by the Free Software Foundation; either version 2
  9.   * of the License, or (at your option) any later version.
  10.   *
  11.   * This program is distributed in the hope that it will be useful,
  12.   * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13.   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  14.   * GNU General Public License for more details.
  15.   *
  16.   * You should have received a copy of the GNU General Public License
  17.   * along with this program; if not, write to the Free Software
  18.   * Foundation, Inc., 59 Temple Place - Suite 330, 
  19.   * Boston, MA  02111-1307, USA.
  20.   *
  21.   * $Id: GestureServer.cpp,v 1.8 2006/01/03 21:44:15 matz Exp $
  22. **/
  23. // GestureServer.cpp: TCP/IP and UDP server
  24. //
  25. #include "Common.h"
  26. #include "GestureServer.h"
  27. #include "Exceptions.h"
  28. #include "OSCpacket.h"
  29. #include <sys/types.h>
  30. #include <errno.h>
  31. #ifndef WIN32
  32. #if !defined(HAVE_ARPA_INET_H) || !defined(HAVE_NETINET_IN_H) || !defined(HAVE_FCNTL_H) || !defined(HAVE_SYS_SOCKET_H) || !defined(HAVE_SOCKET) || !defined(HAVE_STRERROR)
  33. #error need socket interfaces
  34. #endif
  35. #include <fcntl.h>
  36. #include <sys/socket.h>
  37. #include <unistd.h>
  38. #include <netinet/in.h>
  39. #include <arpa/inet.h>
  40. #endif
  41. #ifdef USE_MFC
  42. #ifdef _DEBUG
  43. #define new DEBUG_NEW
  44. #undef THIS_FILE
  45. static char THIS_FILE[] = __FILE__;
  46. #endif // _DEBUG
  47. #endif // USE_MFC
  48. /////////////////////////////////////////////////////////////////////////////
  49. // GestureServer
  50. GestureServer::GestureServer()
  51.   : m_started(false)
  52. {
  53. }
  54. GestureServer& GestureServer::operator=(const GestureServer&)
  55. {
  56.   ASSERT(0);  // must be overidden
  57.   return *this;
  58. }
  59. void GestureServer::SetNonBlocking(SOCKET sd)
  60. {
  61. #ifdef WIN32
  62.   u_long flags = 1;
  63.   int error = 
  64.     ioctlsocket(sd, FIONBIO, &flags);
  65.   if (error!=0) {
  66.     //    int errcode = WSAGetLastError();
  67.     throw HVException("can not set socket to non-blocking");
  68.   }
  69.   
  70. #else
  71.   
  72.   int error = 
  73.     fcntl(sd, F_SETFL, O_NONBLOCK);
  74.   if (error!=0) {
  75.     throw HVException(string("can not set server socket to non-blocking: ")
  76.       + strerror(errno));
  77.   }
  78. #endif
  79. }
  80. /////////////////////////////////////////////////////////////////////////////
  81. // GestureServerStream
  82. GestureServerStream::GestureServerStream(int port, int max_num_clients)
  83.   : GestureServer(),
  84.     m_port(port),
  85.     m_max_num_clients(max_num_clients),
  86.     m_server_sd(0)
  87. {
  88. }
  89. GestureServerStream::GestureServerStream(const GestureServerStream& from)
  90.   : GestureServer(),
  91.     m_port(from.m_port),
  92.     m_max_num_clients(from.m_max_num_clients),
  93.     m_server_sd(0)
  94. {
  95.   if (from.m_started) {
  96.     throw HVException("can not copy this GestureServer - it has been started");
  97.   }
  98. }
  99. GestureServerStream::~GestureServerStream()
  100. {
  101.   if (m_started) {
  102.     Stop();
  103.   }
  104. }
  105. GestureServerStream& GestureServerStream::operator=(const GestureServerStream& from)
  106. {
  107.   if (m_started) {
  108.     VERBOSE0(5, "GestureServerStream::operator=: warning: stopping *this!");
  109.     Stop();
  110.   }
  111.   if (from.m_started) {
  112.     throw HVException("can not copy this GestureServerStream - it has been started");
  113.   }
  114.   m_port = from.m_port;
  115.   m_max_num_clients = from.m_max_num_clients;
  116.   m_server_sd = 0;
  117.   m_started = false;
  118.   return *this;
  119. }
  120. void GestureServerStream::Start()
  121. {
  122.   if (m_started) {
  123.     throw HVException("GestureServerStream has already been started");
  124.   }
  125.   
  126.   InitSockets();
  127.   // create, bind, listen socket, set to non-blocking
  128.   m_server_sd = socket(PF_INET, SOCK_STREAM, 0);
  129. #ifdef WIN32
  130.   if (m_server_sd==INVALID_SOCKET || m_server_sd==SOCKET_ERROR) {
  131.     int errval = WSAGetLastError();
  132.     throw HVException(string("error during socket creation: ") 
  133.                       + strerror(errval));
  134.   }
  135. #else
  136.   if (m_server_sd==-1) {
  137.     throw HVException(string("error during socket creation: ") 
  138.                       + strerror(errno));
  139.   }
  140. #endif
  141.   // non-blocking
  142.   SetNonBlocking(m_server_sd);
  143.   // bind socket
  144.   struct sockaddr_in server_sock_addr;
  145.   memset(&server_sock_addr, 0, sizeof(server_sock_addr));
  146.   server_sock_addr.sin_family = AF_INET;
  147.   server_sock_addr.sin_addr.s_addr = INADDR_ANY;
  148.   server_sock_addr.sin_port = htons((unsigned short) m_port);
  149.   int error =
  150.     bind(m_server_sd, (struct sockaddr*) &server_sock_addr, 
  151.  sizeof(server_sock_addr));
  152.   if (error!=0) {
  153.     char buf[256];
  154.     sprintf(buf, "%d", m_port);
  155.     string err = string("GestureServer can not bind socket to port ") + buf;
  156.     throw HVException(err);
  157.   }
  158.   // listen with socket
  159.   error = listen(m_server_sd, m_max_num_clients);
  160.   if (error!=0) {
  161.     throw HVException("can not listen on socket");
  162.   }
  163.   m_started = true;
  164. }
  165. void GestureServerStream::Stop()
  166. {
  167.   if (!m_started) {
  168.     throw HVException("GestureServer had not been started");
  169.   }
  170. #ifdef WIN32
  171.   closesocket(m_server_sd);
  172. #else
  173.   close(m_server_sd);
  174. #endif
  175.   for (SocketList::iterator it = m_client_sds.begin();
  176.        it != m_client_sds.end();
  177.        it ++) {
  178. #ifdef WIN32
  179.     closesocket(*it);
  180. #else
  181.     close(*it);
  182. #endif
  183.   }
  184.   m_started = false;
  185. }
  186. void GestureServerStream::Send(const HVState& state)
  187. {
  188.   if (!m_started) {
  189.     throw HVException("GestureServer has not been started");
  190.   }
  191.   
  192.   // check for new clients
  193.   CheckForNewClients();
  194.   
  195.   string str;
  196.   char* buf = (char*) alloca(256+state.m_posture.size());
  197.   float orientation = 0; 
  198.   sprintf(buf, GESTUREEVENT_VERSION_STRING
  199.   " %lld %d: %d, %d, "%s" (%f, %f) [%f, %f]rn",
  200. #ifdef WIN32
  201.   (long) state.m_tstamp,
  202. #else
  203.   state.m_tstamp,
  204. #endif
  205.   state.m_obj_id, (int) state.m_tracked,
  206.   (int) state.m_recognized, 
  207.   state.m_posture.c_str(), 
  208.   (float) state.m_center_xpos, (float) state.m_center_ypos,
  209.   (float) state.m_scale, orientation);
  210.   str = string(buf);
  211.   
  212.   SocketList::iterator deleteme = m_client_sds.end();
  213.   for (SocketList::iterator it = m_client_sds.begin();
  214.        it != m_client_sds.end();
  215.        it ++) {
  216.     if (deleteme!=m_client_sds.end()) {
  217.       m_client_sds.erase(deleteme);
  218.       deleteme = m_client_sds.end();
  219.     }
  220.     int flags = 0;
  221. #ifndef WIN32
  222.     flags = MSG_NOSIGNAL;
  223. #endif
  224.     int bytes = send(*it, str.c_str(), (int)str.size()+1, flags);
  225.     
  226.     if (bytes==(int)str.size()+1) {
  227.       // all went fine
  228.       
  229. #ifdef WIN32
  230.     } else if (bytes==SOCKET_ERROR) {
  231.       int errval = WSAGetLastError();
  232.       if (errval==EPIPE 
  233.           || errval==WSAESHUTDOWN || errval==WSAEHOSTUNREACH
  234.           || errval==WSAECONNABORTED || errval==WSAECONNRESET 
  235.           || errval==WSAETIMEDOUT)
  236. #else
  237.     } else if (bytes==-1) {
  238.       if (errno==EPIPE 
  239.           || errno==ESHUTDOWN || errno==EHOSTUNREACH
  240.           || errno==ECONNABORTED || errno==ECONNRESET 
  241.           || errno==ETIMEDOUT)
  242. #endif
  243.       {
  244.         // broken connection - throw out this client
  245.         VERBOSE0(2, "GestureServer::Send(): "
  246.  "broken connection, discarding client");
  247.         deleteme = it;
  248.       } else {
  249.         VERBOSE1(2, "warning: ignoring error in GestureServer::Send(): %s",
  250.  strerror(errno));
  251.         // EAGAIN: data didn't fit into the buffer
  252.         // EMSGSIZE: message size waaaay too big
  253.       }
  254.       
  255.     } else if (bytes>0 && bytes != (int)str.size()+1) {
  256.       VERBOSE0(2, "warning: ignoring error in GestureServer::Send(): "
  257.        "not all bytes of message were sent");
  258.       
  259.     } else {
  260.       VERBOSE0(2, "warning: ignoring unknown error in GestureServer::Send()");
  261.     }
  262.   }
  263.   if (deleteme!=m_client_sds.end()) {
  264.     m_client_sds.erase(deleteme);
  265.   }
  266. }
  267. void GestureServerStream::CheckForNewClients()
  268. {
  269.   struct sockaddr_in client_addr;
  270. #ifdef WIN32
  271.   int client_sock_len = sizeof(struct sockaddr);
  272. #else
  273.   socklen_t client_sock_len = (socklen_t) sizeof(struct sockaddr);
  274. #endif
  275.   SOCKET client_sd = accept(m_server_sd,
  276.     (struct sockaddr*) &client_addr, &client_sock_len);
  277. #ifdef WIN32
  278.   if (client_sd!=SOCKET_ERROR)
  279. #else
  280.   if (client_sd!=-1)
  281. #endif
  282.   {
  283.     // a new client is requesting connection
  284. #ifdef HAVE_INET_NTOA
  285.     VERBOSE2(3, "client connected on port %d from IP %s",
  286.      m_port, inet_ntoa(client_addr.sin_addr));
  287. #else
  288.     VERBOSE1(3, "client connected on port %d", m_port);
  289. #endif
  290.     
  291.     // set non-blocking
  292.     SetNonBlocking(client_sd);
  293.     
  294.     m_client_sds.push_back(client_sd);
  295.   }
  296. }
  297. void GestureServerStream::InitSockets()
  298. {
  299. #ifdef WIN32
  300.   static bool WSAInitialized = false;
  301.   if (!WSAInitialized) {
  302.     WORD wVersionRequested;
  303.     WSADATA wsaData;
  304.     
  305.     wVersionRequested = MAKEWORD(2, 2);
  306.     
  307.     int err = WSAStartup(wVersionRequested, &wsaData);
  308.     if (err) {
  309.       throw HVException("could not find usable WinSock DLL");
  310.     }
  311.     
  312.     /* Confirm that the WinSock DLL supports 2.2.*/
  313.     /* Note that if the DLL supports versions greater    */
  314.     /* than 2.2 in addition to 2.2, it will still return */
  315.     /* 2.2 in wVersion since that is the version we      */
  316.     /* requested.                                        */
  317.     
  318.     if ( LOBYTE( wsaData.wVersion ) != 2 ||
  319.  HIBYTE( wsaData.wVersion ) != 2 ) {
  320.       WSACleanup();
  321.       throw HVException("could not find WinSock DLL >= 2.2");
  322.     }
  323.     WSAInitialized = true;
  324.   }
  325. #endif
  326. }
  327. /////////////////////////////////////////////////////////////////////////////
  328. // GestureServerOSC
  329. GestureServerOSC::GestureServerOSC(string dest_ip, int dest_port)
  330.   : GestureServer(),
  331.     m_dest_ip(dest_ip),
  332.     m_dest_port(dest_port),
  333.     m_server_sd(0)
  334. {
  335. }
  336. GestureServerOSC::GestureServerOSC(const GestureServerOSC& from)
  337.   : GestureServer(),
  338.     m_dest_ip(from.m_dest_ip),
  339.     m_dest_port(from.m_dest_port),
  340.     m_server_sd(0)
  341. {
  342.   if (from.m_started) {
  343.     throw HVException("can not copy this GestureServer - it has been started");
  344.   }
  345. }
  346. GestureServerOSC::~GestureServerOSC()
  347. {
  348.   if (m_started) {
  349.     Stop();
  350.   }
  351. }
  352. GestureServerOSC& GestureServerOSC::operator=(const GestureServerOSC& from)
  353. {
  354.   if (m_started) {
  355.     VERBOSE0(5, "GestureServerOSC::operator=: warning: stopping *this!");
  356.     Stop();
  357.   }
  358.   if (from.m_started) {
  359.     throw HVException("can not copy this GestureServerOSC - it has been started");
  360.   }
  361.   m_dest_ip = from.m_dest_ip;
  362.   m_dest_port = from.m_dest_port;
  363.   m_server_sd = from.m_server_sd;
  364.   m_started = false;
  365.   return *this;
  366. }
  367. void GestureServerOSC::Start()
  368. {
  369.   if (m_started) {
  370.     throw HVException("GestureServerOSC has already been started");
  371.   }
  372.   
  373.   // create socket, set to non-blocking
  374.   m_server_sd = socket(PF_INET, SOCK_DGRAM, 0);
  375. #ifdef WIN32
  376.   if (m_server_sd==INVALID_SOCKET || m_server_sd==SOCKET_ERROR) {
  377.     int errval = WSAGetLastError();
  378.     throw HVException(string("error during socket creation: ") 
  379.                       + strerror(errval));
  380.   }
  381. #else
  382.   if (m_server_sd==-1) {
  383.     throw HVException(string("error during socket creation: ") 
  384.                       + strerror(errno));
  385.   }
  386. #endif
  387.   // non-blocking
  388.   SetNonBlocking(m_server_sd);
  389.   m_started = true;
  390. }
  391. void GestureServerOSC::Stop()
  392. {
  393.   if (!m_started) {
  394.     throw HVException("GestureServer had not been started");
  395.   }
  396. #ifdef WIN32
  397.   closesocket(m_server_sd);
  398. #else
  399.   close(m_server_sd);
  400. #endif
  401.   
  402.   m_started = false;
  403. }
  404. void GestureServerOSC::Send(const HVState& state)
  405. {
  406.   if (!m_started) {
  407.     throw HVException("GestureServer has not been started");
  408.   }
  409.   m_packet.Clear();
  410.   m_packet.SetAddress("/gesture_event");
  411.   m_packet.AddInt((int) state.m_tstamp);
  412.   m_packet.AddInt(state.m_obj_id);
  413.   m_packet.AddInt(state.m_tracked);
  414.   m_packet.AddInt(state.m_recognized);
  415.   m_packet.AddString(state.m_posture);
  416.   m_packet.AddFloat((float)state.m_center_xpos);
  417.   m_packet.AddFloat((float)state.m_center_ypos);
  418.   m_packet.AddFloat((float)state.m_scale);
  419.   float orientation = 0.0;
  420.   m_packet.AddFloat(orientation);
  421.   int flags = 0;
  422.   struct sockaddr_in dest_sock_addr;
  423.   memset(&dest_sock_addr, 0, sizeof(dest_sock_addr));
  424.   dest_sock_addr.sin_family = AF_INET;
  425. #ifdef WIN32
  426.   dest_sock_addr.sin_addr.S_un.S_addr = inet_addr(m_dest_ip.c_str());
  427.   if (dest_sock_addr.sin_addr.S_un.S_addr == INADDR_NONE)
  428. #else
  429.   int success = inet_aton(m_dest_ip.c_str(), &dest_sock_addr.sin_addr);
  430.   if (!success)
  431. #endif
  432.   {
  433.     throw HVException(string("invalid address: ") + m_dest_ip);
  434.   }
  435.   dest_sock_addr.sin_port = htons((unsigned short) m_dest_port);
  436.   int sent = sendto(m_server_sd, m_packet.GetBytes(), m_packet.GetSize(), flags,
  437.     (sockaddr*) &dest_sock_addr, sizeof(dest_sock_addr));
  438. #ifdef WIN32
  439.   if (sent==SOCKET_ERROR) {
  440.     int last_error = GetLastError();
  441.     char msg[250];
  442.     sprintf(msg, "error sending OSC message (errno %d)", last_error);
  443.     throw HVException(msg);
  444.   }
  445. #else
  446.   if (sent==-1) {
  447.     throw HVException(string("error sending OSC message: ") +
  448.       strerror(errno));
  449.   }
  450. #endif
  451. }