Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 用缓存系统实现代理_C_Caching_Network Protocols - Fatal编程技术网

C 用缓存系统实现代理

C 用缓存系统实现代理,c,caching,network-protocols,C,Caching,Network Protocols,我正在尝试实现一个简单的代理服务器,到目前为止,我已经成功地正确地实现了GET方法,但是现在我必须为它实现一个缓存。其背后的想法是,当我得到以下命令时: 获取www.google.com 获取www.cplusplus.com 获取www.google.com 第二次我被要求从谷歌获取信息时,应该是从我的缓存系统获取的。我一直在想,最好的方法是实现一个简单的归档系统,在这个系统中,我将收到的信息存储在文件中,然后在发现文件存在时读取它。我遇到的唯一问题是,我无法创建以下文件 这是我的代码,让

我正在尝试实现一个简单的代理服务器,到目前为止,我已经成功地正确地实现了GET方法,但是现在我必须为它实现一个缓存。其背后的想法是,当我得到以下命令时:

  • 获取www.google.com
  • 获取www.cplusplus.com
  • 获取www.google.com
第二次我被要求从谷歌获取信息时,应该是从我的缓存系统获取的。我一直在想,最好的方法是实现一个简单的归档系统,在这个系统中,我将收到的信息存储在文件中,然后在发现文件存在时读取它。我遇到的唯一问题是,我无法创建以下文件

这是我的代码,让你明白我在做什么

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <netdb.h>
#include <errno.h>

void error(char* msg) {
    perror(msg);
    exit(0);
}

