<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML><HEAD>
<META http-equiv=Content-Type content="text/html; charset=big5">
<META content="MSHTML 6.00.2800.1561" name=GENERATOR>
<STYLE></STYLE>
</HEAD>
<BODY bgColor=#ffffff>
<DIV><FONT size=2>
<DIV><FONT size=2>Sorry my english is very poor. Our&nbsp;mother language is 
chinese.</FONT></DIV>
<DIV><FONT 
size=2>===============================================================</FONT></DIV>
<DIV><FONT size=2>I have some problem about epoll. The </FONT><FONT 
size=3>Danga::Socket use epoll ,too. Is it have the</FONT></DIV>
<DIV>same problem?</DIV>
<DIV><FONT size=2></FONT>&nbsp;</DIV>
<DIV>When i use one program to send data. The speed of upload file is 
slow.<BR>But when i use two(&gt;=2) programs to testing the transmission speed 
at<BR>the same time. It is very fast. The&nbsp; transmission speed is almost 
equal<BR>to (* how many programs is running)<BR><BR>I can not find any solution 
to slove the problem.I try to modify the the<BR>value of epoll_wait()'s 
parameter.<BR><BR>my $events_count = epoll_wait( $epoll,15,3600, $events 
);<BR>my $events_count = epoll_wait( $epoll,2,0, $events );<BR>my $events_count 
= epoll_wait( $epoll,2,-1, $events );<BR>my $events_count = epoll_wait( 
$epoll,2,100, $events );<BR><BR>But the problem still exist.<BR>And i find that 
the&nbsp; $events_count always is 1 when i upload file via<BR>another 
programs.<BR>=========================================================<BR>#!/usr/bin/perl<BR>use 
strict;<BR>use IO::Socket;<BR>use Sys::Syscall ':epoll';<BR>use Errno 
'EWOULDBLOCK';<BR>my ( $haveEpoll, $epoll );<BR>if ( 
Sys::Syscall::epoll_defined() )<BR>{<BR>&nbsp;$epoll = eval { epoll_create(1); 
};<BR>&nbsp;$haveEpoll = defined $epoll &amp;&amp; $epoll &gt;= 0;<BR>}<BR>if ( 
!$haveEpoll )<BR>{<BR>&nbsp;require IO::Poll;<BR>}<BR><BR>my $listen = 
IO::Socket::INET-&gt;new(Proto =&gt; 
'tcp',<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LocalPort =&gt; 
21,<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Listen =&gt;&nbsp; SOMAXCONN 
,<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Reuse =&gt; 1) or die 
$!;<BR><BR>PollIn_Event_Add( $epoll, fileno($listen) );<BR><BR>my 
%accepthash;<BR>my $events;<BR>while (1)<BR>{<BR>&nbsp;$events = [];<BR>&nbsp;my 
$events_count = epoll_wait( $epoll,15,3600, $events );<BR><BR>&nbsp;for ( my $i 
= 0 ; $i &lt; $events_count ; $i++ )<BR>&nbsp;{<BR>&nbsp; my $ev = 
$events-&gt;[$i];<BR>&nbsp; $ev ||= 
[];<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (! defined 
$accepthash{$ev-&gt;[0] } &amp;&amp; $ev-&gt;[0] eq<BR>fileno($listen) 
){<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; my 
$connect=$listen-&gt;accept();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
PollIn_Event_Add( $epoll, fileno($connect) 
);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
$accepthash{fileno($connect)}=$connect;<BR>&nbsp;&nbsp; 
open(handle,"&gt;/usr/local/Portal/cache/" . fileno($connect) );<BR>&nbsp; 
close(handle);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
}else{<BR><BR>&nbsp; if ( $ev-&gt;[1] == EPOLLIN )<BR>&nbsp; {<BR>&nbsp;&nbsp; 
my $buffer='';<BR>&nbsp;&nbsp; my $rc = sysread($accepthash{$ev-&gt;[0]}, 
$buffer, 16384,0 );<BR>&nbsp;&nbsp; if ( defined $rc )<BR>&nbsp;&nbsp; 
{<BR>&nbsp;&nbsp;&nbsp; if ( $rc &gt; 0 )<BR>&nbsp;&nbsp;&nbsp; 
{<BR>&nbsp;&nbsp;&nbsp;&nbsp; #print $rc . "\n";<BR>&nbsp;&nbsp;&nbsp;&nbsp; 
open(handle,"&gt;&gt;/usr/local/Portal/cache/" . 
$ev-&gt;[0]);<BR>&nbsp;&nbsp;&nbsp;&nbsp; print handle 
$buffer;<BR>&nbsp;&nbsp;&nbsp;&nbsp; close(handle);<BR>&nbsp;&nbsp;&nbsp;&nbsp; 
substr( $buffer, 0, $rc ) = '';<BR>&nbsp;&nbsp;&nbsp; } 
else<BR>&nbsp;&nbsp;&nbsp; 
{<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
eval { shutdown( $accepthash{$ev-&gt;[0]}, 2 ); 
};<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
delete $accepthash{$ev-&gt;[0]};<BR>&nbsp;&nbsp;&nbsp; }<BR><BR><BR>&nbsp;&nbsp; 
} elsif ( $! == EWOULDBLOCK )<BR>&nbsp;&nbsp; {<BR><BR>&nbsp;&nbsp; } 
else<BR>&nbsp;&nbsp; 
{<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
eval { shutdown( $accepthash{$ev-&gt;[0]}, 2 ); 
};<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
delete $accepthash{$ev-&gt;[0]};<BR>&nbsp;&nbsp;&nbsp; PollIn_Event_Del( $epoll, 
$ev-&gt;[0] );<BR>&nbsp;&nbsp; }<BR><BR>&nbsp; }elsif($ev-&gt;[1] == 
EPOLLERR){<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
eval { shutdown( $accepthash{$ev-&gt;[0]}, 2 ); 
};<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
delete $accepthash{$ev-&gt;[0]};<BR>&nbsp;&nbsp;&nbsp; PollIn_Event_Del( $epoll, 
$ev-&gt;[0] );<BR>&nbsp; }<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
}<BR>&nbsp;}<BR>}<BR><BR>sub PollIn_Event_Add<BR>{<BR>&nbsp;my ( $epoll, $fd ) = 
@_;<BR>&nbsp;my $ctl_rtn;<BR>&nbsp;$ctl_rtn = epoll_ctl( $epoll, EPOLL_CTL_ADD, 
$fd, EPOLLIN | EPOLLERR );<BR>&nbsp;print 'PollIn_Event_Add:' . $ctl_rtn . 
"\n";<BR>}<BR><BR>sub PollIn_Event_Del<BR>{<BR>&nbsp;my ( $epoll, $fd ) = 
@_;<BR>&nbsp;my $ctl_rtn;<BR>&nbsp;$ctl_rtn = epoll_ctl( $epoll, EPOLL_CTL_DEL, 
$fd,0 );<BR>&nbsp;print 'PollIn_Event_Del:' . $ctl_rtn . 
"\n";<BR>}<BR></DIV></FONT></DIV></BODY></HTML>