poll做服务器select做客户端
实现互相通信
运用max无1024程序代码:
#include <myhead.h>
#define IP "192.168.114.74"//设置IP地址
#define PORT 8888 //设置端口号
int main(int argc,const char *argv[])
{
//1.创建用于连接的套接字
int sfd=socket(AF_INET,SOCK_STREAM,0);
if(sfd == -1)
{
perror("socket error");
return -1;
}
//设置端口快速重用
int reuse = 1;
if(setsockopt(sfd,SOL_SOCKET,SO_REUSEADDR,&reuse,sizeof(reuse)) == -1)
{
perror("setsockopt error");
return -1;
}
//2.绑定端口号,IP地址
struct sockaddr_in sin;
sin.sin_family = AF_INET;
sin.sin_port = htons(PORT);
sin.sin_addr.s_addr = inet_addr(IP);
if(bind(sfd,(struct sockaddr*)&sin,sizeof(sin)) == -1)
{
perror("bind error");
return -1;
}
printf("bind success\n");
//3.设置监听和等待连接队列
if(listen(sfd,128) == -1)
{
perror("listen error");
return -1;
}
printf("listen success\n");
//4.阻塞客户端的连接请求
struct sockaddr_in cin;
cin.sin_family =AF_INET;
socklen_t socklen=sizeof(cin);
struct sockaddr_in soveCin[1024];
int max=2;
int newfd=-1;
struct pollfd fd[1024];
fd[0].fd = 0;
fd[0].events = POLLIN;
fd[1].fd = sfd;
fd[1].events = POLLIN;
int rnn = 0;
char buf[128]=" ";
while(1)
{
rnn=poll(fd,max,-1); /poll定义
// rnn=poll(fd,1024,-1);
if(rnn == -1)
{
perror("poll error");
return -1;
}else if(rnn == 0)
{
printf("time out\n");
return -1;
}else
{
if(fd[1].revents == POLLIN) //与客户端取得连接
{
newfd=accept(sfd,(struct sockaddr*)&cin,&socklen);
if(newfd == -1)
{
perror("accept error");
return -1;
}
printf("连接成功\n");
存储新的文件描述符
fd[max].fd = newfd;
fd[max].events = POLLIN;
存储新的文件描述符的结构体信息
soveCin[max]=cin;
printf("newfd = %d\n",newfd);
max+=1;
}
if(fd[0].revents == POLLIN)
{
char buf1[128]=" ";
bzero(buf,sizeof(buf));
fgets(buf,sizeof(buf),stdin);
buf[strlen(buf)-1]='\0';
sprintf(buf1,"%s%s","系统消息:",buf);
for(int i=4;i<=max+2;i++)
// for(int i=4;i < 1024;i++)
{
send(i,buf1,sizeof(buf1),0);
}
}
for(int j=2,i=4;j<max;i++,j++)
// for(int i=4;i<1024;i++)
{
if(fd[j].revents == POLLIN)
{
//5.收发数据
bzero(buf,sizeof(buf));
int res=recv(i,buf,sizeof(buf),0);
if(res == 0)
{
printf("客户端已退出\n");
close(i);
/*是否需要删除用户*/
continue;
}
if(res < 0)
{
perror("recv error");
return -1;
}
printf("%s:%d=%s\n",inet_ntoa(soveCin[j].sin_addr),ntohs(soveCin[j].sin_port),buf);
/* strcat(buf,"*_**_*");
send(i,buf,sizeof(buf),0);*/
}
}
}
}
//6.关闭套接字文件
close(sfd);
return 0;
}