Tcp_ServerSocket.cxx
上传用户:sy_wanhua
上传日期:2013-07-25
资源大小:3048k
文件大小:8k
源码类别:

流媒体/Mpeg4/MP4

开发平台:

C/C++

  1. /* ====================================================================
  2.  * The Vovida Software License, Version 1.0 
  3.  * 
  4.  * Copyright (c) 2000 Vovida Networks, Inc.  All rights reserved.
  5.  * 
  6.  * Redistribution and use in source and binary forms, with or without
  7.  * modification, are permitted provided that the following conditions
  8.  * are met:
  9.  * 
  10.  * 1. Redistributions of source code must retain the above copyright
  11.  *    notice, this list of conditions and the following disclaimer.
  12.  * 
  13.  * 2. Redistributions in binary form must reproduce the above copyright
  14.  *    notice, this list of conditions and the following disclaimer in
  15.  *    the documentation and/or other materials provided with the
  16.  *    distribution.
  17.  * 
  18.  * 3. The names "VOCAL", "Vovida Open Communication Application Library",
  19.  *    and "Vovida Open Communication Application Library (VOCAL)" must
  20.  *    not be used to endorse or promote products derived from this
  21.  *    software without prior written permission. For written
  22.  *    permission, please contact vocal@vovida.org.
  23.  *
  24.  * 4. Products derived from this software may not be called "VOCAL", nor
  25.  *    may "VOCAL" appear in their name, without prior written
  26.  *    permission of Vovida Networks, Inc.
  27.  * 
  28.  * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESSED OR IMPLIED
  29.  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
  30.  * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, TITLE AND
  31.  * NON-INFRINGEMENT ARE DISCLAIMED.  IN NO EVENT SHALL VOVIDA
  32.  * NETWORKS, INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT DAMAGES
  33.  * IN EXCESS OF $1,000, NOR FOR ANY INDIRECT, INCIDENTAL, SPECIAL,
  34.  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
  35.  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
  36.  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
  37.  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  38.  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
  39.  * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
  40.  * DAMAGE.
  41.  * 
  42.  * ====================================================================
  43.  * 
  44.  * This software consists of voluntary contributions made by Vovida
  45.  * Networks, Inc. and many individuals on behalf of Vovida Networks,
  46.  * Inc.  For more information on Vovida Networks, Inc., please see
  47.  * <http://www.vovida.org/>.
  48.  *
  49.  */
  50. static const char* const TcpServerSocket_cxx_Version =
  51.     "$Id: Tcp_ServerSocket.cxx,v 1.2 2001/07/25 20:24:35 bko Exp $";
  52. #ifndef __vxworks
  53. #include <errno.h>
  54. #include <unistd.h>
  55. #include <netinet/in.h>
  56. #include <arpa/inet.h>
  57. #include <stdio.h>
  58. #ifndef WIN32
  59. #include <strings.h>
  60. #else
  61. #include <string.h>
  62. #endif
  63. #include "VNetworkException.hxx"
  64. #include "Tcp_ServerSocket.hxx"
  65. #include "VEnvVar.hxx"
  66. #include "cpLog.h"
  67. #define LISTENQ   15
  68. TcpServerSocket::TcpServerSocket(int servPort) throw (VNetworkException&)
  69. {
  70.     _serverConn._connId = ::socket(AF_INET, SOCK_STREAM, 0);
  71.     if (_serverConn._connId < 0)
  72.     {
  73.         // this is an error to do something
  74.         char buf[256];
  75.         sprintf(buf, "socket failed, reason: %s", strerror(errno));
  76.         cpLog(LOG_ALERT, "%s", buf);
  77.         throw VNetworkException(buf, __FILE__, __LINE__, errno);
  78.     }
  79.     int on = 1;
  80. #ifndef WIN32
  81.     if ( setsockopt ( _serverConn._connId, SOL_SOCKET, SO_REUSEADDR,
  82.                       &on, sizeof ( on )) )
  83.     {
  84.         // this is an error -- can't set it
  85.         char buf[256];
  86.         sprintf(buf, "setsockopt failed, reason: %s", strerror(errno));
  87.         cpLog(LOG_ALERT, "%s", buf);
  88.         throw VNetworkException(buf, __FILE__, __LINE__, errno);
  89.     }
  90.     bzero(&_serverConn._connAddr, sizeof(_serverConn._connAddr));
  91.     bzero(&_clientConn._connAddr, sizeof(_clientConn._connAddr));
  92. #else
  93.     memset(&_serverConn._connAddr, 0, sizeof(_serverConn._connAddr));
  94.     memset(&_clientConn._connAddr, 0, sizeof(_clientConn._connAddr));
  95. #endif
  96.     _serverConn._connAddr.sin_family = AF_INET;
  97.     _serverConn._connAddr.sin_addr.s_addr = htonl(INADDR_ANY);
  98.     _serverConn._connAddr.sin_port = htons(servPort);
  99.     if (::bind(_serverConn._connId,
  100.                (SA*)&_serverConn._connAddr,
  101.                sizeof(_serverConn._connAddr))
  102.        )
  103.     {
  104.         char buf[256];
  105.         sprintf(buf, "Port %d, bind failed, reason:%s", servPort, strerror(errno));
  106.         cpLog(LOG_ALERT, "%s", buf);
  107.         throw VNetworkException(buf, __FILE__, __LINE__, errno);
  108.     }
  109.     if (::listen(_serverConn._connId, LISTENQ))
  110.     {
  111.         char buf[256];
  112.         sprintf(buf, "listen failed, reason:%s", strerror(errno));
  113.         cpLog(LOG_ALERT, "%s", buf);
  114.         throw VNetworkException(buf, __FILE__, __LINE__, errno);
  115.     }
  116. }
  117. TcpServerSocket::TcpServerSocket(const TcpServerSocket& other)
  118. {
  119.     _serverConn = other._serverConn;
  120.     _clientConn = other._clientConn;
  121. }
  122. TcpServerSocket&
  123. TcpServerSocket::operator=(TcpServerSocket& other)
  124. {
  125.     if (this != &other)
  126.     {
  127.         _serverConn = other._serverConn;
  128.         _clientConn = other._clientConn;
  129.     }
  130.     return *this;
  131. }
  132. TcpServerSocket::TcpServerSocket() throw (VNetworkException&)
  133. {
  134.     _serverConn._connId = ::socket(AF_INET, SOCK_STREAM, 0);
  135.     if (_serverConn._connId < 0)
  136.     {
  137.         // this is an error to do something
  138.         char buf[256];
  139.         sprintf(buf, "socket failed, reason: %s", strerror(errno));
  140.         cpLog(LOG_ALERT, "%s", buf);
  141.         throw VNetworkException(buf, __FILE__, __LINE__, errno);
  142.     }
  143. #ifndef WIN32
  144.     int on = 1;
  145.     if ( setsockopt ( _serverConn._connId, SOL_SOCKET, SO_REUSEADDR,
  146.                       &on, sizeof ( on )) )
  147.     {
  148.         // this is an error -- can't set it
  149.         char buf[256];
  150.         sprintf(buf, "setsockopt failed, reason: %s", strerror(errno));
  151.         cpLog(LOG_ALERT, "%s", buf);
  152.         throw VNetworkException(buf, __FILE__, __LINE__, errno);
  153.     }
  154.     bzero(&_serverConn._connAddr, sizeof(_serverConn._connAddr));
  155.     bzero(&_clientConn._connAddr, sizeof(_clientConn._connAddr));
  156. #else
  157.     memset(&_serverConn._connAddr, 0, sizeof(_serverConn._connAddr));
  158.     memset(&_clientConn._connAddr, 0, sizeof(_clientConn._connAddr));
  159. #endif
  160.     _serverConn._connAddr.sin_family = AF_INET;
  161.     _serverConn._connAddr.sin_addr.s_addr = htonl(INADDR_ANY);
  162.     // this port variable comes from the environment, via VEnvVar.
  163.     // This is set by the provisioning server in the pserver.cxx file,
  164.     // read in by the command line as -p .
  165.     int port = VEnvVar::VPS_PORT; 
  166.     _serverConn._connAddr.sin_port = htons(port);
  167.     if (::bind(_serverConn._connId,
  168.                (SA*)&_serverConn._connAddr,
  169.                sizeof(_serverConn._connAddr))
  170.        )
  171.     {
  172.         char buf[256];
  173.         sprintf(buf, "Port %d, bind failed, reason:%s", port, strerror(errno));
  174.         cpLog(LOG_ALERT, "%s", buf);
  175.         throw VNetworkException(buf, __FILE__, __LINE__, errno);
  176.     }
  177.     if (::listen(_serverConn._connId, LISTENQ))
  178.     {
  179.         char buf[256];
  180.         sprintf(buf, "listen failed, reason:%s", strerror(errno));
  181.         cpLog(LOG_ALERT, "%s", buf);
  182.         throw VNetworkException(buf, __FILE__, __LINE__, errno);
  183.     }
  184. }
  185. TcpServerSocket::~TcpServerSocket()
  186. {
  187.     close();
  188. }
  189. int
  190. TcpServerSocket::accept(Connection& con) throw (VNetworkException&)
  191. {
  192.     con._connAddrLen = sizeof(con._connAddr);
  193.     if ((con._connId = ::accept(_serverConn._connId, (SA*) & con._connAddr, &con._connAddrLen)) < 0)
  194.     {
  195.         char buf[256];
  196.         sprintf(buf, "Failed to accept the connection, reason:%s", strerror(errno));
  197.         cpLog(LOG_DEBUG, buf);
  198.         throw VNetworkException(buf, __FILE__, __LINE__, errno);
  199.     }
  200.     cpLog(LOG_DEBUG, "Connection from %s", con.getDescription().c_str());
  201.     con._live = true;
  202.     con.setState();
  203.     return con._connId;
  204. }
  205. void
  206. TcpServerSocket::close()
  207. {
  208.     ::close(_serverConn.getConnId());
  209. }
  210. #endif