`

linux惊群问题之udp

 
阅读更多

 

      今天测试udp服务器进程时发现log中记录了当进程收到一个请求后,会有多条失败处理记录,同时有一条成功处理记录。服务器进程使用sellect模式,通过fork四个子进程来监听同一个socket。

      发现问题后初步怀疑是出现了惊群现象。但是,听说现代内核已经解决了惊群问题,程序也可以确定也没有问题,就奇怪问题发生在哪里了。

      后来在网上一搜才知道,原来linux内核开发人员通过锁机制解决了accept的惊群现象,但是对于sellect和epoll惊群问题并没有解决,所以这种情形下惊群还会出现,也就是当多个进程通过sellect方式监听同一个socket的可读状态时,当该socket变为可读,所有的监听进程都会被唤醒并进行处理,但是对于udp服务器,其中第一个socket会一次性将数据读完,导致其他进程再读socket都返回了失败。

     网友给的解释是对于select,数据是不互斥的,也就是需要多个进程来读取资源。

     因此,有使用fork+select搭建socket服务器时要注意这个问题,很影响性能的。

分享到:
评论

相关推荐

    udp.rar_linux UDP_linux c udp_linux udp arm_udp linux

    Linux UDP编程是网络通信中的重要一环,尤其在嵌入式ARM开发板上,它扮演着不可或缺的角色。UDP,即用户数据报协议(User Datagram Protocol),是一种无连接的、不可靠的传输层协议,与TCP相比,它具有更低的开销和...

    UDP.rar_UDP_linux UDP_linux UDP makefile_udp linux

    在标签"udp linux_udp linux_udp__makefile udp_linux__"中,`linux_udp`和`udp_linux`暗示了这是与Linux系统相关的UDP编程,而`makefile_udp`提示我们项目中包含了一个`Makefile`,这是用于自动化编译和链接C或C++...

    Linux下UDP通信

    在Linux操作系统中,UDP(User Datagram Protocol)是一种无连接的传输层协议,常用于需要快速传输数据且对数据完整性要求不高的场景。本教程将深入探讨如何使用C语言在Linux环境下进行UDP通信,并通过实现简单的...

    linux tcpserver tcpclient udpserver udpclient select并发编程

    本文将深入探讨在Linux环境下,使用C语言实现TCP服务器(tcpserver)、TCP客户端(tcpclient)、UDP服务器(udpserver)以及UDP客户端(udpclient)的并发编程,并涉及select模型用于处理多个连接请求。以下是关于...

    udp通信,windows和linux版本

    包含windows下和linux下的udp客户端/服务端程序。windows下的程序用vc6控制台程序编写,linux下的程序用gcc编译即可。除了同一操作系统下的udp通信外,还能进行windows下与linux下的客户端与服务端通信。出现中文...

    udp.rar_linux c语言 udp_udp 多线程_udp c语言 linux_udp linux

    在这个"udp.rar"压缩包里,包含的是使用C语言在Linux环境下编写的UDP客户端(udpcli.c)和服务器(udpser.c)程序,以及一个可能包含项目资源或说明的文本文件(www.pudn.com.txt)。 1. UDP协议基础:UDP是一种...

    Linux UDP 编程步骤

    在 Linux 系统中,UDP (User Datagram Protocol) 是一种无连接的传输层协议,它提供了简单、快速但不保证数据传输的可靠性。相比于 TCP,UDP 更加轻量级,适用于实时应用,如在线视频、游戏等。下面将详细介绍 Linux...

    Linux UDP socket 设置为的非阻塞模式与阻塞模式区别

    ### Linux UDP Socket 非阻塞模式与阻塞模式的区别详解 #### 一、引言 在进行网络编程时,我们经常会遇到阻塞模式与非阻塞模式的选择问题。这两种模式直接影响程序的运行效率和资源利用率。本文将详细介绍在Linux...

    Linux下的udp广播程序

    在Linux操作系统中,UDP(User Datagram Protocol)是一种无连接的传输层协议,它不提供连接建立、流量控制或错误校正等服务,而是注重高效的数据传输。UDP广播是UDP协议的一种特殊形式,允许一个发送者将数据包发送...

    linux下udp编程

    在UDP编程中,我们需要自己处理这些问题。 **1. 创建套接字** 在Linux中,使用`socket()`函数创建一个UDP套接字。这个函数返回一个套接字描述符,后续的所有操作都将基于此描述符。示例代码如下: ```c int socket...

    Linux下使用UDP协议的点对点聊天程序(含源代码)

    在本文中,我们将深入探讨如何在Linux环境下使用UDP(用户数据报协议)开发一个简单的点对点聊天程序。首先,让我们了解一下UDP协议的基本概念及其在Linux编程中的应用。 UDP是传输层的一种无连接协议,与TCP(传输...

    linux多线程+UDP网络通信(总结+程序)

    linux系统下建立多线程程序设计,完成UDP网络通信的发送与接收,包括总结与源代码,实测效果可见链接https://blog.csdn.net/zxp121127/article/details/78506081

    UDP端口扫描工具-Linux

    总的来说,UDP端口扫描工具在Linux环境下可以帮助管理员发现网络服务的开放端口,排查安全问题,或在开发测试中验证服务的可达性。通过自编的工具,你可以更灵活地控制扫描行为,适应各种场景的需求。不过,也要注意...

    UDPlinux向windows传输文件

    标题中的“UDPlinux向windows传输文件”是指在Linux操作系统中使用UDP协议向Windows系统传输文件的技术。UDP(User Datagram Protocol)是一种无连接的、不可靠的传输协议,常用于实时数据传输,如网络视频、音频流...

    UDP.rar_Linux c++ udp _linux UDP

    在Linux系统下进行C++网络编程时,UDP(User Datagram Protocol)是一种常用的数据传输协议,因其无连接、尽最大努力交付的特点而广泛应用于实时数据传输、流媒体等场景。本资源"UDP.rar"包含了关于Linux C++ UDP...

    C++UDP通讯类(兼容window和linux)

    本文将深入探讨一个基于C++实现的UDP(User Datagram Protocol)通讯类,该类已经过封装,能够兼容Windows和Linux操作系统,便于开发者在不同的环境中进行快速集成和使用。 首先,UDP是一种无连接的、不可靠的传输...

    linux下的UDP发包器

    可以利用原始套接字来完成发送自己填写的UDP数据包。整个程序由初始化原始套接口和发送UDP数据包两部分组成。UDP传输实体将用户数据加上UDP报头,形成UDP数据包,在UDP数据包上增加IP头部,形成IP数据包。 为了能够...

    linux下的udp源代码

    在Linux操作系统中,UDP(User Datagram Protocol)是一种无连接的传输层协议,常用于需要快速传输数据且对数据完整性要求不高的应用场景。本资源包含了一份基于UDP的服务器(server)和客户端(client)的源代码,...

    修改Linux开发板上TCP、UDP发送接收缓存

    一般Linux下,开发板上,有一个默认的TCP、UDP发送和接收的缓存,有时候我们如果需要修改,就可以参照此文档。

    Linux网络编程-TCP&UDP测试工具.zip

    TCP&UDP测试工具

Global site tag (gtag.js) - Google Analytics