mirror of
https://github.com/yanfeizhang/coder-kung-fu.git
synced 2026-05-05 18:50:55 +08:00
feat: 添加百万连接测试代码
This commit is contained in:
75
tests/network/test01/client.php
Normal file
75
tests/network/test01/client.php
Normal file
@@ -0,0 +1,75 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* Socket客户端
|
||||
*/
|
||||
|
||||
if(!isset($argv[1]) || !isset($argv[2]) || !isset($argv[3])){
|
||||
echo "usage: php client.php {localIp} {serverIp} {serverPort} \n";
|
||||
exit;
|
||||
}
|
||||
|
||||
$localIp = $argv[1];
|
||||
$serverIp = $argv[2];
|
||||
$serverPort = $argv[3];
|
||||
|
||||
$sockets = array();
|
||||
|
||||
function buildConnect($lIp,$sIp,$sPort,$num){
|
||||
global $sockets;
|
||||
|
||||
for($i = 0; $i < $num; $i++){
|
||||
//稍稍停顿一下,避免把服务端的握手队列打满
|
||||
if(0 == $i % 1000){
|
||||
sleep(1); echo $lIp."\t".$i."\n";
|
||||
}
|
||||
|
||||
$socket = socket_create(AF_INET,SOCK_STREAM,SOL_TCP);
|
||||
if($socket == false) {
|
||||
echo "$lIp $sPort socket_create() 失败,".socket_strerror(socket_last_error($socket))."\n";
|
||||
sleep(5);
|
||||
continue;
|
||||
}
|
||||
|
||||
if(false == socket_bind($socket, $lIp)){
|
||||
echo "$lIp $sPort socket_bind() 失败,".socket_strerror(socket_last_error($socket))."\n";
|
||||
sleep(5);
|
||||
continue;
|
||||
}
|
||||
|
||||
if(false == socket_connect($socket, $sIp, $sPort)){
|
||||
echo "$lIp $sPort socket_connect() 失败,".socket_strerror(socket_last_error($socket))."\n";
|
||||
sleep(5);
|
||||
continue;
|
||||
}
|
||||
|
||||
//将 socket 保存起来,避免连接被内核释放
|
||||
$sockets[] = $socket;
|
||||
|
||||
//发送数据
|
||||
//$wmsg = "I am client\n";
|
||||
//socket_write($con, $wmsg, strlen($wmsg));
|
||||
|
||||
//接收数据
|
||||
//$rmsg = socket_read($socket, 2048);
|
||||
//echo = "收到的信息:".$rmsg."\n"; }
|
||||
}
|
||||
}
|
||||
|
||||
function closeAll(){
|
||||
global $sockets;
|
||||
foreach($sockets as $socket){
|
||||
socket_close($socket);
|
||||
}
|
||||
}
|
||||
|
||||
//开始测试
|
||||
buildConnect($localIp, $serverIp, $serverPort, 50000);
|
||||
|
||||
//连接完了 sleep 一会儿
|
||||
//这样有时间在 linux 上用 netstat、ss、slabtop 等命令进行观察
|
||||
sleep(600);
|
||||
|
||||
//关闭所有连接
|
||||
echo "close all connection now...";
|
||||
closeAll();
|
||||
82
tests/network/test01/clientd.php
Normal file
82
tests/network/test01/clientd.php
Normal file
@@ -0,0 +1,82 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* Socket服务端
|
||||
*/
|
||||
|
||||
//-------------- start -------------
|
||||
//这一部分需要根据你自己的实验环境来修改
|
||||
//1.需要你从自己的网络环境中选出 20 个可用的 ip,
|
||||
$ips = array(
|
||||
"客户端 IP1",
|
||||
"客户端 IP2",
|
||||
"客户端 IP3",
|
||||
"......",
|
||||
"服务端 IP20",
|
||||
);
|
||||
|
||||
//2.需要设置你的子网掩码
|
||||
$netmask = "子网掩码";
|
||||
|
||||
//3.指定要连接的server ip 和端口
|
||||
$serverIp = "服务端 IP";
|
||||
$serverPort = "服务端端口";
|
||||
//--------------- end --------------
|
||||
|
||||
if(!isset($argv[1])){
|
||||
echo "usage: php clientd.php ifup/ifdown/stop/start\n";
|
||||
exit;
|
||||
}
|
||||
|
||||
function pingAddress($address) {
|
||||
$outcome = "";
|
||||
$status = -1;
|
||||
$pingresult = exec("ping -c 1 -W 1 {$address}", $outcome, $status);
|
||||
|
||||
if (0 == $status) {
|
||||
return "true";
|
||||
} else {
|
||||
return "false";
|
||||
}
|
||||
}
|
||||
|
||||
switch($argv[1]){
|
||||
case "ping":
|
||||
foreach($ips as $k=>$ip){
|
||||
echo $ip.":".pingAddress($ip)."\n";
|
||||
}
|
||||
break;
|
||||
|
||||
case "ifup":
|
||||
foreach($ips as $k=>$ip){
|
||||
shell_exec("ifconfig eth0:$k $ip netmask ".$netmask." up");
|
||||
}
|
||||
break;
|
||||
|
||||
case "ifdown":
|
||||
foreach($ips as $k=>$ip){
|
||||
shell_exec("ifconfig eth0:$k down");
|
||||
}
|
||||
break;
|
||||
|
||||
case "start":
|
||||
$cmd = "ps -ef | grep client.php | awk '{print $2}' | xargs kill -9";
|
||||
shell_exec($cmd);
|
||||
shell_exec("echo '' > clientd.log");
|
||||
|
||||
foreach($ips as $ip){
|
||||
$cmd = "php client.php $ip $serverIp $serverPort >> clientd.log &";
|
||||
echo $cmd."\n";
|
||||
shell_exec($cmd);
|
||||
}
|
||||
break;
|
||||
|
||||
case "stop":
|
||||
$cmd = "ps -ef | grep client.php | awk '{print $2}' | xargs kill -9";
|
||||
shell_exec($cmd);
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
53
tests/network/test01/server.php
Normal file
53
tests/network/test01/server.php
Normal file
@@ -0,0 +1,53 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* Socket服务端
|
||||
*/
|
||||
|
||||
set_time_limit(0);
|
||||
|
||||
if(!isset($argv[1]) || !isset($argv[2])){
|
||||
echo "usage: php server.php {ip} {port}\n";
|
||||
exit;
|
||||
}
|
||||
|
||||
$ip = $argv[1];
|
||||
$port = $argv[2];
|
||||
|
||||
if(($sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP)) < 0) {
|
||||
echo "socket_create() 失败的原因是:" . socket_strerror($sock) . "\n";
|
||||
exit();
|
||||
}
|
||||
|
||||
if(($ret = socket_bind($sock, $ip, $port)) < 0) {
|
||||
echo "socket_bind() 失败的原因是:" . socket_strerror($ret) . "\n";
|
||||
exit();
|
||||
}
|
||||
|
||||
if(($ret = socket_listen($sock,1024)) < 0) {
|
||||
echo "socket_listen() 失败的原因是:" . socket_strerror($ret) . "\n";
|
||||
exit();
|
||||
}
|
||||
echo "$ip $port listen ok!\n";
|
||||
|
||||
$sockets = array();
|
||||
$count = 0;
|
||||
do{
|
||||
//接收一个Socket连接
|
||||
$con = socket_accept($sock);
|
||||
if (false == $con) {
|
||||
echo "$ip $port socket_accept() failed: reason:".socket_strerror(socket_last_error($socket))."\n";
|
||||
continue;
|
||||
} else {
|
||||
echo "$ip $port accept success: ".$count++."\n";
|
||||
|
||||
//发送数据
|
||||
//$wmsg = "I am server\n";
|
||||
//socket_write($con, $wmsg, strlen($wmsg));
|
||||
|
||||
//接收数据
|
||||
//$rmsg = socket_read($msgsock[$count], 2048);
|
||||
//echo = "收到的信息:".$rmsg."\n";
|
||||
}
|
||||
$sockets[$count] = $con;
|
||||
}while(true);
|
||||
Reference in New Issue
Block a user