Linux——TCP通信实例
本文最后更新于:2021年4月14日 晚上
概览:LinuxTCP通信实例
LinuxTCP通信简单版
实例:客户端获取用户的输入发送给服务端,服务端接收消息后,回送一条信息给客户端,并将两条消息保存至文件!
服务器端
1 |
|
客户端
1 |
|
运行效果——客户端
1 |
|
问题:
- 两端读取数据的那里有问题,网络情况错综复杂,不一定一次读取就能接收到全部的消息!
- 当在客户端快速的输入消息回车后再快速输入消息时,客户端和服务器都会卡顿住!
多进程实现并发服务器
即支持多个客户端对其进行通信
客户端实现
1 |
|
服务器实现
1 |
|
- 问题所在!:没有对子进程进行回收,会不断的消耗资源!
- 如何对子进程进行回收?
- wait:wait是阻塞函数!会阻塞等待,影响主进程的运行!
- waitpid 阻塞版本也不行
waitpid NOHANG
,非阻塞版本倒是可以,不推荐采用- 使用信号回收!子进程结束后会通过内核发送一个
SIGCHLD
信号,通过信号捕捉达到回收的目的!
服务器改进
1 |
|
- 回收了子进程,但是还有新的问题!
- 信号捕捉是一种软中断,当发生软中断之后,accept会发生一个
EINTR
的错误,从而不会再继续执行! - 解决办法:对于这种错误,忽略其执行
1 |
|
EINTR错误
当程序在执行处于阻塞状态的系统调用时接收到信号,并且我们为该信号设置了信号处理函数,在信号处理函数返回后,程序将面临继续执行或不执行慢速系统调用两种选择,默认情况下是系统调用将被中断,并且errno被设置为EINTR。我们可以选择继续执行,有以下两种方法:
1.在设置信号处理函数的时候,为信号设置SA_RESTART标志以自动重启被该信号中断的系统调用,但是该方法对某些慢速系统调用无效,比如epoll_wait,poll,seletc等慢速系统调用,即使给信号设置了该选项,也会被中断。具体对那些慢速系统调用无效可查看manpages。
2.手动重启,对慢速系统调用的返回值进行判断,若errno==EINTR,则重新调用慢速系统调用
综上所述,若想要重启系统调用,最好使用方法2。
————————————————
版权声明:本文为CSDN博主「城南花已开.jpg」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_39781096/article/details/107046804
多线程实现服务器并发
服务器实现
1 |
|
注意结构体的思想:
struct sockInfo
以及其对应的一个全局数组,这样便于多个线程去传递参数,又不至于开辟内存到堆上,还得额外处理释放的问题!!
客户端实现
1 |
|
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!