UDTepoll

服务端

#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;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
最近在开发im服务器 需要大并发链接 QT默认的是使用select模型的 这种轮询方式非常慢 在高并发连接 我们需要epoll才能发挥linux服务器的性能 而且使用简单 整个服务端代码架构无需修改 直接可以使用 只要在 main文件添加: int main int argc char argv[] { #ifdef Q OS LINUX QCoreApplication::setEventDispatcher new EventDispatcherLibEvent ; qInstallMessageHandler customMessageHandler ; #endif QCoreApplication a argc argv ; auto ser new ConfigServer; ser >startServer ; return a exec ; } 在 pro文件添加 linux{ LIBS + levent core SOURCES + common eventdispatcher libevent eventdispatcher libevent cpp common eventdispatcher libevent eventdispatcher libevent config cpp common eventdispatcher libevent eventdispatcher libevent p cpp common eventdispatcher libevent socknot p cpp common eventdispatcher libevent tco eventfd cpp common eventdispatcher libevent tco pipe cpp common eventdispatcher libevent tco cpp common eventdispatcher libevent timers p cpp HEADERS + common eventdispatcher libevent common h common eventdispatcher libevent eventdispatcher libevent h common eventdispatcher libevent eventdispatcher libevent config h common eventdispatcher libevent eventdispatcher libevent config p h common eventdispatcher libevent eventdispatcher libevent p h common eventdispatcher libevent libevent2 emul h common eventdispatcher libevent qt4compat h common eventdispatcher libevent tco h common eventdispatcher libevent wsainit h } 可以直接跨平台了使用了 csdn博客:http: blog csdn net rushroom">最近在开发im服务器 需要大并发链接 QT默认的是使用select模型的 这种轮询方式非常慢 在高并发连接 我们需要epoll才能发挥linux服务器的性能 而且使用简单 整个服务端代码架构无需修改 直接可以使用 只要在 main文件添加: [更多]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值