LINUX服务-POLL函数实例
//LINUX服务器聊天消息转发,使用POLL函数的实例
#include
#include
#include
#include
#include
#include
#define BUFFSIZE 65536
#define CNUM 4
struct Client
{
int Cid;
unsigned short Cport;
unsigned int Cs_addr;
};
main()
{
struct Client c[CNUM]={0};
int iClient=0;
struct sockaddr_in iAddr={0};
iAddr.sin_family=AF_INET;
iAddr.sin_port=htons(60000);
iAddr.sin_addr.s_addr=0;
int iSock=socket(PF_INET,SOCK_STREAM,0);
int ibind=bind(iSock,(struct sockaddr*)&iAddr,sizeof(iAddr));
if(ibind==-1)
{
perror("Bind error\n");
return;
}
int ilisten=listen(iSock,10);
if(-1==ilisten)
{
perror("Listen error\n");
}
int iuse=1;
setsockopt(iSock,SOL_SOCKET,SO_REUSEADDR,&iuse,sizeof(int));
struct sockaddr_in uAddr={0};
int uLen=sizeof(uAddr);
int iRecv,iSend;
struct pollfd server[10]={0};
server[0].events=POLLIN;
server[0].fd=iSock;
int iMax=0;
printf("服务器启动\n");
while(1)
{
int ifor=0;
int iPoll=poll(server,iMax+1,-1);
for(;ifor
{
if(iPoll>0)
{
if(server[ifor].revents)
{
if(server[ifor].fd==iSock)
{
char buf[100]={0};
int uSock=accept(iSock,(struct sockaddr*)&uAddr,&uLen);
memset((char*)buf,0,100);
int cfor=0;
for(;cfor
{
if(c[cfor].Cid==0)
{
c[cfor].Cid=uSock;
c[cfor].Cport=uAddr.sin_port;
c[cfor].Cs_addr=uAddr.sin_addr.s_addr;
iClient++;
break;
}
}
int ufor=0;
int flag=0;
for(;ufor
{
if(server[ufor].fd==0)
{//iMax++;
server[ufor].fd=uSock;
server[ufor].events=POLLIN;
flag=1;
break;
}
}
if(flag==0)//有的话就挂上刚刚的连接
{
iMax++;
server[iMax].fd=uSock;
server[iMax].events=POLLIN;
}
//显示连接端口信息
printf("Connect:%