服务器IO多路复用模型
来源:互联网 发布:剑灵可爱萝莉捏脸数据 编辑:程序博客网 时间:2024/05/29 18:16
一、服务器端代码:
#include<stdio.h>
#include<sys/socket.h>
#include<unistd.h>
#include<sys/types.h>
#include<errno.h>
#include<string.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<netinet/in.h>
#include<stdlib.h>
#include<sys/select.h>
#include<sys/time.h>
int main()
{
int socket_fd,connect_fd;
struct sockaddr_in servaddr;
char buff[3];
int n;
//create socket
if((socket_fd = socket(AF_INET,SOCK_STREAM,0)) == -1)
{
printf("create socket error!\n");
exit(0);
}
//set local address
memset(&servaddr,0,sizeof(servaddr)); //memset可以方便的清空一个结构类型的变量或数组。
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
servaddr.sin_port = htons(8001);
//bind the local addr to socket
if(bind(socket_fd,(struct sockaddr*)&servaddr,sizeof(servaddr)) == -1)
{
printf("bind error %d!\n",errno);
exit(0);
}
//listen client
if(listen(socket_fd,5) == -1)
{
printf("listen error\n");
exit(0);
}
printf("服务器已经启动!\n");
fd_set fdset;
int accept_fd[4096]={0};
while(1)
{
FD_ZERO(&fdset);
FD_SET(socket_fd,&fdset);
for(int i=0;i<4096;i++)
{
if(accept_fd[i] != 0)
FD_SET(accept_fd[i],&fdset);
}
//fd_set fdread = fdset;
int ret = select(6,&fdset,0,0,0); //判断集合中是否有时间发生,没有时间发生的套接字将移出集合
if(ret > 0) //套接字有事件发生
{
for(int i=0;i<4096;i++)
{
if(accept_fd[i] == 0)
continue;
if( FD_ISSET(accept_fd[i],&fdset)) //如果是监听套接字说明有用户连接
{
char buff[4096] = {0};
int len = recv(accept_fd[i],buff,4096,0);
if(len > 0)
{
printf("receive from client[%d]: %s\n",accept_fd[i],buff);
if(!fork())
{
if(send(accept_fd[i],"hello, you are connected\n",26,0) == -1)
perror("send error");
close(accept_fd[i]);
accept_fd[i] = 0;
}
}
else
{
accept_fd[i] = 0;
close(accept_fd[i]);
FD_CLR(accept_fd[i],&fdset);
}
}
}
if(FD_ISSET(socket_fd,&fdset))
{
struct sockaddr_in clientaddr;
unsigned int len = sizeof(clientaddr);
int newsocket = accept(socket_fd,(struct sockaddr *)&clientaddr,&len);
if(newsocket <=0)
{
printf("accept error!%s",strerror(errno));
continue;
}
int j =0 ;
for(;j<4096;j++)
{
if(accept_fd[j] == 0)
{
accept_fd[j] = newsocket;
break;
}
}
if(j == 4096)
{
printf("max connection,exit\n");
send(newsocket,"max connection exit",20,0);
close(newsocket);
break;
}
}
}
else if(ret == 0)
{
printf("timeout\n");
}
else
{
printf("select error\n");
break;
}
}
close(socket_fd);
}
- IO多路复用服务器模型
- 服务器IO多路复用模型
- IO多路复用模型
- 多路复用IO模型
- IO多路复用 Select模型
- IO多路复用 epoll模型
- Linux :IO多路复用模型
- Linux :IO多路复用模型
- IO多路复用模型
- IO模型之IO多路复用
- IO多路复用并发服务器
- 多路复用服务器网络模型
- 多路复用 循环服务器模型
- IO多路复用模型的探讨
- IO多路复用模型之Select
- 高性能IO模型-IO多路复用机制
- C/S通信---服务器IO多路复用模型之select的使用
- C/S通信---服务器IO多路复用模型之poll的使用
- Spring的IOC和DI
- iOS控制器-路由跳转
- JNI基础02
- 写一个宏将一个数的奇数位和偶数位交换
- TextView部分文字设置指定颜色和大小和字体
- 服务器IO多路复用模型
- HDU 1850 Being a Good Boy in Spring Festival
- HDU 1049Climbing Worm 解题报告
- 设计模式之 策略模式
- JavaScript 命名空间
- java Date常用操作方法
- Groovy字符串及其常用方法
- 1008. 数组元素循环右移问题 (20)——数组循环移动算法
- kmp算法--通俗易懂