|
藍森林 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));
} |
| |