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

流媒体/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 tSocket_cxx_Version = 
  51. "$Id$";
  52. #include "Application.hxx"
  53. #include "Socket.hxx"
  54. #include "VLog.hxx"
  55. #include "IPAddress.hxx"
  56. #include "UDPSocket.hxx"
  57. #include <unistd.h>
  58. #include <stdio.h>
  59. #include <iomanip>
  60. #include <cerrno>
  61. #include <cstring>
  62. #include <sys/time.h>
  63. #include <sys/times.h>
  64. #include <sys/types.h>
  65. #include <unistd.h>
  66. #include <string>
  67. #include <vector>
  68. #include <list>
  69. #include "MACAddress.hxx"
  70. //#include "PollFifo.hxx"
  71. using namespace Vocal;
  72. using namespace Vocal::Transport;
  73. using namespace Vocal::Logging;
  74. class TestSocket : public Socket
  75. {
  76.     public:
  77.     
  78. TestSocket(
  79.     TransportAddress & localAddr,
  80.     const SocketType &);
  81. ~TestSocket();
  82. };
  83. TestSocket::TestSocket(
  84.     TransportAddress & localAddr,
  85.     const SocketType & socketType
  86. )
  87.     : Socket(localAddr, socketType)
  88. {
  89. }
  90. TestSocket::~TestSocket()
  91. {
  92. }
  93. class tSocket : public Application
  94. {
  95.     public:
  96.      tSocket() {}
  97. ~tSocket() {}
  98.      ReturnCode       init(int, char **, char **);
  99. void          uninit();
  100.      ReturnCode       run();
  101. };
  102. ostream &   operator<<(ostream & out, u_int8_t * buffer)
  103. {
  104.     out << "0x";
  105.     for ( int i = 0; i < 26; i++ )
  106.     {
  107.      out << setw(2) << setfill('0') << hex << (unsigned)(buffer[i]) << dec;
  108.     }
  109.     return ( out );
  110. }
  111. Application * Application::create()
  112. {
  113.     return ( new tSocket );
  114. }
  115. ReturnCode
  116. tSocket::init(int argc, char ** argv, char ** arge)
  117. {
  118.     if ( argc > 1 )
  119.     {
  120.         VLog::init(LOG_DEBUG, argv[1]);
  121.     }
  122.     else
  123.     {
  124.      VLog::init(LOG_DEBUG);
  125.     }
  126.     VLog::on(LOG_DEBUG);
  127.     VLog::on(LOG_INFO);
  128.     if ( argc > 2 )
  129.     {
  130.         VLog::on(LOG_TRACE);
  131.     }
  132.     return ( SUCCESS );
  133. }
  134. void
  135. tSocket::uninit()
  136. {
  137.     VLog::uninit();
  138. }
  139. ReturnCode
  140. tSocket::run()
  141. {
  142.     vector<int>     v(1024);
  143.     cout << "size: " << v.size() << ", capacity: " << v.capacity() << endl;
  144.     v.resize(10);
  145.     v[0] = 0;
  146.     v[1] = 1;
  147.     v[2] = 2;
  148.     v[3] = 3;
  149.     v[9] = 9;
  150.     v.resize(20);
  151.     cout << "size: " << v.size() << ", capacity: " << v.capacity() << endl;
  152.     
  153.     for ( unsigned int i = 0; i < v.size(); i++ )
  154.     {
  155.      cout << v[i] << ' ';
  156.     }
  157.     cout << endl;
  158.     
  159.     u_int8_t feh[2];
  160.     
  161.     memset(feh, 2, 0);
  162.     
  163.     unsigned short * us_feh = (unsigned short *)&feh;
  164.     
  165.     *us_feh = htons(0xABCD);
  166.     
  167.     cout << setw(2) << setfill(' ') << hex << (u_int16_t)(feh[0]) 
  168.       << setw(2) << setfill(' ') << hex << (u_int16_t)(feh[1]) 
  169.       << dec << endl;
  170.     
  171.     MACAddress macAddr;
  172.     
  173.     cout << "macAddr high: " << (void *)(macAddr.high()) 
  174.       << " low: " << (void *)(macAddr.low()) << endl;
  175.  
  176.     tms      startTimeBuf;
  177.     clock_t  start = times(&startTimeBuf);
  178.     sockaddr_in     ip0, ip1, ip2;
  179.     sockaddr *   sa0 = (sockaddr *)&ip0,
  180.           *   sa1 = (sockaddr *)&ip1,
  181.           *   sa2 = (sockaddr *)&ip2;
  182.     socklen_t     sa_len = sizeof(sockaddr_in);
  183.     
  184.     sa0->sa_family = sa1->sa_family = AF_INET;
  185.     ip0.sin_addr.s_addr = ip1.sin_addr.s_addr = htonl(INADDR_ANY);
  186.     ip0.sin_port = htons(11111);
  187.     ip1.sin_port = htons(11112);
  188.     
  189.     int fd0 = socket(AF_INET, SOCK_STREAM, 0),
  190.      fd1 = socket(AF_INET, SOCK_STREAM, 0),
  191. fd2;
  192.     if  (   bind(fd0, sa0, sa_len) < 0 
  193.      ||  bind(fd1, sa1, sa_len) < 0
  194. ||  listen(fd0, 0) < 0
  195. ||  connect(fd1, sa0, sa_len) < 0
  196. )
  197.     {
  198.      int error = errno;
  199.      cerr << "ack: " << strerror(error) << endl;
  200.     }
  201.     else
  202.     {
  203.      cerr << "connected" << endl;
  204. socklen_t len = sa_len;
  205. fd2 = accept(fd0, sa2, &len);
  206. if ( fd2 < 0 )
  207. {
  208.     cerr << "accept ack: " << strerror(errno) << endl;
  209. }
  210.     }
  211.     
  212.     close(fd0);
  213.     close(fd1);
  214.     close(fd2);
  215.     string       sendBuffer("test");
  216.     IPAddress     interruptorAddr(44445);
  217.     UDPSocket     interruptor(interruptorAddr, "Interruptor");
  218.     interruptor.sendTo(sendBuffer, interruptorAddr);
  219.     fd0 = interruptor.getFD();
  220.             
  221.     fd_set readFds;
  222.     FD_ZERO(&readFds);
  223.     FD_SET(fd0, &readFds);
  224.     timeval to;
  225.     to.tv_sec = 10;
  226.     to.tv_usec = 0;
  227.     if  (  select(fd0+1, &readFds, 0, 0, &to) < 0 
  228. || !FD_ISSET(fd0, &readFds)
  229. )
  230.     {
  231. if ( errno )
  232. {
  233.             cerr << "interruptor ack: " << strerror(errno) << endl;
  234. }
  235.     }
  236.     else
  237.     {
  238. string buffer(32, ' ');
  239. IPAddress   remoteAddr;
  240. interruptor.receiveFrom(buffer, remoteAddr);
  241. if ( buffer != sendBuffer )
  242. {
  243.             cerr << "interruptor not the same" 
  244.       << ": sendBuffer: " << sendBuffer
  245.  << ", recvBuffer: " << buffer
  246.       << endl;
  247. }
  248.     }
  249.     cerr << "interruptor works." << endl;
  250.     vector<int>     vfeh;
  251.     
  252.     vfeh.insert(vfeh.end(), 2);
  253.     vfeh.insert(vfeh.end(), 4);
  254.     vfeh.insert(vfeh.end(), 6);
  255.     
  256.     cout << vfeh[0] << ", " << vfeh[1] << ", " << vfeh[2] << endl;
  257.     sleep(2);
  258.     tms     stopTimeBuf    ;
  259.     clock_t stop = times(&stopTimeBuf);
  260.     cout << "start: " << start 
  261.       << ", stop: " << stop
  262.       << ", CLK_TCK: " << CLK_TCK
  263.       << ", run time in hundredths of a sec: " << (stop - start) 
  264.       << ", in sec: " << (((double)(stop-start))/(double)CLK_TCK)
  265.       << ", start user time: " << startTimeBuf.tms_utime
  266.       << ", start system time: " << startTimeBuf.tms_stime
  267.       << ", start child user time: " << startTimeBuf.tms_cutime
  268.       << ", start child system time: " << startTimeBuf.tms_cstime
  269.       << ", stop user time: " << stopTimeBuf.tms_utime
  270.       << ", stop system time: " << stopTimeBuf.tms_stime
  271.       << ", stop child user time: " << stopTimeBuf.tms_cutime
  272.       << ", stop child system time: " << stopTimeBuf.tms_cstime
  273.       << endl;
  274.     list<int> lfeh;
  275.     lfeh.push_back(2);
  276.     lfeh.push_back(4);
  277.     lfeh.push_back(6);
  278.     lfeh.push_back(8);
  279.     lfeh.push_back(10);
  280.     lfeh.push_back(14);
  281.     
  282.     list<int>::iterator it;
  283.     for ( it = lfeh.begin(); it != lfeh.end(); it++ )
  284.     {
  285.      cout << *it << " ";
  286.     }
  287.     cout << endl;
  288.     
  289.     for ( it = lfeh.begin(); it != lfeh.end(); it++ )
  290.     {
  291.      if ( *it > 7 )
  292. {
  293.     lfeh.insert(it, 7);
  294.     break;
  295. }
  296.     }
  297.     for ( it = lfeh.begin(); it != lfeh.end(); it++ )
  298.     {
  299.      cout << *it << " ";
  300.     }
  301.     cout << endl;
  302.     
  303.     for ( it = lfeh.begin(); it != lfeh.end(); it++ )
  304.     {
  305.      if ( *it > 7 )
  306. {
  307.     lfeh.insert(it, 7);
  308.     break;
  309. }
  310.     }
  311.     for ( it = lfeh.begin(); it != lfeh.end(); it++ )
  312.     {
  313.      cout << *it << " ";
  314.     }
  315.     cout << endl;
  316.     for ( it = lfeh.begin(); it != lfeh.end(); it++ )
  317.     {
  318.      if ( *it > 15 )
  319. {
  320.     lfeh.insert(it, 15);
  321.     break;
  322. }
  323.     }
  324.     if ( it == lfeh.end() )
  325.     {
  326.      lfeh.push_back(15);
  327. cout << "On the end" << endl;
  328.     }
  329.     for ( it = lfeh.begin(); it != lfeh.end(); it++ )
  330.     {
  331.      cout << *it << " ";
  332.     }
  333.     cout << endl;
  334.     IPAddress     ipAddr(80);
  335.     SocketType     type(SOCK_STREAM);
  336.     try
  337.     {
  338.         TestSocket     sock(ipAddr, type), sock_fail(ipAddr, type);
  339.     }
  340.     catch ( ... )
  341.     {
  342.      cout << "caught it" << endl;
  343.     }
  344.     try
  345.     {
  346.         UDPSocket       udpSock;
  347.      IPAddress       echo("127.0.0.1", 7777),
  348. fromAddr;
  349.      char      sendMessage[8192];
  350.           //recvMessage[8192];
  351.      u_int8_t     binarySendMessage[26];
  352. for ( int i = 0; i < 26; i++ )
  353. {
  354.     binarySendMessage[i] = 'a' + i;
  355. }
  356. cout << "binary message: " << binarySendMessage << endl;
  357. udpSock.setBlocking();
  358.      int count = 0;
  359.      while ( count++ < 100 )
  360. {
  361.          size_t sendMessageLength = 26;
  362.     if ( count % 4 )
  363.     {
  364.              if ( fgets(sendMessage, 8191, stdin) == 0 )
  365.      {
  366.               return ( 0 );
  367. }
  368.           size_t sendMessageLength = strlen(sendMessage);
  369.     
  370. cout << "Sending message: " << sendMessage 
  371.      << ", size: " << sendMessageLength
  372.      << ", to: " << echo << endl;
  373.          
  374.           udpSock.sendTo(sendMessage, echo);
  375.     }
  376.     else
  377.     {
  378.      udpSock.sendTo(binarySendMessage, sendMessageLength, echo);
  379.     }
  380.          string   * recvMessage = new string(8191, ' ');
  381.     
  382.     int bytesReceived = udpSock.receiveFrom(*recvMessage, fromAddr);
  383.     cout << "Received message: " << recvMessage->c_str()
  384.  << ", size: " << recvMessage->size() 
  385.  << ", bytes reported = " << bytesReceived
  386.  << ", from: " << fromAddr << endl;
  387.          delete recvMessage;
  388. }
  389.     }
  390.     catch ( ... )
  391.     {
  392.      cout << "caught UDP error" << endl;
  393.     }
  394.     
  395.     return ( 0 );
  396. }
  397. int main(int argc, char ** argv, char ** arge)
  398. {
  399.     return ( Application::main(argc, argv, arge) );
  400. }