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:
22
tests/network/test08/Makefile
Normal file
22
tests/network/test08/Makefile
Normal file
@@ -0,0 +1,22 @@
|
||||
SERVER_BINARY_NAME := "test-server"
|
||||
CLIENT_BINARY_NAME := "test-client"
|
||||
|
||||
.PHONY: build-server
|
||||
build-server:
|
||||
gcc server.c -o $(SERVER_BINARY_NAME)
|
||||
|
||||
.PHONY: run-server
|
||||
run-server:
|
||||
sh tool.sh runsrv ./$(SERVER_BINARY_NAME)
|
||||
|
||||
.PHONY: stop-server
|
||||
stop-server:
|
||||
sh tool.sh stopsrv ./$(SERVER_BINARY_NAME)
|
||||
|
||||
.PHONY: build-client
|
||||
build-client:
|
||||
gcc client.c -o $(CLIENT_BINARY_NAME)
|
||||
|
||||
.PHONY: run-client
|
||||
run-client:
|
||||
./$(CLIENT_BINARY_NAME) 0.0.0.0 6000
|
||||
73
tests/network/test08/client.c
Normal file
73
tests/network/test08/client.c
Normal file
@@ -0,0 +1,73 @@
|
||||
#include <netinet/in.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
#include <arpa/inet.h>
|
||||
|
||||
#define MAX_CONNECTION_NUM 100
|
||||
|
||||
int buildConnect(const char *sIp, int sPort)
|
||||
{
|
||||
int skFd;
|
||||
if((skFd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
|
||||
{
|
||||
printf("\n Error : Could not create socket\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
struct sockaddr_in srvAddr;
|
||||
srvAddr.sin_family = AF_INET;
|
||||
srvAddr.sin_addr.s_addr = inet_addr(sIp);
|
||||
srvAddr.sin_port = htons(sPort);
|
||||
if(connect(skFd, (struct sockaddr *)&srvAddr, sizeof(srvAddr)) < 0)
|
||||
{
|
||||
printf("\n Error : Connect Failed \n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
return skFd;
|
||||
}
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
int i = 0, sPort, fd;
|
||||
char sIp[16];
|
||||
|
||||
if(argc != 3)
|
||||
{
|
||||
printf("\n Usage: %s <server ip> <server port>\n", argv[0]);
|
||||
return 1;
|
||||
}
|
||||
|
||||
//1. 从命令行获取并解析local ip、server ip以及端口
|
||||
strcpy(sIp, argv[1]);
|
||||
sPort = atoi(argv[2]);
|
||||
|
||||
//2. 开始建立连接
|
||||
int *sockets = (int *)malloc(sizeof(int) * MAX_CONNECTION_NUM);
|
||||
for(i = 1; i <= MAX_CONNECTION_NUM; i++)
|
||||
{
|
||||
|
||||
fd = buildConnect(sIp, sPort);
|
||||
if(fd > 0)
|
||||
{
|
||||
sockets[i-1] = fd;
|
||||
printf("连接 %s:%d成功了 %d 条!\n", sIp, sPort, i);
|
||||
}
|
||||
else
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
sleep(300);
|
||||
|
||||
//3. 释放所有的连接
|
||||
printf("关闭所有的连接...\n");
|
||||
for(i = 0; i < MAX_CONNECTION_NUM; i++)
|
||||
{
|
||||
close(sockets[i]);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
77
tests/network/test08/server.c
Normal file
77
tests/network/test08/server.c
Normal file
@@ -0,0 +1,77 @@
|
||||
#include <arpa/inet.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
#define MAX_CONNECTION_NUM 1100000
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
char ip[16];
|
||||
int lisFd, conFd, port;
|
||||
struct sockaddr_in servAddr;
|
||||
pid_t pid;
|
||||
|
||||
|
||||
if(argc != 3)
|
||||
{
|
||||
printf("\n Usage: %s <server ip> <server port>\n", argv[0]);
|
||||
return 1;
|
||||
}
|
||||
|
||||
pid = getpid();
|
||||
|
||||
//1. 从命令行获取并解析server ip以及端口
|
||||
strcpy(ip, argv[1]);
|
||||
port = atoi(argv[2]);
|
||||
|
||||
//2. 启动服务
|
||||
//2.1 创建server socket
|
||||
if((lisFd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
|
||||
{
|
||||
printf("Server %d Error : Could not create socket!\n", pid);
|
||||
return 0;
|
||||
}
|
||||
|
||||
//2.2 设置端口重用
|
||||
int val =1;
|
||||
if (setsockopt(lisFd, SOL_SOCKET, SO_REUSEPORT, &val, sizeof(val))<0)
|
||||
{
|
||||
printf("\n Server %d Error : setsockopt failed!\n", pid);
|
||||
return 0;
|
||||
}
|
||||
|
||||
//2.3 bind绑定
|
||||
servAddr.sin_family = AF_INET;
|
||||
servAddr.sin_addr.s_addr = inet_addr(ip);
|
||||
servAddr.sin_port = htons(port);
|
||||
if(bind(lisFd, (struct sockaddr*)&servAddr, sizeof(servAddr)) < 0)
|
||||
{
|
||||
printf("\n Server %d Error : Bind Failed! \n", pid);
|
||||
return 0;
|
||||
}
|
||||
|
||||
//2.4 启动监听
|
||||
if((listen(lisFd, 1024)) < 0)
|
||||
{
|
||||
printf("\n Server %d Error : Listen Failed \n", pid);
|
||||
return 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
printf("\n Start server on %s:%d successed, pid is %d\n", ip, port, pid);
|
||||
}
|
||||
|
||||
//3. 接收连接
|
||||
int i = 0;
|
||||
int *sockets = (int *)malloc(sizeof(int) * MAX_CONNECTION_NUM);
|
||||
while(1)
|
||||
{
|
||||
conFd = accept(lisFd, (struct sockaddr*)NULL, NULL);
|
||||
if(conFd > 0)
|
||||
{
|
||||
sockets[i++] = conFd;
|
||||
printf("Server %s %d (%d) accept success:%d\n", ip, port, pid, i);
|
||||
}
|
||||
}
|
||||
}
|
||||
20
tests/network/test08/tool.sh
Normal file
20
tests/network/test08/tool.sh
Normal file
@@ -0,0 +1,20 @@
|
||||
#!/bin/bash
|
||||
|
||||
exec_runsrv(){
|
||||
for((i=1;i<=5;i++)); do
|
||||
echo $SERVER 0.0.0.0 6000 &
|
||||
$SERVER 0.0.0.0 6000 &
|
||||
done
|
||||
|
||||
}
|
||||
|
||||
exec_stopsrv(){
|
||||
ps -ef | grep $SERVER | awk '{print $2}' | xargs kill -9 > /dev/null
|
||||
}
|
||||
|
||||
TYPE=$1
|
||||
case $TYPE in
|
||||
"runsrv") SERVER=$2; exec_runsrv;;
|
||||
"stopsrv") SERVER=$2; exec_stopsrv;;
|
||||
*) echo "get unkown type $TYPE"; exit ;;
|
||||
esac
|
||||
Reference in New Issue
Block a user