appserver.cpp

00001 #ifndef WIN32
00002    #include <unistd.h>
00003    #include <cstdlib>
00004    #include <cstring>
00005    #include <netdb.h>
00006 #else
00007    #include <winsock2.h>
00008    #include <ws2tcpip.h>
00009    #include <wspiapi.h>
00010 #endif
00011 #include <iostream>
00012 #include <udt.h>
00013 #include "cc.h"
00014 #include "test_util.h"
00015 
00016 using namespace std;
00017 
00018 #ifndef WIN32
00019 void* recvdata(void*);
00020 #else
00021 DWORD WINAPI recvdata(LPVOID);
00022 #endif
00023 
00024 int main(int argc, char* argv[])
00025 {
00026    if ((1 != argc) && ((2 != argc) || (0 == atoi(argv[1]))))
00027    {
00028       cout << "usage: appserver [server_port]" << endl;
00029       return 0;
00030    }
00031 
00032    // Automatically start up and clean up UDT module.
00033    UDTUpDown _udt_;
00034 
00035    addrinfo hints;
00036    addrinfo* res;
00037 
00038    memset(&hints, 0, sizeof(struct addrinfo));
00039 
00040    hints.ai_flags = AI_PASSIVE;
00041    hints.ai_family = AF_INET;
00042    hints.ai_socktype = SOCK_STREAM;
00043    //hints.ai_socktype = SOCK_DGRAM;
00044 
00045    string service("9000");
00046    if (2 == argc)
00047       service = argv[1];
00048 
00049    if (0 != getaddrinfo(NULL, service.c_str(), &hints, &res))
00050    {
00051       cout << "illegal port number or port is busy.\n" << endl;
00052       return 0;
00053    }
00054 
00055    UDTSOCKET serv = UDT::socket(res->ai_family, res->ai_socktype, res->ai_protocol);
00056 
00057    // UDT Options
00058    //UDT::setsockopt(serv, 0, UDT_CC, new CCCFactory<CUDPBlast>, sizeof(CCCFactory<CUDPBlast>));
00059    //UDT::setsockopt(serv, 0, UDT_MSS, new int(9000), sizeof(int));
00060    //UDT::setsockopt(serv, 0, UDT_RCVBUF, new int(10000000), sizeof(int));
00061    //UDT::setsockopt(serv, 0, UDP_RCVBUF, new int(10000000), sizeof(int));
00062 
00063    if (UDT::ERROR == UDT::bind(serv, res->ai_addr, res->ai_addrlen))
00064    {
00065       cout << "bind: " << UDT::getlasterror().getErrorMessage() << endl;
00066       return 0;
00067    }
00068 
00069    freeaddrinfo(res);
00070 
00071    cout << "server is ready at port: " << service << endl;
00072 
00073    if (UDT::ERROR == UDT::listen(serv, 10))
00074    {
00075       cout << "listen: " << UDT::getlasterror().getErrorMessage() << endl;
00076       return 0;
00077    }
00078 
00079    sockaddr_storage clientaddr;
00080    int addrlen = sizeof(clientaddr);
00081 
00082    UDTSOCKET recver;
00083 
00084    while (true)
00085    {
00086       if (UDT::INVALID_SOCK == (recver = UDT::accept(serv, (sockaddr*)&clientaddr, &addrlen)))
00087       {
00088          cout << "accept: " << UDT::getlasterror().getErrorMessage() << endl;
00089          return 0;
00090       }
00091 
00092       char clienthost[NI_MAXHOST];
00093       char clientservice[NI_MAXSERV];
00094       getnameinfo((sockaddr *)&clientaddr, addrlen, clienthost, sizeof(clienthost), clientservice, sizeof(clientservice), NI_NUMERICHOST|NI_NUMERICSERV);
00095       cout << "new connection: " << clienthost << ":" << clientservice << endl;
00096 
00097       #ifndef WIN32
00098          pthread_t rcvthread;
00099          pthread_create(&rcvthread, NULL, recvdata, new UDTSOCKET(recver));
00100          pthread_detach(rcvthread);
00101       #else
00102          CreateThread(NULL, 0, recvdata, new UDTSOCKET(recver), 0, NULL);
00103       #endif
00104    }
00105 
00106    UDT::close(serv);
00107 
00108    return 0;
00109 }
00110 
00111 #ifndef WIN32
00112 void* recvdata(void* usocket)
00113 #else
00114 DWORD WINAPI recvdata(LPVOID usocket)
00115 #endif
00116 {
00117    UDTSOCKET recver = *(UDTSOCKET*)usocket;
00118    delete (UDTSOCKET*)usocket;
00119 
00120    char* data;
00121    int size = 100000;
00122    data = new char[size];
00123 
00124    while (true)
00125    {
00126       int rsize = 0;
00127       int rs;
00128       while (rsize < size)
00129       {
00130          if (UDT::ERROR == (rs = UDT::recv(recver, data + rsize, size - rsize, 0)))
00131          {
00132             cout << "recv:" << UDT::getlasterror().getErrorMessage() << endl;
00133             break;
00134          }
00135 
00136          rsize += rs;
00137       }
00138 
00139       if (rsize < size)
00140          break;
00141    }
00142 
00143    delete [] data;
00144 
00145    UDT::close(recver);
00146 
00147    #ifndef WIN32
00148       return NULL;
00149    #else
00150       return 0;
00151    #endif
00152 }

Generated on 9 Feb 2013 for barchart-udt-core-2.2.2 by  doxygen 1.6.1