select模型代码2 -暂时实现不了并发

前言:关于select原理,只有弄懂 了内核的工作原理之后,才能真正明白。在CSDN上找了很多文章,要么是列出实践代码写一个服务器,要么是分析源码,都是一头雾水看不懂,所以推荐这篇讲原理的文章,先看明白

讲epoll原理的但是先讲了select

上篇代码的缺点:已经讲过了,这是第二次优化的代码

代码有点问题,现在第二个客户端开启不了 排查中

//select模型  第二次代码,将所有文件描述符放金一个数组中,减少便利此书 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 

int main() {
    int sfd = socket(AF_INET, SOCK_STREAM, 0); 
    //设置端口复用
    int opt =1;
    setsockopt ( sfd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(int));
   
    //定义一个地址结gou体
    struct sockaddr_in servad;
    bzero(&servad, sizeof( servad));
    servad.sin_family =AF_INET;
    servad.sin_port =htons(8888);
    servad.sin_addr.s_addr = htonl (INADDR_ANY);
 
    int ret = bind(sfd, (struct sockaddr*)&servad, sizeof( servad));
 
    //将socket从主动变为被动(服务器必备),这样可以监听来自客户的请求
    listen(sfd,128);  
     //select 模型的相关参数 设置  
     //定义fd_set 类型的变量, 并且清空它们
    fd_set readfds, tmpfds;
    FD_ZERO ( &readfds);
    FD_ZERO ( &tmpfds);
    //把sfd加入到readfds中,让内核监视sfd的变化
    FD_SET (sfd, &readfds);

    int maxfd = sfd;
    int newfd ;
    int i ;
    int nready =0;
    int sockfd;
    char buf[FD_SETSIZE];
    int connfd[FD_SETSIZE];
    //保存所有有效的 文件描述符
    for (i =0;i0) { 
             //两种情况,第一种,有新的连接请求。注意,tmpfds  已经变化了,但是readfds没有变化
             if ( FD_ISSET (sfd, &tmpfds)) {
                 newfd = accept (sfd,NULL, NULL);
	         if (newfd<0) {
		      if(errno ==ECONNABORTED ||errno == EINTR){
			    continue;
	              }
		    break;
	         }
	         //在数组里找一个最靠前的,还是-1的地方,替换成newfd
	         for (i =0; i

你可能感兴趣的:(java,开发语言)