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
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
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
00058
00059
00060
00061
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 }