| OLD | NEW |
| (Empty) |
| 1 #ifndef WIN32 | |
| 2 #include <unistd.h> | |
| 3 #include <cstdlib> | |
| 4 #include <cstring> | |
| 5 #include <netdb.h> | |
| 6 #else | |
| 7 #include <winsock2.h> | |
| 8 #include <ws2tcpip.h> | |
| 9 #include <wspiapi.h> | |
| 10 #endif | |
| 11 #include <iostream> | |
| 12 #include <udt.h> | |
| 13 #include "cc.h" | |
| 14 | |
| 15 using namespace std; | |
| 16 | |
| 17 #ifndef WIN32 | |
| 18 void* monitor(void*); | |
| 19 #else | |
| 20 DWORD WINAPI monitor(LPVOID); | |
| 21 #endif | |
| 22 | |
| 23 int main(int argc, char* argv[]) | |
| 24 { | |
| 25 if ((3 != argc) || (0 == atoi(argv[2]))) | |
| 26 { | |
| 27 cout << "usage: appclient server_ip server_port" << endl; | |
| 28 return 0; | |
| 29 } | |
| 30 | |
| 31 // use this function to initialize the UDT library | |
| 32 UDT::startup(); | |
| 33 | |
| 34 struct addrinfo hints, *local, *peer; | |
| 35 | |
| 36 memset(&hints, 0, sizeof(struct addrinfo)); | |
| 37 | |
| 38 hints.ai_flags = AI_PASSIVE; | |
| 39 hints.ai_family = AF_INET; | |
| 40 hints.ai_socktype = SOCK_STREAM; | |
| 41 //hints.ai_socktype = SOCK_DGRAM; | |
| 42 | |
| 43 if (0 != getaddrinfo(NULL, "9000", &hints, &local)) | |
| 44 { | |
| 45 cout << "incorrect network address.\n" << endl; | |
| 46 return 0; | |
| 47 } | |
| 48 | |
| 49 UDTSOCKET client = UDT::socket(local->ai_family, local->ai_socktype, local->a
i_protocol); | |
| 50 | |
| 51 // UDT Options | |
| 52 //UDT::setsockopt(client, 0, UDT_CC, new CCCFactory<CUDPBlast>, sizeof(CCCFac
tory<CUDPBlast>)); | |
| 53 //UDT::setsockopt(client, 0, UDT_MSS, new int(9000), sizeof(int)); | |
| 54 //UDT::setsockopt(client, 0, UDT_SNDBUF, new int(10000000), sizeof(int)); | |
| 55 //UDT::setsockopt(client, 0, UDP_SNDBUF, new int(10000000), sizeof(int)); | |
| 56 | |
| 57 // Windows UDP issue | |
| 58 // For better performance, modify HKLM\System\CurrentControlSet\Services\Afd\
Parameters\FastSendDatagramThreshold | |
| 59 #ifdef WIN32 | |
| 60 UDT::setsockopt(client, 0, UDT_MSS, new int(1052), sizeof(int)); | |
| 61 #endif | |
| 62 | |
| 63 // for rendezvous connection, enable the code below | |
| 64 /* | |
| 65 UDT::setsockopt(client, 0, UDT_RENDEZVOUS, new bool(true), sizeof(bool)); | |
| 66 if (UDT::ERROR == UDT::bind(client, local->ai_addr, local->ai_addrlen)) | |
| 67 { | |
| 68 cout << "bind: " << UDT::getlasterror().getErrorMessage() << endl; | |
| 69 return 0; | |
| 70 } | |
| 71 */ | |
| 72 | |
| 73 freeaddrinfo(local); | |
| 74 | |
| 75 if (0 != getaddrinfo(argv[1], argv[2], &hints, &peer)) | |
| 76 { | |
| 77 cout << "incorrect server/peer address. " << argv[1] << ":" << argv[2] <<
endl; | |
| 78 return 0; | |
| 79 } | |
| 80 | |
| 81 // connect to the server, implict bind | |
| 82 if (UDT::ERROR == UDT::connect(client, peer->ai_addr, peer->ai_addrlen)) | |
| 83 { | |
| 84 cout << "connect: " << UDT::getlasterror().getErrorMessage() << endl; | |
| 85 return 0; | |
| 86 } | |
| 87 | |
| 88 freeaddrinfo(peer); | |
| 89 | |
| 90 // using CC method | |
| 91 //CUDPBlast* cchandle = NULL; | |
| 92 //int temp; | |
| 93 //UDT::getsockopt(client, 0, UDT_CC, &cchandle, &temp); | |
| 94 //if (NULL != cchandle) | |
| 95 // cchandle->setRate(500); | |
| 96 | |
| 97 int size = 100000; | |
| 98 char* data = new char[size]; | |
| 99 | |
| 100 #ifndef WIN32 | |
| 101 pthread_create(new pthread_t, NULL, monitor, &client); | |
| 102 #else | |
| 103 CreateThread(NULL, 0, monitor, &client, 0, NULL); | |
| 104 #endif | |
| 105 | |
| 106 for (int i = 0; i < 1000000; i ++) | |
| 107 { | |
| 108 int ssize = 0; | |
| 109 int ss; | |
| 110 while (ssize < size) | |
| 111 { | |
| 112 if (UDT::ERROR == (ss = UDT::send(client, data + ssize, size - ssize, 0
))) | |
| 113 { | |
| 114 cout << "send:" << UDT::getlasterror().getErrorMessage() << endl; | |
| 115 break; | |
| 116 } | |
| 117 | |
| 118 ssize += ss; | |
| 119 } | |
| 120 | |
| 121 if (ssize < size) | |
| 122 break; | |
| 123 } | |
| 124 | |
| 125 UDT::close(client); | |
| 126 | |
| 127 delete [] data; | |
| 128 | |
| 129 // use this function to release the UDT library | |
| 130 UDT::cleanup(); | |
| 131 | |
| 132 return 1; | |
| 133 } | |
| 134 | |
| 135 #ifndef WIN32 | |
| 136 void* monitor(void* s) | |
| 137 #else | |
| 138 DWORD WINAPI monitor(LPVOID s) | |
| 139 #endif | |
| 140 { | |
| 141 UDTSOCKET u = *(UDTSOCKET*)s; | |
| 142 | |
| 143 UDT::TRACEINFO perf; | |
| 144 | |
| 145 cout << "SendRate(Mb/s)\tRTT(ms)\tCWnd\tPktSndPeriod(us)\tRecvACK\tRecvNAK" <
< endl; | |
| 146 | |
| 147 while (true) | |
| 148 { | |
| 149 #ifndef WIN32 | |
| 150 sleep(1); | |
| 151 #else | |
| 152 Sleep(1000); | |
| 153 #endif | |
| 154 | |
| 155 if (UDT::ERROR == UDT::perfmon(u, &perf)) | |
| 156 { | |
| 157 cout << "perfmon: " << UDT::getlasterror().getErrorMessage() << endl; | |
| 158 break; | |
| 159 } | |
| 160 | |
| 161 cout << perf.mbpsSendRate << "\t\t" | |
| 162 << perf.msRTT << "\t" | |
| 163 << perf.pktCongestionWindow << "\t" | |
| 164 << perf.usPktSndPeriod << "\t\t\t" | |
| 165 << perf.pktRecvACK << "\t" | |
| 166 << perf.pktRecvNAK << endl; | |
| 167 } | |
| 168 | |
| 169 #ifndef WIN32 | |
| 170 return NULL; | |
| 171 #else | |
| 172 return 0; | |
| 173 #endif | |
| 174 } | |
| OLD | NEW |