15.06 KB, 下载次数: 781
#!/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; |
原帖由 醉卧水云间 于 2008-4-12 14:27 发表
这个代码打算给公司用? 唉, 无语.
代理服务器成熟的代码多了去了(虽然对协议支持都不完整,但稳定可用), 任何公司都不可能去造这中轮子, 毫无意义, 公司只需要做核心业务.
无须看代码, 你的代理肯定不支持s ...
原帖由 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 ...
原帖由 xxldc 于 2008-4-15 17:04 发表
static int long_connect_cb(int udp_fd, struct sockaddr_in *addr, void *data)
{
struct sockaddr_in *seraddr = (struct sockaddr_in *)data;
LOG_MSG(3, 0, "start long connect"
seraddr->sin_addr = addr->sin_addr;//我就不明白,addr赋值给data,函数参数之间赋值,那为什么还要传两个参数进来,addr和data合并成一个参数不行嘛?
if (start_transmit(seraddr, &transmit_addr, long_connect_handler) < 0) {//transmit_addr还是个全局变量,怎么不用个锁保护一下呢?你这个是多线程呢
LOG_MSG(0, 0, "long connect server failed"
return -1;
}
return 0;
}
代码一句注释都没有,真是读死我了.怪不得你们公司不要你
原帖由 net_robber 于 2008-4-16 17:38 发表
其实,我觉得,做一个客户端,似乎比做一个服务器端需要准备的知识要多
比如,Windows下如何截获当前某个特定程序或者进程与某个特定服务器(或端口,反正符合某一特征)的通信内容,进行重新打包等工作,我 ...
原帖由 bierdaci 于 2008-4-16 17:47 发表
没大明白你的问题,你的意思是不是如何在一个进程里截获另一个进程的网络数据?如果这个问题的话,可以在链路层截获,然后分析协议,但这样的话每个系统的链路层都不一样,而且比较麻烦,另外我记得原始套接 ...
欢迎光临 Chinaunix (http://bbs.chinaunix.net/) | Powered by Discuz! X3.2 |