封装了一个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);
}