我一直在努力在Linux编程的一些套接字,我正在尝试做一个并发代理服务器。 基本上我希望连接到代理服务器的每个客户端遇到2个问题。 第一个是介绍命运的IP,第二个是它的端口号。 在发送这些信息之后,代理服务器将把每个客户端连接到他们select的IP(这是和回显服务器)。
我的问题是如何以及将在哪里保存每个用户回答的2个问题,然后将它们连接到他们select的回显服务器。
以下是我认为我们必须处理的部分代码:
/*============ WARNS THAT SERVER IS READY TO ACCEPT REQUESTS ==================*/ if(listen(sockfd,5)==-1) Abort("Impossible to accept requests"); /*========== STARTS ANSWERING CLIENTS BY CONCURRENT FORM =============*/ cliaddr_len=sizeof(cli_addr); while(1){ FD_ZERO(&fd_read); FD_SET(STDIN_FILENO,&fd_read); FD_SET(sockfd,&fd_read); fflush(stdin); n=select(32,&fd_read,NULL,NULL); if(n<0) if( errno!=EINTR){ close(sockfd); Abort("Error on select"); }else continue; if(FD_ISSET(STDIN_FILENO,&fd_read)){ gets(comando); if(strcmp(comand,"exit")==0){ close(sockfd); printf("Goodbye...n"); exit(0); } } if(FD_ISSET(sockfd,&fd_read)) if((newsockfd=accept(sockfd,(struct sockaddr *)&cli_addr,&cliaddr_len)) ==-1) fprintf(stderr,"<SERV>Impossible to accept clients...n"); else{ switch(fork()){/*Goes to backgroud*/ case -1:fprintf(stderr,"Impossible to answer..."); close(newsockfd); break; case 0:close(sockfd); /* SON */ AnswerClient(newsockfd); exit(EXIT_SUCCESS); default:close(newsockfd); /* DAD */ } } } } /*___________________________ AnswerClient ____________________________________ ______________________________________________________________________________*/ void AnswerClient(int sockfd){ static char buffer[BUFFERSIZE]; static unsigned int cont=0U; int nbytes; pid_t pid=getpid(); while(1){ /*==================== PROCESS REQUEST ==========================*/ cont++; switch((nbytes=ReadLine(sockfd,buffer,BUFFERSIZE))){ case -1:fprintf(stderr,"Error receiving data...n"); return; case 0:fprintf(stderr,"Client didnt sent data...n"); return; default:printf("n<%d>Message received: %sn",pid,buffer); if(!strncmp(buffer,"exit",4)){ printf("<%d>Going shutdown...n",pid); close(sockfd); return; } /*============ Sends Confirmation =============*/ sprintf(buffer,"<%d>",pid); nbytes=strlen(buffer); if(WriteN(sockfd,nbytes)!=nbytes) fprintf(stderr,"Impossible to confirm.n"); } } } /*_____________________________ ReadLine _______________________________________ Reads a line (until find the caracter 'n') of a socket. Returns: -1 : if error 0 : EOF != : if read some bytes ______________________________________________________________________________*/ int ReadLine(int sockfd,char* buffer,int maxlen){ int n,rc; char c; for(n=0;n<maxlen-1;n++){ if((rc=read(sockfd,&c,1))==1){ *buffer++=c; if(c=='n') break; }else if (rc==0) { if(n==0) return(0); /*EOF*/ else break; /*EOF but has already read some bytes*/ } else return(-1); /*Error*/ } *buffer=0; return(n); } /*______________________________ WriteN _______________________________________ Writes n bytes on socket in case. Returns the number of bytes writen. ______________________________________________________________________________*/ int WriteN(int sockfd,char * buffer,int nbytes){ int nleft,nwritten; nleft=nbytes; while(nleft>0){ if((nwritten=write(sockfd,nleft))<=0) return(nwritten); nleft-=nwritten; buffer+=nwritten; } return(nbytes-nleft); } void Abort(char *msg){ fprintf(stderr,"a<SER1>Fatal error: <%s>n",msg); perror("Erro do sistema"); exit(EXIT_FAILURE); } void buryZombie() { static int status; wait(&status); }
如何从两个代理识别真实? (Nginx的)
Rstudio和shiny的服务器代理设置
Python脚本,代理和Microsoft Forefront – 自动身份validation
Nginx隐藏转发的端口号
RicardoCosta
wget不使用基于环境variables的代理设置
使用基本身份validation通过代理发送curl请求
Nginx的 – 可以configuration代理caching,这样文件保存没有HTTP头,否则以更“人性化”的格式?
如何从系统服务自动检测代理设置
要通过TCP连接,一方将不得不连接到另一方。 代理可以决定哪一个连接,并通知一个客户端是服务器,另一个是客户端。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。