您的位置:首页 > 其它

poll使用示例

2015-09-23 11:52 302 查看
server.cpp

#include <stddef.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdint.h>
#include <unistd.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netinet/tcp.h>
#include <sys/select.h>
#include <poll.h>
#include <netdb.h>
#include <limits.h>

#define ip "192.168.188.133"
#define port 8888
#define INFTIM 10000

int main(int argc, char* argv[])
{
int afd, sfd;
struct sockaddr_in servaddr;

//创建socket文件描述符
sfd = socket(AF_INET, SOCK_STREAM, 0);
if(sfd == -1)
{
perror("sfd == -1");
exit(1);
}

//防止端口复用
int reuse = 1 ;
setsockopt(sfd, SOL_SOCKET, SO_REUSEADDR, (void*)&reuse, sizeof(reuse));

//初始化socket

memset(&servaddr, 0, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(port) ;
servaddr.sin_addr.s_addr = inet_addr(ip);

//绑定套接字
if(bind(sfd, (struct sockaddr*)&servaddr, sizeof(servaddr)) == -1)
{
perror("bind error");
exit(1);
}

//监听套接字
if(listen(sfd, 5) == -1)
{
perror("listen error");
exit(1);
}

struct pollfd fdarr[4];

fdarr[0].fd = sfd;
fdarr[0].events = POLLIN;

for(int i = 1; i < 4; ++i)
{
fdarr[i].fd = -1;
}
int maxfd = sfd;
int confd;
int i = 1;
while(1)
{
int flag = poll(fdarr, maxfd + 1, INFTIM);

if(flag == -1)
{
perror("poll error");
exit(1);
}

if(fdarr[0].revents & POLLIN)//监听套接字可读
{
confd = accept(sfd, NULL, NULL);

for(i = 1; i < 4; ++i)
{
if(fdarr[i].fd == -1)
{
fdarr[i].fd = confd;
fdarr[i].events = POLLIN;
break;
}
}

if(i == 4)
{
perror("too many client");
exit(1);
}
if(fdarr[i].fd > maxfd)
{
maxfd = fdarr[i].fd;
}
}

for(i = 1; i < 4; ++i)
{
if(fdarr[i].fd == -1)
{
continue;
}
if(fdarr[i].revents & (POLLIN | POLLERR))
{
int readn;
char buf[10];
memset(buf, 0, 10);
if((readn = read(fdarr[i].fd, buf, 10)) < 0)
{
if(errno == ECONNRESET)
{
close(fdarr[i].fd);
fdarr[i].fd = -1;

}else
{
perror("read error");
}
}else if(readn == 0)
{
close(fdarr[i].fd);
fdarr[i].fd = -1;
}else
{
printf("%s\n", buf);
}

}
}

}

//关闭套接字
close(sfd);

return 0;
}

client.cpp同上一篇select

poll与select区别在于文件描述符没有上限,select是1024个
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: