一.
修改最大打开文件数
1.修改系统总共最大打开文件数
在 /etc/sysctl.conf 文件末尾添加:
fs.file-max = 1020000 或者永久修改,*表示所有用户,可以改成某个用户名
编辑 /etc/security/limits.conf 文件, 加入如下行:
# /etc/security/limits.conf * hard nofile 1020000 * soft nofile 1020000
2.修改当前用户单个进程可以打开的最大文件数
sudo sh -c "ulimit -n 1020000 && exec su $LOGNAME"
二。测试代码
但是服务器端没有用多个ip来测试,而是用多个端口来测试,默认从8000端口开始,开30个端口,因为单个客户端可用端口为65535减去3万多
服务器端程序依赖libev框架,需要提前编译,然后存放到相应位置。下面t有具体服务器端代码
编译
gcc server.c -o server ../include/libev.a -lm
运行
./server -p 8000
在源码中默认指定了8000端口,可以通过-p进行指定新的端口。 开启了8000端口进行监听请求,http协议处理类似于htmlfile chunked块编码传输。
server.c
#include <arpa/inet.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <fcntl.h>
#include <errno.h>
#include <err.h>
#include <unistd.h>
#include "libev-4.20/include/ev.h"
#define HTMLFILE_RESPONSE_HEADER \
"HTTP/1.1 200 OK\r\n" \
"Connection: keep-alive\r\n" \
"Content-Type: text/html; charset=utf-8\r\n" \
"Transfer-Encoding: chunked\r\n" \
"\r\n"
#define HTMLFILE_RESPONSE_FIRST \
"<html><head><title>htmlfile chunked example</title><script>var _ = function (msg) { document.getElementById('div').innerHTML = msg; };</script></head><body><div id=\"div\"></div> "
#define PORT_NUM 30
static int server_port = 8000;
struct ev_loop *loop;
typedef struct {
int fd;
ev_io ev_read;
} client_t;
ev_io ev_accept[PORT_NUM];
static int usr_num;
static void incr_usr_num() {
usr_nu