
网络编程
文章平均质量分 79
对网络编程过程中的一些问题的总结
Rockict_z
这个作者很懒,什么都没留下…
展开
-
【网路编程】多线程编程--线程同步
和多进程编程一样,多线程程序也需要考虑到同步问题。pthread_join可以看作是一种简单的线程同步方式,但是它无法实现复杂的同步需求。原创 2023-08-07 23:18:20 · 201 阅读 · 0 评论 -
【网络编程】多线程编程--线程基础
线程是程序中完成一个独立任务的完整执行序列,根据运行环境以及调度者的身份,可以分为内核线程以及用户线程。相当于运行的容器,当进程的一个内核线程获得CPU的使用权时,它就加载并运行一个用户线程。原创 2023-08-07 22:13:05 · 226 阅读 · 0 评论 -
【网络编程】多进程编程
Linux下创建新进程的系统调用是fork,该函数每次调用都会返回两次,在父进程中返回子进程的pid,在子进程中返回0,失败是都会返回-1并设置error,所以,该返回可以用来判断子进程是否成功创建以及判断当前进程是父进程还是子进程。管道是父进程与子进程间通信的常用手段。从引用计数的角度来说,父进程中打开的文件描述符在子进程中也是打开的,且文件描述符的引用计数加1,并且,父进程的用户根目录,当前工作目录等变量的引用计数都会加1。exec系列的系统调用主要是在子进程中替换当前的进程映像并执行其他程序。原创 2023-08-07 15:56:02 · 128 阅读 · 0 评论 -
【网络编程】多进程编程--消息队列
msgsnd成功时返回0,失败是返回-1并设置errno。msgrcv成功时返回0,失败则返回-1并设置errno。msgget成功时返回一个正整数,它是消息队列的标识符,msgget失败时返回-1并设置errno。使用msgget创建消息队列,则与之相关的内核数据结构也会被创建兵器初始化。msgctl成功时的返回值取决于command参数,失败时返回-1并设置errno。msgrcv系统调用从消息队列中获取消息。msgctl系统调用控制消息队列的属性。《Linux高性能服务器编程》学习笔记。原创 2023-08-07 15:55:07 · 209 阅读 · 0 评论 -
【网络编程】多进程编程--共享内存
共享内存是最高效的IPC机制,因为它不涉及进程之间的任何数据传输,但是我们也必须用其他辅助手段来同步进程对共享内存的访问以避免竞态条件的产生。因此,共享内存通常和其他进程间通信方式一起使用。原创 2023-08-07 14:51:20 · 264 阅读 · 0 评论 -
【网络编程】多进程编程--信号量
对信号量的操作也就是PV操作。接下来的三个系统调用都是操作一组信号量,也就是信号集,而不是单个信号量。原创 2023-08-06 23:17:48 · 224 阅读 · 0 评论 -
【网络编程】多进程编程--僵尸进程
在子进程结束后,父进程读取其退出状态之前,即父进程没有正确处理子进程的返回信息,这样的子进程称为僵尸进程。这是由于在子进程结束之后,内核并不会立即释放该进程的进程表表项。这里可以使用SIGCHLD信号,当一个子进程结束后,它将发送给父进程一个SIGCHLD信号,所以,我们可以在父进程中捕获SIGCHLD信号,并搭配waitpid来彻底结束一个子进程。wait函数可以在父进程中使用,以等待子进程的结束,并获取子进程的返回信息,从而避免了僵尸进程的产生或者使子进程立即结束。一样,即等待任一子进程结束,原创 2023-08-06 20:51:19 · 252 阅读 · 0 评论 -
【网络编程】定时器
定时器,其确切说法也叫定时器容器,两者虽常被混谈但还有有区别的:定时器容器是容器类数据结构,比如时间轮;定时器则是容器内的一个个对象,它是对定时事件的封装。原创 2023-08-06 14:29:33 · 251 阅读 · 0 评论 -
【网络编程】定时器的应用:基于升序链表的定时器处理非活动连接
在接下来的对于非活动连接的处理方面,我们将每一对服务端和客户端之间的连接相关的连接数据保存下来,并且加上其超时时间共同打包到上述数据结构的单个节点中。首先我们实现一个数据结构用来存储定时器,它是一个升序的双向链表。同时,我们设置了统一事件源,SIGALRM信号每一次被触发,主循环中调用一次定时任务处理函数,用来处理到期的定时器。原创 2023-08-05 16:52:02 · 243 阅读 · 0 评论 -
【网络编程】TCP带外数据总结
带外数据(Out Of Band,OOB),用于迅速通告对方本端发生的重要事件,所以它比一般数据具有更高的优先级,其传输既可以使用一条独立的传输层连接,也可以映射到传输普通数据的连接中。虽然TCP和UDP中都没有真正的带外数据,但是TCP利用其头部中的紧急指针标志和紧急指针字段来传输紧急数据,给应用程序提供了一种传输紧急数据的方式,这种传输紧急数据的方式与带外数据类似,所以TCP紧急数据也就可以被称为带外数据。带外缓存,这个缓存只有1B,用来接收带外数据,根据紧急指针所指的位置确定带外数据的位置。原创 2023-08-02 17:08:07 · 1104 阅读 · 0 评论 -
【网络编程】信号
Linux下,一个进程给其他进程发送信号的API是kill函数//该函数把信号sig发送给目标进程pid参数含义pid > 0信号发送给PID为pid的进程pid = 0信号发送给本进程组内的其他进程pid = -1信号发送给除init进程外的所有进程,但发送者需要拥有对目标进程发送信号的权限pid < -1信号发送给组ID为-pid的进程组中的所有成员该函数成功时返回0,失败返回-1并设置error。原创 2023-08-02 16:22:10 · 160 阅读 · 0 评论 -
【网络编程】IO复用的应用一:非阻塞connect
所以,我们可以通过判断connect时返回的错误码是不是EINPROGRESS来实现非阻塞的connect,如果当前是EINPROGRESS并且socket可写,则说明链路建立成功。此时调用getsockopt来清除文件描述符上的错误信息,接下来如果没有错误信息则链路成功建立。在connect连接中,若socket以非阻塞的方式进行连接,则系统内设置的TCP三次握手超时时间为0,所以它不会等待TCP三次握手完成,直接返回,错误为EINPROGRESS。原创 2023-07-30 17:39:25 · 299 阅读 · 0 评论 -
【网络编程】I/O复用
对于注册了EPOLLONESHOT事件的文件描述符,操作系统最多触发其上注册的一个可读、可写或者异常事件,且只触发一次,除非使用epoll_ctl函数重置该文件描述符上注册的EPOLLONESHOT事件。所以,一旦注册了EPOLLONESHOT事件的socket被某个线程处理完毕,该线程就应该立即重置这个socket上的EPOLLONESHOT事件,以确保这个socket下次可读时,其EPOLLIN事件能被触发,从而让其他工作线程有机会继续处理这个socket。下面的函数用来创建内核事件表的文件描述符。原创 2023-07-29 17:05:36 · 209 阅读 · 0 评论 -
【网络编程】有限状态机实例:HTTP请求的读取与分析
有限状态机是逻辑单元内部的一种高效编程方法。对于它的实例——HTTP请求的读取与分析功能的实现来讲,它的两种有限状态机构成分别称为主状态机和从状态机,并且主状态机是在内部调用从状态机的。在代码中,主状态机使用checkstate变量来记录当前的状态。其中,一共有以下两种状态。在从状态机(parse_line)中设置了三个状态,通过recv函数读入用户数据到缓冲区,并且更具用户数据实现状态的转换。原创 2023-07-25 16:55:47 · 466 阅读 · 0 评论 -
【网络编程】服务器程序框架
在任意时间点,程序都仅有一名领导者,他负责监听I/O事件,而其他线程都是追随者,他们休眠在进程池中等待成为新的领导者。此时,新的领导者等到I/O事件,旧的领导者处理I/O事件,二者就实现了并发。由于领导者线程自己监听了I/O事件并处理客户请求,因而领导者/追随者模式不需要再线程之间传递任何额外的数据,也无需向半同步/半反应堆模式那样在线程之间同步对请求队列的访问。工作线程从请求队列中取出事件后,如果是读事件,执行读数据和处理请求的操作,如果是写事件,执行写数据的操作。所以,这种模式下的主线程。原创 2023-07-20 17:56:53 · 440 阅读 · 0 评论 -
【网络编程】Linux服务器程序规范相关内容
下面函数设置日志掩码,使得日志级别大于日志掩码的日志被忽略,从而使得调试信息在发布之后自动删除。退出,因此只能通过子进程看到进一步的错误。相同,进程组会一直存在,直到其中的所有进程都退出或者加入到其他进程组。从以上两个文件中接收到输入的日志后,会把它们输出到指定的日志文件,来处理系统日志,系统日志中包括用户进程产生的日志以及内核日志。daemon的作用是可以将当前进程转化为后台进程。是设施值与日志级别的按位与,设施值的默认值是。,如果fork成功,那么父进程就调用。每个进程组都有一个首领进程,其。转载 2023-07-13 21:19:06 · 291 阅读 · 0 评论 -
【网络编程】Linux高级O/I函数
函数实现了两个文件描述符之间直接传递数据(完全在内核之中操作),避免了用户缓冲区以及内核缓冲区之间的数据拷贝,这也被称为零拷贝。则用于释放这一段空间。这段空间主要用作进程间通信的共享内存。来构成管道的两端,fd[0]只能用于从管道中读出数据,函数用于在两个文件描述符之间移动数据,也是零拷贝操作。创建一个新的文件描述符,该新文件描述符指向与。文件描述符之间移动数据,也是零拷贝操作。创建的管道使用两个文件描述符。创建的双向管道既可读也可以写。创建管道来实现进程间通信。相同的文件、管道或者网络。原创 2023-07-12 14:31:54 · 271 阅读 · 0 评论 -
【网络编程】Linux网络编程基础API
SO_RCVBUF选项和SO_SNDBUF选项分别表示TCP接收缓冲区和发送缓冲区的大小,但是使用setsockopt来设置,系统会给缓冲区设置两倍于我们设置值的大小,例如我们设置2000B的缓冲区,系统实际分配4000B的缓冲区。但是,接收缓冲区的最小值为256B,发送缓冲区的最小值为2048B,小于这两个值的话,用户的设置便会无效,例如我们将发送缓冲区设置为50B,则系统会无视我们的设置,发送缓冲区仍然为256B。若有数据要发送,则延迟关闭socket,设置SO_LINGER的值时,涉及一个结构体。原创 2023-07-10 18:42:58 · 387 阅读 · 0 评论