收不到SIGURG信号?

在写利用SIGURG信号处理带外数据时,程序老是收不到该信号,找了很长时间BUG,在网上也搜不到相关内容,所以在此记录一下,防止后面的人跟我踩的是一样的坑,当然这种错误可能就我一个人会犯。

我收不到的原因是,SIGURG信号捕捉函数是在accept之后注册的,而客户端发送数据是建立连接后立即开始发送数据的,并且发完数据就直接关闭连接退出了,而服务端检测到对端关闭后也会释放资源退出,这会导致两种情况:

1.当带外数据到达时,SIGURG信号的捕捉函数还没注册上,服务端采用的是默认处理动作,即忽略。
2.带外数据还没到达时,客户端已经往发送缓冲区写完数据,然后关闭连接了,导致服务端检测到对端关闭然后退出了。

上面两种情况都会导致服务端读不到带外数据,所以我们客户端发送数据前应睡眠1秒,等待服务器把准备工作做好。你可能会想为啥不把SIGURG信号捕捉函数的注册放在accept之前呢?若我们将SIGURG信号处理函数放在accpet之前注册,进程可能会在三次握手建立完与accpet返回这个时间间隔内收到带外数据,然后触发SIGURG信号,而我们在SIGURG信号中要用到socketfd,但此时accpet函数没有返回,即没有socketfd,这样就会发生错误

若在实际应用上我们必须将SIGURG信号处理函数的注册放在accept前面怎么办?
可以将connfd初始化为-1,在信号处理函数内判断connfd的值,若为-1,则做个标记,等到accpet函数返回时,通过判断该标记来处理带外数据。若不为-1,则在信号处理函数内正常处理。

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值