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;
}