服务端
#include <winsock2.h>
#include <ws2tcpip.h>
#include "udt.h"
#include <iostream>
#include <set>
using namespace std;
#pragma comment (lib,"udt.lib")
#pragma comment (lib,"Ws2_32.lib")
SOCKET servSocket;
bool InitSocket()
{
WSADATA wsadata;
WSAStartup(MAKEWORD(2, 2), &wsadata);
servSocket = socket(AF_INET, SOCK_STREAM, 0);
if (servSocket == INVALID_SOCKET)
{
return false;
}
unsigned long ul = 1;
int r = ioctlsocket(servSocket, FIONBIO, &ul);
if (r == SOCKET_ERROR)
{
return false;
}
sockaddr_in addr;
addr.sin_addr.S_un.S_addr = INADDR_ANY;
addr.sin_family = AF_INET;
addr.sin_port = htons(9000);
r = bind(servSocket, (sockaddr*)&addr, sizeof(addr));
if (r == SOCKET_ERROR)
{
return false;
}
int ret = listen(servSocket, 10);
if (ret == SOCKET_ERROR)
{
return false;
}
return true;
}
int main()
{
if (!InitSocket())
{
return 0;
}
UDT::startup();
UDTSOCKET serv = UDT::socket(AF_INET, SOCK_STREAM, 0);
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;
}
if (UDT::ERROR == UDT::listen(serv, 10))
{
cout << "listen: " << UDT::getlasterror().getErrorMessage() << endl;
return 1;
}
bool block = false;
UDT::setsockopt(serv, 0, UDT_SNDSYN, &block, sizeof(bool));
UDT::setsockopt(serv, 0, UDT_RCVSYN, &block, sizeof(bool));
sockaddr_storage clientaddr;
int addrlen = sizeof(clientaddr);
UDTSOCKET recver;
int poll = UDT::epoll_create();
int events = UDT_EPOLL_IN | UDT_EPOLL_ERR;
int res1;
set<UDTSOCKET> udtset;
set<UDTSOCKET> outudtset;
UDT::epoll_add_usock(poll, serv, &events);
while (true)
{
res1 = UDT::epoll_wait(poll, &udtset, NULL, -1);
if (res1 != 0)
{
for (set<UDTSOCKET>::iterator iter = udtset.begin(); iter != udtset.end(); iter++)
{
UDTSOCKET clientsocket = UDT::accept(*iter, (sockaddr*)&clientaddr, &addrlen);
char* hello = "hello world!\n";
UDT::send(clientsocket, hello, strlen(hello) + 1, 0);
}
}
cout << "ENVETS: " << res1 << endl;
}
closesocket(servSocket);
UDT::cleanup();
return 0;
}
客户端
// UDT_EPOLL.cpp : Defines the entry point for the console application.
//
//#include "stdafx.h"
//#include <windows.h>
//#pragma comment(lib, "wsock32.lib")
#include <winsock2.h>
#include <ws2tcpip.h>
#include "udt.h"
#include <iostream>
#include <set>
using namespace std;
#pragma comment (lib,"udt.lib")
#pragma comment (lib,"Ws2_32.lib")
SOCKET servSocket;
bool InitSocket()
{
WSADATA wsadata;
WSAStartup(MAKEWORD(2, 2), &wsadata);
servSocket = socket(AF_INET, SOCK_STREAM, 0);
if (servSocket == INVALID_SOCKET)
{
return false;
}
unsigned long ul = 1;
int r = ioctlsocket(servSocket, FIONBIO, &ul);
if (r == SOCKET_ERROR)
{
return false;
}
sockaddr_in addr;
addr.sin_addr.S_un.S_addr = INADDR_ANY;
addr.sin_family = AF_INET;
addr.sin_port = htons(9000);
r = bind(servSocket, (sockaddr*)&addr, sizeof(addr));
if (r == SOCKET_ERROR)
{
return false;
}
int ret = listen(servSocket, 10);
if (ret == SOCKET_ERROR)
{
return false;
}
return true;
}
int main()
{
if (!InitSocket())
{
return 0;
}
UDT::startup();
/* addrinfo hints, *local, *peer;
memset(&hints, 0, sizeof(addrinfo));
hints.ai_flags = AI_PASSIVE;
hints.ai_family = AF_INET;
hints.ai_socktype = SOCK_DGRAM;
if (0 != getaddrinfo(NULL, "9000", &hints, &local))
{
cout<<"incorrect network address.\n"<<endl;
return 0;
}
UDTSOCKET serv = UDT::socket(local->ai_family, local->ai_socktype, local->ai_protocol);*/
// UDT::bind2(serv, servSocket);
UDTSOCKET serv = UDT::socket(AF_INET, SOCK_STREAM, 0);
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;
}
if (UDT::ERROR == UDT::listen(serv, 10))
{
cout << "listen: " << UDT::getlasterror().getErrorMessage() << endl;
return 1;
}
bool block = false;
UDT::setsockopt(serv, 0, UDT_SNDSYN, &block, sizeof(bool));
UDT::setsockopt(serv, 0, UDT_RCVSYN, &block, sizeof(bool));
sockaddr_storage clientaddr;
int addrlen = sizeof(clientaddr);
UDTSOCKET recver;
int poll = UDT::epoll_create();
int events = UDT_EPOLL_IN | UDT_EPOLL_ERR;
int res1;
set<UDTSOCKET> udtset;
set<UDTSOCKET> outudtset;
UDT::epoll_add_usock(poll, serv, &events);
while (true)
{
res1 = UDT::epoll_wait(poll, &udtset, NULL, -1);
if (res1 != 0)
{
for (set<UDTSOCKET>::iterator iter = udtset.begin(); iter != udtset.end(); iter++)
{
UDTSOCKET clientsocket = UDT::accept(*iter, (sockaddr*)&clientaddr, &addrlen);
char* hello = "hello world!\n";
UDT::send(clientsocket, hello, strlen(hello) + 1, 0);
}
}
cout << "ENVETS: " << res1 << endl;
}
closesocket(servSocket);
UDT::cleanup();
return 0;
}