藍森林首頁 | 返回主頁 | 本站地圖 | 站內搜索 | 聯繫信箱 |
 您目前的位置:首頁 > 自由軟件 > 技術交流 > 應用編程


    

藍森林 http://www.lslnet.com 2006年6月6日 10:18


accept返回0到底算不算正常?by菜鳥

在多路復用下老是返回0,但我要的是一個正整數,不然會出錯。怎麼辦? :oops:

accept返回0到底算不算正常?by菜鳥

把你的具體錯誤用perror打印出來

accept返回-1是出錯

accept返回0到底算不算正常?by菜鳥

perror():accept(): Success
strerror():accept error:Illegal seek

accept返回0到底算不算正常?by菜鳥

還是把你的相關代碼貼出來吧

accept返回0到底算不算正常?by菜鳥

摟主不提供OS類型

只能建議你man accept

accept返回0到底算不算正常?by菜鳥

[code]#include"sel_conc.h"
#include<stdlib.h>;
#include<unistd.h>;
#include<stdio.h>;
#include<fcntl.h>;
void accept_conn(struct conn_queue *cq);
void read_requ(struct conn_queue *cq,int idx);
void write_resp(struct conn_queue *cq,int idx);
int main()
{
        struct conn_queue cq;
        struct sockaddr_in addr;
        struct timeval t;
        t.tv_sec=0;
        t.tv_usec=0;
        fd_set rds,wds;
        int maxfd;
        int i,j,nsel;
        char buf[1024];
        int n,x;
        cq.lfd=socket(AF_INET,SOCK_STREAM,0);
        if(cq.lfd<0){
                printf("socket error:%s\n",strerror(errno));
                exit(1);
        }
        bzero(&addr,sizeof(addr));
        addr.sin_family=AF_INET;
        addr.sin_port=htons(8088);
        addr.sin_addr.s_addr=htonl(INADDR_ANY);
        i=1;
        setsockopt(cq.lfd,SOL_SOCKET,SO_REUSEADDR,&i,sizeof(i));
        i=fcntl(cq.lfd,F_GETFL,0);
        x=fcntl(cq.lfd,F_SETFL,i|O_NONBLOCK);
        if(bind(cq.lfd,(struct sockaddr *)&addr,sizeof(addr))<0){
                printf("bind error:%s\n",strerror(errno));
                exit(1);
        }
        listen(cq.lfd,BACKLOG);
        FD_ZERO(&rds);
        FD_ZERO(&wds);
        for(i=0;i<CONN_FD_MAX;i++){
                cq.ci[i].fd=-1;
                cq.ci[i].sd=-1;
        }
        cq.navail=CONN_FD_MAX;
        for(;;){
                FD_ZERO(&rds);
                FD_ZERO(&wds);
                maxfd=0;
                if(cq.navail>;0){
                        FD_SET(cq.lfd,&rds);
                        maxfd=cq.lfd;
                }
                for(i=0;i<CONN_FD_MAX;i++){
                        if(cq.ci[i].sd>;=0){
                                if(cq.ci[i].fd>;=0){
                                        FD_SET(cq.ci[i].fd,&wds);
                                        maxfd=maxfd>;cq.ci[i].fd?maxfd:cq.ci[i].fd;
                                }
                                else{
                                        FD_SET(cq.ci[i].sd,&rds);
                                        maxfd=maxfd>;cq.ci[i].sd?maxfd:cq.ci[i].sd;
                                }
                        }
                }
                nsel=select(maxfd+1,&rds,&wds,NULL,NULL);
                if(FD_ISSET(cq.lfd,&rds)){
                        accept_conn(&cq);
                        nsel--;
                }
                for(i=0;i<CONN_FD_MAX&&nsel>;0;i++){
                        if(cq.ci[i].sd==-1)
                                continue;
                        if(FD_ISSET(cq.ci[i].sd,&rds)){
                                read_requ(&cq,i);
                                nsel--;
                        }
                        if(cq.ci[i].fd==-1)
                                continue;
                        if(FD_ISSET(cq.ci[i].fd,&wds)){
                                write_resp(&cq,i);
                                nsel--;
                                close(i);
                        }
                }
        }
}
void accept_conn(struct conn_queue *cq)
{
        int cfd;
        int i;
        cfd=accept(cq->;lfd,NULL,NULL);
//連接多個客戶機,運行幾次後次返回0,然後程序就出錯了
        perror("select()");
        printf("accept error:%s\n",strerror(errno));
        if(cfd<0)
                return;
        i=fcntl(cfd,F_GETFL,0);
        fcntl(cfd,F_SETFL,i|O_NONBLOCK);
        for(i=0;i<CONN_FD_MAX;i++){
                if(cq->;ci[i].sd<0)
                        break;
        }
        cq->;ci[i].sd=cfd;
        cq->;navail--;
}
void read_requ(struct conn_queue *cq,int idx)
{
        char buf[512];
        int fd;
        int n;
        n=read(cq->;ci[idx].sd,buf,sizeof(buf));
        buf[n]=0;
        fd=open(buf,O_RDONLY);
        if(fd<0){
                close(cq->;ci[idx].sd);
                cq->;ci[idx].sd=-1;
                cq->;navail++;
                return;
        }
        cq->;ci[idx].fd=fd;
}
void write_resp(struct conn_queue *cq,int idx)
{
        char buf[1024];
        int n,m;
        n=read(cq->;ci[idx].fd,buf,sizeof(buf));
        if(n==0){
                close(cq->;ci[idx].sd);
                close(cq->;ci[idx].fd);
                cq->;ci[idx].sd=-1;
                cq->;ci[idx].fd=-1;
                cq->;navail++;
               
                return;
        }
        m=write(cq->;ci[idx].sd,buf,n);
}[/code]
[/code]

accept返回0到底算不算正常?by菜鳥

if((cfd=accept(cq->;lfd,NULL,NULL)) <= 0 ) {
//連接多個客戶機,運行幾次後次返回0,然後程序就出錯了
      printf("accept error:%s\n",strerror(errno));
}



Copyright © 1999-2000 LSLNET.COM. All rights reserved. 藍森林網站 版權所有。 E-mail : webmaster@lslnet.com