编写一个TCP并发服务器端程序,可以把客户端发来的消息回射给客户端

编写一个TCP并发服务器端程序,可以把客户端发来的消息回射给客户端,第1张

简单的写了一下,没有加注释,应该很好理解,满意的话请采纳

#include <stdio.h>

#include <sys/socket.h>

#include <pthread.h>

void *thread(void *st)

int main(int argc, char *argv[])

{

pthread_t tid

int ret, fd

struct sockaddr_in info

fd = socket(AF_INET, SOCK_STREAM, 0)

if(fd <梁庆 0)

goto socket_error

{

int var = 1

setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &var, sizeof(var))

}

info.sin_family = AF_INET

info.sin_port = htons(80)

info.sin_addr.s_addr = 0

ret = bind(fd, (void *)&info, sizeof(info))

if(ret)

goto bind_error

ret = listen(fd, 10)

if(ret)

goto listen_error

while(1)

{

clientfd = accept(fd, NULL, NULL)

pthread_create(&tid, NULL, thread, (void *)clientfd)

}

return 0

socket_error:

printf("socket error!\晌渣败n")

return -1

bind_error:

printf("宴颤bind error!\n")

return -2

lister_error:

printf("lister error!\n")

return -2

}

void *thread(void *st)

{

int ret, rd

char buf[BUFSIZE]

int clientfd = (int)st

rd = read(clientfd, buf, sizeof(buf))

if(rd <0)

{

printf("read error!\n")

return

}

write(clientfd, "shou dao!", 9)

close(clientfd)

}

一开始我无法理解,单机怎么可能实现百万并发连接,因为系统可用端口数只有:65535 - 1024 = 64511,每个TCP连接需要占用一个独立的端口,那最多也只能做到6W多并发连接。然而我忽视了一个很基本的问题,端口号在同一个IP下不能重复,但我们可以给一个网卡绑定多个IP地址,如果单机要主动发起100万并发连接,我们最少需要使用17个IP地址。知孙

TCP服务器监听在指定端口接收客户端连接后,创建一个新的socket用于同客户端进行读写数据,但该socket并不需要也不会绑定一个新的端口,所以对于TCP服务器来说,不存在端口不够用的情况,TCP服务器能够保持多少个并发连接取决于服务器性能、内存大小、带宽大小以及服务器端设搭拿链置(例如:进程能打开的文件数等)。以100W连接数为例,所需要总内存大小大约为:1,000,000 20K = 20G, 广播一个1KB的消息需要占用敏冲的带宽:1,000,000 1K = 1000M,所需打开文件描述符1,000,000个。

对于TCP服务器连接数压力测试来说,瓶颈在客户端,因为每个客户端要连接到TCP服务端需要使用一个本地端口,而对于一个IP地址来说,端口范围就是:0-65536,其中还要一些端口被系统或其他程序使用。所以从一台主机单个IP上发起同TCP服务器的连接数理论最大值为65535,当然我们可以给该主机绑定N个IP地址,同时从多个IP发起连接,所以理论上客户端可以发起的连接数为:IP数*65535,这时客户端的CPU、内存和带宽以及文件句柄资源就是限制。

Server代码调整

要关闭输出,否则打印屏幕会拖垮Server.

修改server的max_conn参数为100000或者更大,为了安全实际上只能到99999。

内核参数调整

ulimit -n 要调整为100000甚至更大。如何调这个参数,可以参考网上的一些文章。命令行下执行 ulimit -n 100000即可修改。如果不能修改,需要设置 /etc/security/limits.conf,加入

* hard nofile 100000

* soft nofile 100000

net/ipv4/ip_local_port_range 需要修改为更大的范围,如20000 – 60000,否则端口号会不够用。导致客户端报 99错误

单台是昌绝悉不能压到10万的。客户端连接耐乎需要分配一个local port。范围是上一条设置的。也就是只有4万个port可以用。可以使用多台机器来测试。

net.ipv4.tcp_tw_recycle = 1 ,设置快速回收被close的端口。否则端口会不够用

其他内核参数的调整,如tcp_fin_timeout、tcp_keepalive_time、tcp_max_syn_backlog可以搜索网上的文章。

长期运行的Server要有坏连接检测的能力,比宏铅如心跳、活动时间检测等方案。避免客户端没有发REST,导致坏连接堆积


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/12352159.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-22
下一篇2023-05-22

发表评论

登录后才能评论

评论列表(0条)

    保存