C語言寫的proxy服務器

#include <stdio.h>  //std library
#include <string.h>

#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>

#include <netinet/in.h> /*struct sockaddr_in*/
#include <netinet/ip.h> 

#include <unistd.h>  /*read write*/

#include <arpa/inet.h>  /**/

#include <pthread.h> /**/

//多線程處理髮送和接收
void readandwrite(void *fds){
    int *fd = (int*)fds;
    char buff[1024];
    int len=0;
    while(1){
        printf("%d -> %d\n",fd[0],fd[1]);
        len = read(fd[0],buff,1024);
        write(fd[1],buff,len);
    }
    return fds;
}

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

    int fd_t1[2]; //socket fd cli and ser read list, call readandwrite function
    int fd_t2[2]; //socket fd cli and ser read list, call readandwrite function


    struct sockaddr_in cliaddr,seraddr,ser_cliaddr,cli_seraddr;   //socket struct save connect information, call memset set zero
    memset(&cliaddr,0,sizeof(cliaddr));
    memset(&seraddr,0,sizeof(seraddr));   
    memset(&ser_cliaddr,0,sizeof(ser_cliaddr));

    cliaddr.sin_addr.s_addr = inet_addr("127.0.0.1");
    cliaddr.sin_family = AF_INET;
    cliaddr.sin_port = htons(22);

    seraddr.sin_addr.s_addr = htonl(inet_addr("0.0.0.0"));
    seraddr.sin_family = AF_INET;
    seraddr.sin_port = htons(1080);

    pthread_t t1,t2;


    socklen_t ser_len = sizeof(ser_cliaddr);   //accpet 
    socklen_t cli_len = sizeof(cliaddr);   //connect


    int cli = socket(AF_INET,SOCK_STREAM,0);
    int ser = socket(AF_INET,SOCK_STREAM,0);
    if(!(cli && ser)){
        perror("create socket error");
        return -1;
    }

    if(bind(ser,(struct sockaddr*)&seraddr,sizeof(seraddr)))
    {perror("ser bind error"); return -1;}

    /*if(bind(cli,(struct sockaddr*)&cliaddr,sizeof(cliaddr)))
    {perror("cli bind error");return -1;}
    */
    if(listen(ser,65536))
    {perror("lisent error"); return -1;}

    while(1){
        int ser_clifd = accept(ser,(struct sockaddr*)&ser_cliaddr,&ser_len);
        if(ser_clifd <= 0){
            perror("accept error");
            return -1;
        }
        else{
        fd_t1[0] = ser_clifd;
        fd_t2[1] = ser_clifd;

        int stat = connect(cli,(struct sockaddr*)&cliaddr,cli_len);
        if(stat == -1){
            perror("connect error");
            return 0;
        }else{
        fd_t1[1] = cli;
        fd_t2[0] = cli;
        

        //發送和接受進程
        pthread_create(&t1,0,readandwrite,(void*)fd_t1);
        pthread_create(&t2,0,readandwrite,(void*)fd_t2);

        
        pthread_join(&t1,NULL);
        pthread_join(&t2,NULL);
        }
        
        }
    }

}
 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章