| Index: net/third_party/udt/app/appclient.cpp
|
| ===================================================================
|
| --- net/third_party/udt/app/appclient.cpp (revision 78992)
|
| +++ net/third_party/udt/app/appclient.cpp (working copy)
|
| @@ -1,174 +0,0 @@
|
| -#ifndef WIN32
|
| - #include <unistd.h>
|
| - #include <cstdlib>
|
| - #include <cstring>
|
| - #include <netdb.h>
|
| -#else
|
| - #include <winsock2.h>
|
| - #include <ws2tcpip.h>
|
| - #include <wspiapi.h>
|
| -#endif
|
| -#include <iostream>
|
| -#include <udt.h>
|
| -#include "cc.h"
|
| -
|
| -using namespace std;
|
| -
|
| -#ifndef WIN32
|
| -void* monitor(void*);
|
| -#else
|
| -DWORD WINAPI monitor(LPVOID);
|
| -#endif
|
| -
|
| -int main(int argc, char* argv[])
|
| -{
|
| - if ((3 != argc) || (0 == atoi(argv[2])))
|
| - {
|
| - cout << "usage: appclient server_ip server_port" << endl;
|
| - return 0;
|
| - }
|
| -
|
| - // use this function to initialize the UDT library
|
| - UDT::startup();
|
| -
|
| - struct addrinfo hints, *local, *peer;
|
| -
|
| - memset(&hints, 0, sizeof(struct addrinfo));
|
| -
|
| - hints.ai_flags = AI_PASSIVE;
|
| - hints.ai_family = AF_INET;
|
| - hints.ai_socktype = SOCK_STREAM;
|
| - //hints.ai_socktype = SOCK_DGRAM;
|
| -
|
| - if (0 != getaddrinfo(NULL, "9000", &hints, &local))
|
| - {
|
| - cout << "incorrect network address.\n" << endl;
|
| - return 0;
|
| - }
|
| -
|
| - UDTSOCKET client = UDT::socket(local->ai_family, local->ai_socktype, local->ai_protocol);
|
| -
|
| - // UDT Options
|
| - //UDT::setsockopt(client, 0, UDT_CC, new CCCFactory<CUDPBlast>, sizeof(CCCFactory<CUDPBlast>));
|
| - //UDT::setsockopt(client, 0, UDT_MSS, new int(9000), sizeof(int));
|
| - //UDT::setsockopt(client, 0, UDT_SNDBUF, new int(10000000), sizeof(int));
|
| - //UDT::setsockopt(client, 0, UDP_SNDBUF, new int(10000000), sizeof(int));
|
| -
|
| - // Windows UDP issue
|
| - // For better performance, modify HKLM\System\CurrentControlSet\Services\Afd\Parameters\FastSendDatagramThreshold
|
| - #ifdef WIN32
|
| - UDT::setsockopt(client, 0, UDT_MSS, new int(1052), sizeof(int));
|
| - #endif
|
| -
|
| - // for rendezvous connection, enable the code below
|
| - /*
|
| - UDT::setsockopt(client, 0, UDT_RENDEZVOUS, new bool(true), sizeof(bool));
|
| - if (UDT::ERROR == UDT::bind(client, local->ai_addr, local->ai_addrlen))
|
| - {
|
| - cout << "bind: " << UDT::getlasterror().getErrorMessage() << endl;
|
| - return 0;
|
| - }
|
| - */
|
| -
|
| - freeaddrinfo(local);
|
| -
|
| - if (0 != getaddrinfo(argv[1], argv[2], &hints, &peer))
|
| - {
|
| - cout << "incorrect server/peer address. " << argv[1] << ":" << argv[2] << endl;
|
| - return 0;
|
| - }
|
| -
|
| - // connect to the server, implict bind
|
| - if (UDT::ERROR == UDT::connect(client, peer->ai_addr, peer->ai_addrlen))
|
| - {
|
| - cout << "connect: " << UDT::getlasterror().getErrorMessage() << endl;
|
| - return 0;
|
| - }
|
| -
|
| - freeaddrinfo(peer);
|
| -
|
| - // using CC method
|
| - //CUDPBlast* cchandle = NULL;
|
| - //int temp;
|
| - //UDT::getsockopt(client, 0, UDT_CC, &cchandle, &temp);
|
| - //if (NULL != cchandle)
|
| - // cchandle->setRate(500);
|
| -
|
| - int size = 100000;
|
| - char* data = new char[size];
|
| -
|
| - #ifndef WIN32
|
| - pthread_create(new pthread_t, NULL, monitor, &client);
|
| - #else
|
| - CreateThread(NULL, 0, monitor, &client, 0, NULL);
|
| - #endif
|
| -
|
| - for (int i = 0; i < 1000000; i ++)
|
| - {
|
| - int ssize = 0;
|
| - int ss;
|
| - while (ssize < size)
|
| - {
|
| - if (UDT::ERROR == (ss = UDT::send(client, data + ssize, size - ssize, 0)))
|
| - {
|
| - cout << "send:" << UDT::getlasterror().getErrorMessage() << endl;
|
| - break;
|
| - }
|
| -
|
| - ssize += ss;
|
| - }
|
| -
|
| - if (ssize < size)
|
| - break;
|
| - }
|
| -
|
| - UDT::close(client);
|
| -
|
| - delete [] data;
|
| -
|
| - // use this function to release the UDT library
|
| - UDT::cleanup();
|
| -
|
| - return 1;
|
| -}
|
| -
|
| -#ifndef WIN32
|
| -void* monitor(void* s)
|
| -#else
|
| -DWORD WINAPI monitor(LPVOID s)
|
| -#endif
|
| -{
|
| - UDTSOCKET u = *(UDTSOCKET*)s;
|
| -
|
| - UDT::TRACEINFO perf;
|
| -
|
| - cout << "SendRate(Mb/s)\tRTT(ms)\tCWnd\tPktSndPeriod(us)\tRecvACK\tRecvNAK" << endl;
|
| -
|
| - while (true)
|
| - {
|
| - #ifndef WIN32
|
| - sleep(1);
|
| - #else
|
| - Sleep(1000);
|
| - #endif
|
| -
|
| - if (UDT::ERROR == UDT::perfmon(u, &perf))
|
| - {
|
| - cout << "perfmon: " << UDT::getlasterror().getErrorMessage() << endl;
|
| - break;
|
| - }
|
| -
|
| - cout << perf.mbpsSendRate << "\t\t"
|
| - << perf.msRTT << "\t"
|
| - << perf.pktCongestionWindow << "\t"
|
| - << perf.usPktSndPeriod << "\t\t\t"
|
| - << perf.pktRecvACK << "\t"
|
| - << perf.pktRecvNAK << endl;
|
| - }
|
| -
|
| - #ifndef WIN32
|
| - return NULL;
|
| - #else
|
| - return 0;
|
| - #endif
|
| -}
|
|
|