diff --git a/tests/udt_client.cpp b/tests/udt_client.cpp new file mode 100644 index 0000000..f575b28 --- /dev/null +++ b/tests/udt_client.cpp @@ -0,0 +1,36 @@ +#include +#include +#include + +using namespace std; +using namespace UDT; + +int main() +{ + UDTSOCKET client = UDT::socket(AF_INET, SOCK_STREAM, 0); + + sockaddr_in serv_addr; + serv_addr.sin_family = AF_INET; + serv_addr.sin_port = htons(9000); + inet_pton(AF_INET, "127.0.0.1", &serv_addr.sin_addr); + + memset(&(serv_addr.sin_zero), '\0', 8); + + // connect to the server, implict bind + if (UDT::ERROR == UDT::connect(client, (sockaddr*)&serv_addr, sizeof(serv_addr))) + { + cout << "connect: " << UDT::getlasterror().getErrorMessage(); + return 0; + } + + char* hello = "hello world! 3\n"; + if (UDT::ERROR == UDT::send(client, hello, strlen(hello) + 1, 0)) + { + cout << "send: " << UDT::getlasterror().getErrorMessage(); + return 0; + } + + UDT::close(client); + + return 1; +} diff --git a/tests/udt_server.cpp b/tests/udt_server.cpp new file mode 100644 index 0000000..ff7e2fb --- /dev/null +++ b/tests/udt_server.cpp @@ -0,0 +1,83 @@ +#include +#include +#include + +using namespace std; + +int main( int argc, char** argv ) +{ + UDTSOCKET serv = UDT::socket(AF_INET, SOCK_STREAM, 0); + bool block = false; + + sockaddr_in my_addr; + my_addr.sin_family = AF_INET; + my_addr.sin_port = htons(9000); + my_addr.sin_addr.s_addr = INADDR_ANY; + memset(&(my_addr.sin_zero), '\0', 8); + + if (UDT::ERROR == UDT::bind(serv, (sockaddr*)&my_addr, sizeof(my_addr))) + { + cout << "bind: " << UDT::getlasterror().getErrorMessage(); + return 0; + } + UDT::listen(serv, 10); + + int namelen; + sockaddr_in their_addr; + + + UDT::setsockopt(serv, 0, UDT_SNDSYN, &block, sizeof(bool)); + UDT::setsockopt(serv, 0, UDT_RCVSYN, &block, sizeof(bool)); + UDTSOCKET recver = UDT::accept(serv, (sockaddr*)&their_addr, &namelen); + if( recver == UDT::INVALID_SOCK ) + { + if( UDT::getlasterror_code() == CUDTException::EASYNCRCV ) + { + std::cout << "nothing yet... better luck next time\n"; + } + } + auto pollid = UDT::epoll_create(); + UDT::epoll_add_usock(pollid, serv, nullptr );// const int* events = NULL); + std::set readready; + std::set writeready; + std::cout << "waiting for 5 seconds\n"; + UDT::epoll_wait( pollid, &readready, &writeready, 10000 ); + + + recver = UDT::accept(serv, (sockaddr*)&their_addr, &namelen); + if( recver == UDT::INVALID_SOCK ) + { + if( UDT::getlasterror_code() == CUDTException::EASYNCRCV ) + { + std::cout << "nothing yet... better luck next time\n"; + } + return 0; + } + UDT::setsockopt(recver, 0, UDT_SNDSYN, &block, sizeof(bool)); + UDT::setsockopt(recver, 0, UDT_RCVSYN, &block, sizeof(bool)); + UDT::epoll_remove_usock(pollid, serv );// const int* events = NULL); + int events = UDT_EPOLL_IN; + + UDT::epoll_add_usock(pollid, recver, &events );// const int* events = NULL); + + readready.clear(); + UDT::epoll_wait( pollid, &readready, &writeready, 5000 ); + + char ip[16]; + cout << "new connection: " << inet_ntoa(their_addr.sin_addr) << ":" << ntohs(their_addr.sin_port) << endl; + + char data[100]; + + while (UDT::ERROR == UDT::recv(recver, data, 100, 0)) + { + cout << "recv:" << UDT::getlasterror().getErrorMessage() << endl; + UDT::epoll_wait( pollid, &readready, &writeready, 5000 ); + } + + cout << data << endl; + + UDT::close(recver); + UDT::close(serv); + + return 1; +}