免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: bierdaci
打印 上一主题 下一主题

共享一下我的代理服务器源码 [复制链接]

论坛徽章:
0
11 [报告]
发表于 2008-04-12 14:29 |只看该作者
楼上太毒了

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
12 [报告]
发表于 2008-04-12 14:33 |只看该作者
端口转发服务器是很简单的东西,看这个,就几十行代码:
http://poe.perl.org/?POE_Cookboo ... ion_With_Components
#!/usr/bin/perl


use warnings;
use strict;
use POE qw(Component::Server::TCP Component::Client::TCP);

# Spawn the forwarder server on port 1110.  When new connections

# arrive, spawn clients to connect them to their destination.


POE::Component::Server::TCP->new(
    Port => 1110,

    ClientConnected => sub {
        my ( $heap, $session ) = @_[ HEAP, SESSION ];
        logevent( 'server got connection', $session );
        spawn_client_side();
    },

    ClientInput => sub {
        my ( $kernel, $session, $heap, $input ) = @_[ KERNEL, SESSION, HEAP, ARG0 ];
        logevent( 'server got input', $session, $input );
        $kernel->post( $heap->{client_id} => send_stuff => $input );
    },

    ClientDisconnected => sub {
        my ( $kernel, $session, $heap ) = @_[ KERNEL, SESSION, HEAP ];
        logevent( 'server got disconnect', $session );
        $kernel->post( $heap->{client_id} => "shutdown" );
    },

    InlineStates => {
        send_stuff => sub {
            my ( $heap, $stuff ) = @_[ HEAP, ARG0 ];
            logevent( "sending to server", $_[SESSION] );
            $heap->{client}->put($stuff);
        },
        _child => sub {
            my ( $heap, $child_op, $child ) = @_[ HEAP, ARG0, ARG1 ];
            if ( $child_op eq "create" ) {
                $heap->{client_id} = $child->ID;
            }
        },
    },
);

sub spawn_client_side {
    POE::Component::Client::TCP->new(
        RemoteAddress => 'localhost',
        RemotePort    => 6667,

        Started => sub {
            $_[HEAP]->{server_id} = $_[SENDER]->ID;
        },

        Connected => sub {
            my ( $heap, $session ) = @_[ HEAP, SESSION ];
            logevent( 'client connected', $session );
        },

        ServerInput => sub {
            my ( $kernel, $heap, $session, $input ) = @_[ KERNEL, HEAP, SESSION, ARG0 ];
            logevent( 'client got input', $session, $input );
            $kernel->post( $heap->{server_id} => send_stuff => $input );
        },

        Disconnected => sub {
            my ( $kernel, $heap, $session ) = @_[ KERNEL, HEAP, SESSION ];
            logevent( 'client disconnected', $session );
            $kernel->post( $heap->{server_id} => 'shutdown' );
        },

        InlineStates => {
            send_stuff => sub {
                my ( $heap, $stuff ) = @_[ HEAP, ARG0 ];
                logevent( "sending to client", $_[SESSION] );
                $heap->{server}->put($stuff);
            },
        },
    );
}

sub logevent {
    my ( $state, $session, $arg ) = @_;
    my $id = $session->ID();

    print "session $id $state ";
    print ": $arg" if ( defined $arg );
    print "\n";
}

warn 'running';
$poe_kernel->run();
exit 0;

论坛徽章:
0
13 [报告]
发表于 2008-04-12 14:43 |只看该作者
原帖由 醉卧水云间 于 2008-4-12 14:27 发表
这个代码打算给公司用?  唉, 无语.
代理服务器成熟的代码多了去了(虽然对协议支持都不完整,但稳定可用), 任何公司都不可能去造这中轮子, 毫无意义, 公司只需要做核心业务.

无须看代码, 你的代理肯定不支持s ...


哈哈,发这儿只是给大家玩玩,喜欢玩就玩玩,何必这么认真呢^_^

[ 本帖最后由 bierdaci 于 2008-4-12 15:44 编辑 ]

论坛徽章:
0
14 [报告]
发表于 2008-04-12 14:47 |只看该作者
原帖由 flw 于 2008-4-12 14:33 发表
端口转发服务器是很简单的东西,看这个,就几十行代码:
http://poe.perl.org/?POE_Cookboo ... ion_With_Components
#!/usr/bin/perl


use warnings;
use strict;
use POE qw(Component ...


老大您厉害啊,哈哈

论坛徽章:
0
15 [报告]
发表于 2008-04-12 15:17 |只看该作者
原帖由 范进 于 2008-4-12 14:29 发表
楼上太毒了

其实也没啥,牛人有牛脾气说牛话很正常:)

论坛徽章:
0
16 [报告]
发表于 2008-04-12 17:25 |只看该作者
顶一下.

LZ的精神可嘉. 自己写代码去尝试是好的.
各楼的点评各有特点,借鉴一下可以去升级自己的代码.

"长江不择细流,泰山不辞杯土". 对LZ和各位大侠都适用.

论坛徽章:
0
17 [报告]
发表于 2008-04-12 23:15 |只看该作者
用RAW转发的效率会更高一些.

论坛徽章:
0
18 [报告]
发表于 2008-04-13 15:17 |只看该作者
楼主心理能力强,能够接受牛人的一些比较深刻的说话:)

论坛徽章:
0
19 [报告]
发表于 2008-04-13 19:20 |只看该作者
顶lz

论坛徽章:
0
20 [报告]
发表于 2008-04-15 17:04 |只看该作者


  1. static int long_connect_cb(int udp_fd, struct sockaddr_in *addr, void *data)
  2. {
  3.         struct sockaddr_in *seraddr = (struct sockaddr_in *)data;

  4.         LOG_MSG(3, 0, "start long connect");
  5.         seraddr->sin_addr = addr->sin_addr;//我就不明白,addr赋值给data,函数参数之间赋值,那为什么还要传两个参数进来,addr和data合并成一个参数不行嘛?
  6.         if (start_transmit(seraddr, &transmit_addr, long_connect_handler) < 0) {//transmit_addr还是个全局变量,怎么不用个锁保护一下呢?你这个是多线程呢
  7.                 LOG_MSG(0, 0, "long connect server failed");
  8.                 return -1;
  9.         }

  10.         return 0;
  11. }

复制代码


代码一句注释都没有,真是读死我了.怪不得你们公司不要你.
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP