IO多路复用poll的代码

功能:使用poll去复用文件描述符,完成客户端向服务器发送信息

//server.c
#include <stdlib.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <unistd.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>
#include <poll.h>
int main(int argc,char *argv[])
{
	int sockfd,connfd;
	struct sockaddr_in server_addr,client_addr;
	char buf[64];
	sockfd=socket(AF_INET,SOCK_STREAM,0);
	if(sockfd<0){
		perror("socket");
		exit(-1);
	}
	//设置服务器IP地址并且绑定
	memset(&server_addr,0,sizeof(server_addr));
	server_addr.sin_family=AF_INET;
	server_addr.sin_addr.s_addr=inet_addr("192.168.12.183");
	server_addr.sin_port=htons(8080);
	//开始绑定
	if(bind(sockfd,(struct sockaddr *)&server_addr,sizeof(server_addr))!=0){
		perror("server bind");
		exit(-2);
	}
	if(listen(sockfd,5)!=0){
		perror("server listen");
		exit(-3);
	}
	int c_len=sizeof(client_addr);
	//定义监测表,并且清空
	int pos=-1;
	struct pollfd pfds[10];
	for(int i=0;i<10;i++){
		pfds[i].fd=-1;		
	}
	pfds[++pos].fd=sockfd;
	pfds[pos].events=POLLIN;
	while(1){
		int ret=poll(pfds,pos+1,-1);
		for(int i=0;i<=pos;i++){
			if(pfds[0].revents & POLLIN){
				connfd=accept(sockfd,(struct sockaddr *)&client_addr,&c_len);
				printf("%s comming...\n",inet_ntoa(client_addr.sin_addr));
				pfds[++pos].fd=connfd;
				pfds[pos].events=POLLIN;
				ret=poll(pfds,pos+1,-1);
			}else if(pfds[i].revents & POLLIN){
				
				//if(pfds[j].fd=connfd){
				ret= read(pfds[i].fd,buf,64);
				if(ret==0){
					close(pfds[i].fd);
					printf("client leave\n");
				}
				printf("recv info : %s\n",buf);
				//}
			}
		}
	}

	return 0;
}
//client.c
#include <stdlib.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <unistd.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>



int main(int argc,char *argv[])
{
	struct sockaddr_in server_addr;
	int sockfd;
	sockfd=socket(AF_INET,SOCK_STREAM,0);
	if(sockfd<0){
		perror("client socket");
		exit(-1);
	}
	memset(&server_addr,0,sizeof(server_addr));
	server_addr.sin_family=AF_INET;
	server_addr.sin_addr.s_addr=inet_addr("192.168.1.106");
	server_addr.sin_port=htons(8080);
	int con=connect(sockfd,(struct sockaddr *)&server_addr,sizeof(server_addr));
	if(con<0){
		perror("client connect");
		exit(-2);
	}
	char buf[512];
	memset(buf,0,sizeof(buf));
	while(1){
		printf("enter massage: \n");
		fgets(buf,sizeof(buf),stdin);
		buf[strlen(buf)-1]='\0';
		write(sockfd,buf,strlen(buf));
		memset(buf,0,sizeof(buf));
		read(sockfd,buf,512);
		printf("mean : %s\n",buf);

	}
    	return 0;
}