面试加分题--socket是否是并发安全的?

本文探讨了TCP和UDP Socket在并发读写时的安全性问题。尽管TCP和UDP的读写操作在内核级别是线程安全的,但由于TCP基于字节流,多线程并发写可能导致数据混乱,而UDP基于数据报,虽然可以并发读写,但出于性能和可靠性考虑,仍建议使用单线程进行读写操作,避免丢包和复杂性增加。
摘要由CSDN通过智能技术生成

今天和大家聊一个有点儿东西的面试题:socket是否是并发安全的?

为了帮助大家理解,我们先假设一个场景。

就拿游戏架构来说,我们想象中的游戏架构是下面这样的。

想象中的游戏架构

也就是用户客户端直接连接游戏核心逻辑服务器,下面简称GameServer。GameServer主要负责实现各种玩法逻辑。

这当然是能跑起来,实现也很简单。

但这样会有个问题,因为游戏这块蛋糕很大,所以总会遇到很多挺刑的事情。

如果让用户直连GameServer,那相当于把GameServer的ip暴露给了所有人。

不赚钱还好,一旦游戏赚钱,就会遇到各种攻击。

你猜《羊了个羊》最火的时候为啥老是崩溃?

假设一个游戏服务器能承载4k玩家,一旦服务器遭受直接攻击,那4k玩家都会被影响。

这攻击的是服务器吗?这明明攻击的是老板的钱包。

所以很多时候不会让用户直连GameServer。

而是在前面加入一层网关层,下面简称gateway。类似这样。

实际的某些游戏架构

GameServer 就躲在了 gateway 背后,用户只能得到 gateway 的IP。

然后将大概每 100 个用户放在一个 gateway 里,这样如果真被攻击,就算 gateway 崩了,受影响的也就那 100 个玩家。

由于大部分游戏都使用 TCP 做开发,所以下面提到的连接,如果没有特别说明,那都是指 TCP 连接

那么问题来了。

假设有100个用户连 gateway,那 gateway 跟 GameServer 之间也会是100个连接吗?

当然不会,gateway 跟 GameServer 之间的连接数会远小于 100

因为这 100 个用户不会一直需要收发消息,总有空闲的时候,完全可以让多个用户复用同一条连接,将数据打包一起发送给 GameServer,这样单个连接的利用率也高了,GameServer 也不再需要同时维持太多连接,可以节省了不少资源,这样就可以多服务几个大怨种金主。

我们知道,要对网络连接写数据,就要执行 send(socket_fd, data)

于是问题就来了。

已知多个用户共用同一条连接

现在多个用户要发数据,也就是多个用户线程需要写同一个socket_fd

那么,socket是并发安全的吗?能让这多个线程同时并发写吗?

并发读写socket

写TCP Socket是线程安全的吗?

对于 TCP,我们一般使用下面的方式创建 socket。

sockfd=socket(AF_INET,SOCK_STREAM, 0))

返回的sockfd是 socket 的句柄 id,用于在整个操作系统中唯一标识你的 socket 是哪个,可以理解为 socket 的身份证id

创建 socket 时,操作系统内核会顺带为 socket 创建一个发送缓冲区和一个接收缓冲区。分别用于在发

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值