int main(int argc,char* argv[]) {

int count = 0;
FILE *in;
FILE *out;
pid_t pid;
struct sockaddr_in addr_in,cli_addr,serv_addr;
struct hostent* host;
int sockfd,newsockfd;

if(argc<2)
    error("./proxy <port_no>");

printf("\n*****WELCOME TO PROXY SERVER*****\n");

bzero((char*)&serv_addr,sizeof(serv_addr));
bzero((char*)&cli_addr, sizeof(cli_addr));

serv_addr.sin_family=AF_INET;
serv_addr.sin_port=htons(atoi(argv[1]));
serv_addr.sin_addr.s_addr=INADDR_ANY;


sockfd=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
if(sockfd<0)
    error("Problem in initializing socket");

if(bind(sockfd,(struct sockaddr*)&serv_addr,sizeof(serv_addr))<0)
    error("Error on binding");


listen(sockfd,50);
int clilen=sizeof(cli_addr);



startpoint:

newsockfd=accept(sockfd,(struct sockaddr*)&cli_addr,&clilen);

if(newsockfd<0)
error("Problem in accepting connection");

pid=fork();
//printf("Pid is: %d\n", pid);
if(pid==0) {
    sites saves[10];
    int noOfSites = 0;
    struct sockaddr_in host_addr;
    int flag=0,newsockfd1,n,port=0,i,sockfd1;
    char buffer[510],t1[300],t2[300],t3[10], aux[510];
    char* temp=NULL;
    bzero((char*)buffer,500);
    recv(newsockfd,buffer,sizeof(buffer),0);
    //printf("%s\n",buffer);
    sscanf(buffer,"%s %s %s",t1,t2,t3);
    //printf("%s\n",buffer);

    if (((strncmp(t1,"GET",3)==0))&&((strncmp(t3,"HTTP/1.0",8)==0)||(strncmp(t3,"HTTP/1.0",8)==0))&&(strncmp(t2,"http://",7)==0)) {
        strcpy(t1,t2);
        int saved = 0;
        flag=0;

        for(i=7;i<strlen(t2);i++) {
            if(t2[i]==':') {
                flag=1;
                break;
            }
        }
         // printf("The site to GET is : %s\n",t2);
        temp=strtok(t2,"//");
        if (flag==0) {
            port=80;
            temp=strtok(NULL,"/");
        }
        else {
            temp=strtok(NULL,":");
        }

        sprintf(t2,"%s",temp);
        host=gethostbyname(t2);

                    int it;
          for (it = 0; it < noOfSites; it++){
            printf("Site saved is: %s\n", saves[it].site);
            if (strcmp(saves[it].site,t2) == 0){
                saved = 1;
                out = fopen(t2, "r");
                printf("We have cache!\n");
            }
        }
        if(flag==1) {
            temp=strtok(NULL,"/");
            port=atoi(temp);
        }


        strcat(t1,"^]");
        temp=strtok(t1,"//");
        temp=strtok(NULL,"/");
        if(temp!=NULL)
            temp=strtok(NULL,"^]");


        bzero((char*)&host_addr,sizeof(host_addr));
        host_addr.sin_port=htons(port);
        host_addr.sin_family=AF_INET;
        bcopy((char*)host->h_addr,(char*)&host_addr.sin_addr.s_addr,host->h_length);

        sockfd1=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
        newsockfd1=connect(sockfd1,(struct sockaddr*)&host_addr,sizeof(struct sockaddr));
        sprintf(buffer,"\nConnected to %s  IP - %s\n",t2,inet_ntoa(host_addr.sin_addr));
        if(newsockfd1<0)
            error("Error in connecting to remote server");

        bzero((char*)buffer,sizeof(buffer));
        if(temp!=NULL)
            sprintf(buffer,"GET /%s %s\r\nHost: %s\r\nConnection: close\r\n\r\n",temp,t3,t2);
        else
            sprintf(buffer,"GET / %s\r\nHost: %s\r\nConnection: close\r\n\r\n",t3,t2);




        if (saved == 1){
            printf("Are we ever here\n");
            n = send(sockfd1,buffer,strlen(buffer),0);
            char * line = NULL;
            size_t len = 0;
            ssize_t read;
            int count = 0;
            if (n<0)
                error("Error writing to socket");
            else {
                while ((read = getline(&line, &len, out)) != -1) {
                    //printf("Retrieved line of length %zu :\n", read);
                    if (count > 0)
                        write(newsockfd,line,read);
                    if (strcmp(line,"\r\n") == 0)
                        count++;
                }
            }
        }

        if (saved == 0){
            //printf("We are only here\n");
            strcpy(saves[noOfSites].site,t2);
            noOfSites++;
            printf("The new site file is: %d\n", noOfSites);


            in = fopen(t2,"w");
            n=send(sockfd1,buffer,strlen(buffer),0);
            printf("I have opened for writing: %s\n\n\n\n\n\n",t2);

            if(n<0)
                error("Error writing to socket");
            else {
                do {
                    memset(buffer, 0, sizeof(buffer));
                    n=recv(sockfd1,buffer,sizeof(buffer),0);
                    fwrite(buffer, n, 1, stdout);
                    printf("\n");
                    fwrite(buffer, n, 1, in);
                    if(!(n<=0))
                        write(newsockfd,buffer,n);
                } while(n>0);
            }
        }
    }
    else {
        send(newsockfd,"400 : BAD REQUEST\nONLY HTTP REQUESTS ALLOWED",18,0);
    }
    close(sockfd1);
    close(newsockfd);
    close(sockfd);
    fclose(in);
    return 0;
}
else {
    close(newsockfd);
    goto startpoint;
}
return 0;
}
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
无效错误(字符*消息){
佩罗尔(味精);
出口(0);
}
int main(int argc,char*argv[]){
整数计数=0;
文件*in;
归档;
pid_t pid;
结构sockaddr\u in addr\u in、cli\u addr、serv\u addr;
结构主机*主机;
int sockfd,newsockfd;

如果(argc您正在寻找一个通用的键/值数据存储。您可以在内存中使用哈希表,使用像gdbm这样的简单数据库,或者选择像MongoDB这样更高级的数据库。

如果我在过程中犯了一些错误并且没有提出好的问题,我真的很抱歉,但我已经设法自己解决了这个问题。麻烦当我试图创建文件来存储get命令中的信息时,我试图创建文件名如下:当我试图从C程序创建文件时,它不会让我作为/被禁止(或者我已经理解了)。我的任务很简单,用其他东西来替换/(在我的例子中u)这一切都很顺利。谢谢你们的努力。如果我让你们在试图理解我所说的话时浪费了时间,我真的很抱歉

更确切地说,我想做的是,当我第二次收到get命令时(使用相同链接的相同get命令),我需要从我第一次收到命令时创建的文件中获取信息。它应该是这样的:

  • 获取www.something.com HTTP/1.0->我需要创建一个名为“www.something.com”的文件,将该站点的所有信息存储在该文件中,然后关闭该文件,当然还需要将该信息发送到为通信而打开的套接字
  • 获取www.something.com HTTP/1.0->我需要打开由上一个命令创建的文件,并从该文件获取要发送的信息

再次,如果我打扰了某人,请道歉。非常感谢!

寻求调试帮助的问题(“为什么此代码不起作用?”)必须包括所需的行为、特定的问题或错误以及在问题本身中重现问题所需的最短代码。没有明确问题说明的问题对其他读者没有用处。请参阅: