proxy C++

这篇博客记录了作者很久以前用C++编写的一个简单的代理服务器,主要目的是为了熟悉socket编程。这个代理服务器的功能实现并不完善,不具备实际应用价值。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

很久以前写着玩的,无任何参考意义,仅仅熟悉socket编程

#include "iostream"
#include "sys/socket.h"
#include "string.h"
#include "unistd.h"
#include "sys/types.h"
#include "netdb.h"
#include "netinet/in.h"
#include "stdlib.h"
#include "errno.h"
using namespace std;
#define SIZE 4000
struct sockid{
  int sockfd_server;
  int sockfd_sender;
  sockid(){
    sockfd_server=-1;
    sockfd_sender=-1;
  }
};
int init(sockaddr_in &addr,char *hostname,int port){
  memset(&addr,0,sizeof(addr));
  addr.sin_family=AF_INET;
  addr.sin_port=htons(port);
  hostent *ht=gethostbyname(hostname);
  if(ht==NULL){
      herror(NULL);
     cout<<"gethostbyname error!"<<endl;
     return -1;
  }
  memcpy(&addr.sin_addr,ht->h_addr_list[0],sizeof(addr.sin_addr));
  return 0;
}
int getaddr(sockaddr_in&addr,char*buf){
  int p=0;
  char hostname[30];
  while(1){
    if(p+3<strlen(buf)&&buf[p]=='H'&&buf[p+1]=='o'&&buf[p+2]=='s'&&buf[p+3]=='t'){
      int i=0,j=p+6;
      while(buf[j]!='\r'){
        hostname[i++]=buf[j++];
      }
      hostname[i]='\0';
      break;
    }else{
      while(p<strlen(buf)&&buf[p]!='\n')p++;
      p++;
    }
  }
  if(strlen(hostname)==0)return -1;
  else{
    if(init(addr,hostname,80)<0)return -1;
  }
  return 0;
}
void* deal(void*agr){
  char buf[SIZE];
  int sockfd1=((sockid*)agr)->sockfd_server;
  int sockfd2=((sockid*)agr)->sockfd_sender;
  while(1){
    int l;
    if((l=recv(sockfd1,buf,SIZE,0))<=0){
      cout<<"recv failed or connect down!"<<endl;
      close(sockfd1);
      delete((sockid*)agr);
      pthread_exit(NULL);
    }
    buf[l]='\0';
    if(sockfd2<0){
      sockaddr_in dest_addr;
      if(getaddr(dest_addr,buf)<0){
    cout<<"aim server address error!"<<endl;
    close(sockfd1);
    delete((sockid*)agr);
    pthread_exit(NULL);
      }
      sockfd2=socket(AF_INET,SOCK_STREAM,0);
      if(sockfd2<0){
    cout<<"socket(server) failed"<<endl;
    close(sockfd1);
    delete((sockid*)agr);
    pthread_exit(NULL);
      }
      if(connect(sockfd2,(sockaddr*)&dest_addr,sizeof(dest_addr))<0){
    cout<<"connect(server) failed!"<<endl;
    delete((sockid*)agr);
    pthread_exit(NULL);
      }
      sockid *s=new sockid;
      s->sockfd_server=sockfd2;
      s->sockfd_sender=sockfd1;
      pthread_t tid;
      pthread_create(&tid,NULL,deal,(void*)s);
      pthread_detach(tid);
    }
    int s=0;
    while(s<sizeof(buf)){
      int l=send(sockfd2,buf,strlen(buf),0);
      if(l<=0){
    cout<<"send error!"<<endl;
    delete((sockid*)agr);
    pthread_exit(NULL);
      }
      s+=l;
    }
  }
}
int main(){
  int sockfd;
  sockaddr_in addr;
  char hostname[30]="127.0.0.1";
  int port=65535;
  init(addr,hostname,port);
  if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1){
    cout<<"socket error!"<<endl;
    return -1;
  }
  if(bind(sockfd,(sockaddr*)&addr,sizeof(addr))==-1){
    cout<<"bind failed!"<<endl;
    return -1;
  }
  listen(sockfd,10);
  while(1){
    int newsock=accept(sockfd,NULL,NULL);
    if(newsock==-1){
      cout<<"accept failed!"<<endl;
      return -1;
    }else{
      sockid *agr=new sockid;
      agr->sockfd_server=newsock;
      pthread_t tid;
      pthread_create(&tid,NULL,deal,(void*)agr);
      pthread_detach(tid);
    }
  }
  close(sockfd);
  return 0;
}

功能实现:非常差的代理服务器

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值