目录
端口号
网络字节序
socket编程
接口
sockaddr结构
udp网络程序
创建套接字
绑定
接收
发送
客户端需要绑定吗?
客户端执行方法
本地环回地址
终端文件
代码
tcp网络程序
SOCK_STREAM
监听
查询网络信息
获取新连接
地址转换函数
客户端绑定
多进程版本
关闭多余文件描述符
如何解决父进程等待子进程会阻塞的问题?
多线程版本
线程池版本
守护进程
进程与任务的关系
端口号
网络通信不仅包括建立连接,还有应用层的通信。
端口号负责判断发给上层哪一个应用。
发送方和接收方在报头中有对应的源端口号和目的端口号。
这种基于ip+端口的通信方式叫socket。
端口号与进程id
绑定的过程就是把进程pcb和哈希表中端口对应位置关联起来。
网络字节序
转换接口
socket编程
接口
sockaddr结构
套接字有三种
设计者不想写三套接口,就需要把类型统一,所以都传入sockaddr结构体,判断地址类型从而决定套接字的种类。
udp网络程序
创建套接字
第一个参数是域的类型
第二个参数是套接字类型
第三个参数是协议类型
返回值是文件描述符
绑定
第二个参数是自己构造一个结构体传进去
family表示域类型,port是端口号,addr是ip
本主机的端口号要发送出去会经过网络,所以要转网络字节序。
ip要发出去也要转网络字节序。
整数ip和字符串ip快速转换
整数转字符串:构造四个八位整型的结构体,将整数强转该结构体类型,分别访问结构体并转字符串。
字符串转整型:将整数强转四个八位结构体类型,分别访问并赋值。
第三个参数是结构体大小。
绑定不推荐直接绑定具体ip一般写0.0.0.0,因为有一些主机有多个网卡,绑定一个其他网卡就接收不了了。
INADDR_ANY表示接收任意地址
绑定端口尽量大一点,1023以下是内置端口。
接收
从套接字中读一个报文
结构体是输出型参数,负责获得对方的信息。
buffer是对方发送的内容,结构体是对方的信息
发送
结构体是发送目标的信息
客户端需要绑定吗?
客户端执行方法
把代码进行分层,处理方法分开。
popen把字符串当成命令,创建子进程,父子进程建立管道,子进程执行命令,结果返回给父进程。
本地环回地址
往下贯穿协议栈,然后又往上返回,不进入网络
终端文件
把输入到2号文件的内容重定向到2号终端。
xshell可以开很多个终端,查询终端。
代码
socket_lesson/my_udp · lyh/linux - 码云 - 开源中国
tcp网络程序
SOCK_STREAM
选择SOCK_STREAM面向字节流。
监听
查询网络信息
l表示listen,p表示对应进程,t表示tcp。
获取新连接
返回值也是文件描述符
accept返回的文件描述符负责真正的IO服务,参数的文件描述符负责建立连接,一般叫作监听套接字。
连接获取失败就继续重新获取。
地址转换函数
客户端绑定
多进程版本
关闭多余文件描述符
多进程版,子进程会继承文件描述符信息,让子进程负责IO就可以把监听套接字关了,父进程不关注IO也可以把不需要的文件描述符关了。
如何解决父进程等待子进程会阻塞的问题?
利用孙子进程解决,把事情给孙子进程做,子进程直接退出,父进程也等待完毕。
第二种方法:用信号忽略
多线程版本
detach线程分离从而不用等待子线程
当静态函数想访问类内成员时,可以把线程的参数结构加一个该类的指针。
线程池版本
假如服务端正在写,客户端关闭了文件,读端关闭了,写端也会被迫关闭。
这样可以防止写端被关闭。防止服务端被关闭就对这个信号忽略。
客户端重连
服务器挂掉无法立即重新启动,解决方法:
守护进程
每一个用户登陆都会产生一个会话,会话里面会生成bash进程提供命令行服务,一个会话可以有一个前台进程多个后台进程,键盘和信号只能影响前台进程。
&变成后台任务,jobs查看后台任务,fg把后台变成前台
fg变成前台后如何变回后台:先用信号暂停,然后用bg。信号暂停后任务会以停止状态回到后台,bash自动回前台。
进程与任务的关系
任务是一个具体事情,它可以被一个进程完成,也可以被一个进程组完成。
守护进程可以不受用户退出,注销(关闭会话)的影响。
做法:把目标进程(组)迁移到一个新的会话。
调用接口的进程不能是该进程组的组长。解决方法:让子进程调用。
第二种方法: