很久以前写着玩的,无任何参考意义,仅仅熟悉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;
}
功能实现:非常差的代理服务器