C++ C linux代理服务器

C++ C linux代理服务器,c++,c,linux,sockets,C++,C,Linux,Sockets,我正在尝试构建一个客户端->代理服务器->服务器应用程序 我需要有关代理服务器的帮助,如何让它立即将数据发送到服务器,它只能与客户端通信 这是我的codef或代理服务器,我根据一个示例对其进行了修改。这方面我是新手 int main(int argc, char *argv[]) { int sockfd, newsockfd, portno, pid; socklen_t clilen; struct sockaddr_in serv_addr, cli_addr

我正在尝试构建一个客户端->代理服务器->服务器应用程序

我需要有关代理服务器的帮助,如何让它立即将数据发送到
服务器
,它只能与客户端通信

这是我的codef或
代理服务器
,我根据一个示例对其进行了修改。这方面我是新手

int main(int argc, char *argv[])
{
     int sockfd, newsockfd, portno, pid;
     socklen_t clilen;
     struct sockaddr_in serv_addr, cli_addr;

     if (argc < 2) {
         fprintf(stderr,"ERROR, no port provided\n");
         exit(1);
     }
     sockfd = socket(AF_INET, SOCK_STREAM, 0);
     if (sockfd < 0) 
        error("ERROR opening socket");
     bzero((char *) &serv_addr, sizeof(serv_addr));
     portno = atoi(argv[1]);
     serv_addr.sin_family = AF_INET;
     serv_addr.sin_addr.s_addr = INADDR_ANY;
     serv_addr.sin_port = htons(portno);
     if (bind(sockfd, (struct sockaddr *) &serv_addr,
              sizeof(serv_addr)) < 0) 
              error("ERROR on binding");
     listen(sockfd,5);
     clilen = sizeof(cli_addr);
     while (1) {
         newsockfd = accept(sockfd, 
               (struct sockaddr *) &cli_addr, &clilen);
         if (newsockfd < 0) 
             error("ERROR on accept");
         pid = fork();
         if (pid < 0)
             error("ERROR on fork");
         if (pid == 0)  {
             close(sockfd);
             dostuff(newsockfd);
             exit(0);
         }
         else close(newsockfd);
     } /* end of while */
     close(sockfd);
     return 0; /* we never get here */
}

/******** DOSTUFF() *********************
 There is a separate instance of this function 
 for each connection.  It handles all communication
 once a connnection has been established.
 *****************************************/
void dostuff (int sock)
{
   int n, p;
   char buffer[256];
   char request;
   FILE *file; 
   file = fopen("process.log","a+");

   do
   {
       //here the proxy server receives data from the client
   bzero(buffer,256);
   p = read(sock,buffer,255);
   if (n < 0) error("ERROR reading from socket");

   printf("num: %s\n",buffer);

       //here the proxy servers replies to the client.
   n = write(sock,buffer,sizeof(buffer));

       //here the process should send data to the server
       //...codes i need help with...           

   if (n < 0) error("ERROR writing to socket");
   fprintf(file,"%s\n",buffer); /*writes*/ 

   }while(p != 0); //this runs the process +1 more than it should. wonder why?

   fclose(file);
}
intmain(intargc,char*argv[])
{
int sockfd、newsockfd、端口号、pid;
socklen_t clilen;
服务地址中的结构sockaddr\u,cli\u addr;
如果(argc<2){
fprintf(stderr,“错误,未提供端口\n”);
出口(1);
}
sockfd=套接字(AF_INET,SOCK_STREAM,0);
if(sockfd<0)
错误(“打开套接字时出错”);
bzero((char*)&serv_addr,sizeof(serv_addr));
portno=atoi(argv[1]);
serv_addr.sin_family=AF_INET;
serv_addr.sin_addr.s_addr=INADDR_ANY;
serv_addr.sin_port=htons(端口号);
如果(绑定(sockfd,(结构sockaddr*)和服务地址,
sizeof(服务地址))<0)
错误(“绑定错误”);
听(sockfd,5);
clilen=sizeof(cli_addr);
而(1){
newsockfd=接受(sockfd,
(结构sockaddr*)和cli_addr和clilen);
if(newsockfd<0)
错误(“接受错误”);
pid=fork();
if(pid<0)
错误(“叉子上的错误”);
如果(pid==0){
关闭(sockfd);
dostuff(newsockfd);
出口(0);
}
否则关闭(newsockfd);
}/*结束时*/
关闭(sockfd);
返回0;/*我们永远无法到达这里*/
}
/********多斯塔夫()*********************
此函数有一个单独的实例
对于每个连接。它处理所有的通信
一旦建立了连接。
*****************************************/
空隙度凝灰岩(内部短袜)
{
int n,p;
字符缓冲区[256];
字符请求;
文件*文件;
file=fopen(“process.log”,“a+”);
做
{
//在这里,代理服务器从客户端接收数据
b0(缓冲器,256);
p=读取(sock,buffer,255);
如果(n<0)错误(“从套接字读取错误”);
printf(“数量:%s\n”,缓冲区);
//在这里,代理服务器答复客户机。
n=写入(sock、buffer、sizeof(buffer));
//在这里,进程应该向服务器发送数据
//…代码我需要帮助。。。
if(n<0)错误(“写入套接字错误”);
fprintf(文件“%s\n”,缓冲区);/*写入*/
}while(p!=0);//这比它应该运行的进程多了+1。不知道为什么?
fclose(文件);
}
DoStuff()。。。。你也可以查看我添加的评论。 另外,如何在客户端连接到服务器后立即向客户端发送消息,例如欢迎客户端消息:)

注意:代理服务器向HTTP 1.1服务器发送GET请求


我会非常感激的。谢谢:)

要连接到服务器,您必须先调用
socket
,然后再调用
connect
,才能从代理服务器将套接字连接到真正的服务器。见第5节:


另外,在do while循环中选择
p
而不是
n
4行
DoStuff()

我只是无法表达代码。我可以看看代理服务器的示例代码吗?或者是介于客户机和实际服务器之间的服务器?请按照从客户机连接到服务器的说明进行操作,以实现上面遇到问题的部分。在代理回调的顶部,您将创建一个新套接字,并将其连接到真正的服务器,然后使用该套接字进行写入。尝试一下,如果您有问题,请使用更新的代码与我们联系。你能行!使用上面我给你的两个函数,这就是它的全部功能。