poll函数封装库

封装了一个poll函数IO多路复用的库
默认支持TCP,可设置UDP模式

base_socket.h文件:

#ifndef BASE_SOCKET_H
#define BASE_SOCKET_H

#include<stdio.h>
#include<unistd.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<string.h>

#define PORT_DEBUG 6669
class BASE_SOCKET
{
	int sockfd;
	struct sockaddr_in addr;
	socklen_t len;
public:	
	int* get_sockfd()
	{
		return &sockfd;
	}
	struct sockaddr_in* get_addr()
	{
		return &addr;
	}
	socklen_t* get_len()
	{
		return &len;
	}
	int set_sockfd(int domain,int type,int protocol,int port,const char* ip)
	{
		sockfd = socket(domain,type,protocol);
		if(0 > sockfd)
		{
			perror("socket");
			return -1;
		}		
		addr.sin_family = domain;
		addr.sin_port = htons(port);
		addr.sin_addr.s_addr = inet_addr(ip);
		len = sizeof(addr);
		return 0;
	}
	int set_sockfd(int port,const char* ip)
	{
		sockfd = socket(AF_INET,SOCK_STREAM,0);
		if(0 > sockfd)
		{
			perror("socket");
			return -1;
		}		
		addr.sin_family = AF_INET;
		addr.sin_port = htons(port);
		addr.sin_addr.s_addr = inet_addr(ip);
		len = sizeof(addr);
		return 0;
	}
	
};
#endif//BASE_SOCKET_H

poll.h文件:

#ifndef POLL_H
#define POLL_H
#define TCP 0000
#define UDP 0001
#include"base_socket.h"
#include<sys/poll.h>
#include<stdlib.h>

class POLL:public BASE_SOCKET
{
	char buf[1024];
	nfds_t nfds;
	nfds_t maxi;
	struct pollfd* fds;
	int max_connect;
public:
	POLL(int domain,int type,int protocol,int port,const char* ip,int max_connect):max_connect(max_connect)
	{
		set_sockfd(domain,type,protocol,port,ip);
		fds = (struct pollfd*)calloc(sizeof(struct pollfd),max_connect);
		init();	
	}
	POLL(int port,const char* ip,int max_connect):max_connect(max_connect)
	{
		set_sockfd(port,ip);
		fds = (struct pollfd*)calloc(sizeof(struct pollfd),max_connect);
		init();
	}
	void init();
	char* get_buf();
	int poll_bind(int type);
	int poll_recv();
	int poll_send(char* str);
};



#endif//POLL_H

poll.cpp文件:

#include"poll.h"
void POLL::init()
{
	maxi = 1;
	nfds = max_connect;
	fds[0].fd = *get_sockfd();
	fds[0].events = POLLIN;
}
char* POLL::get_buf()
{
	return buf;
}
int POLL::poll_bind(int type)
{
	if(type == TCP)
	{
		if(bind(*get_sockfd(),(struct sockaddr*)get_addr(),*get_len()))
		{
			perror("bind");
			return -1;
		}
		if(listen(*get_sockfd(),nfds))
		{
			perror("listen");
			return -1;
		}
	}
	else
	{
		if(connect(*get_sockfd(),(struct sockaddr*)get_addr(),*get_len()))
		{
			perror("connect");
			return -1;
		}
	}
}
int POLL::poll_recv()
{
	int ret = poll(fds,nfds,10000);
	if(fds[0].revents & POLLIN)
	{
		int clifd = accept(*get_sockfd(),(struct sockaddr*)get_addr(),get_len());
		if(0 > clifd)
		{
			perror("accept");
			return -1;
		}
		for(int i=0; i<nfds; i++)
		{
			if(clifd == fds[i].fd)
			{
				break;
			}
			if(0 == fds[i].fd)
			{
				fds[i].fd = clifd;
				fds[i].events = POLLIN;
				maxi = i+1;
				break;
			}
		}
	}
	for(int i=1; i<nfds; i++)
	{
		if(fds[i].revents & POLLIN)
		{
			char str[1024] = {};
			int ret = recv(fds[i].fd,str,sizeof(str),0);
			if(0 > ret)
			{
				perror("recv");
				return -1;
			}
			printf("recv:%d :%s\n",strlen(str),str);
			send(fds[i].fd,str,strlen(str)+1,0);
			return 0;
		}
	}
}
int POLL::poll_send(char* str)
{
	int ret = send(*get_sockfd(),str,strlen(str)+1,0);
	if(0 > ret)
	{
		perror("send");
		return -1;
	}
	printf("send:%d :%s\n",strlen(str),str);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值