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个