随着互联网的普及和应用,网络通信技术也越来越成为大家所关注的话题。在网络通信中,UDP是一种常见的协议,它具有传输速度快、实时性高等特点。为了更好地理解UDP协议,本文将介绍如何在Linux环境下实现UDP服务端。
寿县网站制作公司哪家好,找创新互联公司!从网页设计、网站建设、微信开发、APP开发、成都响应式网站建设公司等网站项目制作,到程序开发,运营维护。创新互联公司于2013年开始到现在10年的时间,我们拥有了丰富的建站经验和运维经验,来保证我们的工作的顺利进行。专注于网站建设就选创新互联公司。
一、UDP协议简介
UDP协议是无连接的传输协议,与TCP协议相比,它能提供更快的传输速度和更高的实时性。UDP协议不保证数据的可靠性,因为在传输过程中不进行确认和重传。UDP协议是面向报文的,每个数据报文独立,没有完整的数据流。
二、UDP服务端的实现
在Linux环境下,我们需要制定一个UDP服务端的基本框架。基本框架应该包括以下几个步骤:
1.创建套接字:使用函数socket()创建一个套接字;
2.绑定IP地址和端口号:使用函数bind()绑定IP地址和端口号;
3.接收数据:使用函数recvfrom()从客户端接收数据;
4.处理数据:对收到的数据进行处理;
5.发送数据:使用函数sendto()向客户端发送数据。
具体实现步骤如下:
1.创建套接字
在Linux环境下,使用函数socket()创建套接字。以流程为例,代码如下所示:
“`
int sockfd;
sockfd = socket(AF_INET, SOCK_DGRAM, 0);
if (sockfd
printf(“Create socket fled!\n”);
return -1;
}
“`
对于函数socket()的参数,之一个参数AF_INET表示协议族,第二个参数SOCK_DGRAM表示传输方式,第三个参数0表示协议编号,通常为0。
2.绑定IP地址和端口号
绑定IP地址和端口号是必须的,这样服务端才能接受客户端的连接请求。在Linux环境下,使用函数bind()绑定IP地址和端口号。代码如下所示:
“`
struct sockaddr_in serveraddr;
memset(&serveraddr, 0, sizeof(serveraddr));
serveraddr.sin_family = AF_INET;
serveraddr.sin_addr.s_addr = htonl(INADDR_ANY);
serveraddr.sin_port = htons(PORT);
if (bind(sockfd, (struct sockaddr *)&serveraddr, sizeof(serveraddr))
printf(“Bind fled!\n”);
return -1;
}
“`
其中,函数bind()的之一个参数是套接字描述符,第二个参数是要绑定的地址和端口号信息结构体,第三个参数是要绑定的结构体的大小。
3.接收数据
接收数据是服务端向客户端发送消息的重要步骤。在Linux环境下,使用函数recvfrom()接收数据。代码如下所示:
“`
char buf[BUFSIZE];
memset(buf, 0, BUFSIZE);
//接收客户端发送的数据
n = recvfrom(sockfd, buf, BUFSIZE, 0, (struct sockaddr *)&clientaddr, &len);
if (n
printf(“Receive data fled!\n”);
return -1;
}
printf(“Receive data from %s: %d bytes\n”, inet_ntoa(clientaddr.sin_addr), n);
printf(“Message: %s\n”, buf);
“`
其中,函数recvfrom()的之一个参数是套接字描述符,第二个参数是接收数据缓冲区,第三个参数是接收数据缓冲区大小,第四个参数是标志位,通常为0,第五个参数是发送方的地址信息结构体,第六个参数是发送方地址结构体的大小。
4.处理数据
对于接收到的数据,服务端需要进行相应的处理才能满足业务需求。可以编写自己的处理函数来进行处理。
5.发送数据
服务端处理完数据后,需要将数据发送给客户端。在Linux环境下,使用函数sendto()向客户端发送数据。代码如下所示:
“`
char sendbuf[BUFSIZE] = “Welcome to Linux UDP Server!”;
//发送消息给客户端
n = sendto(sockfd, sendbuf, strlen(sendbuf), 0, (struct sockaddr *)&clientaddr, sizeof(clientaddr));
if (n
printf(“Send data fled!\n”);
return -1;
}
printf(“Send data to %s: %d bytes\n”, inet_ntoa(clientaddr.sin_addr), n);
“`
其中,函数sendto()的之一个参数是套接字描述符,第二个参数是发送数据缓冲区,第三个参数是发送数据缓冲区大小,第四个参数是标志位,通常为0,第五个参数是接收方的地址信息结构体,第六个参数是接收方地址结构体的大小。
三、
本文介绍了在Linux环境下实现UDP服务端的步骤。对于初学者来说,可以先理解UDP协议的基本概念,再按照上述实现步骤,完成简单的UDP服务端程序。在实际应用开发中,需要根据具体业务需求,编写更加完善的UDP服务端程序。
相关问题拓展阅读:
netstat -nupl (UDP类型的端口)
netstat -ntpl (TCP类型的端口)
a 表示所有
n表示不查询dns
t表示tcp协议
u表示udp协议
p表示查询占用的程序
l表示查询正在监听的程序
netstat -nuplf|grep//这个表示查找处于监听状态的,端口号为3306的进稿段程
Linux是一套免费使用和自由传播的类Unix操作系统,是凯唯一个基于POSIX和UNIX的多用户、多任务、支持多线程和多CPU的操作系统。它能运行主要的UNIX工具软件、应用程序和网络协议。它支持32位和64位硬件。Linux继承了Unix以网络为核心的设计思想,是一个性能稳定的多用户网络操作系统。
Linux操作系统诞生于1991 年10 月5 日(这是之一次正式向外公布时间)。Linux存在着许多不同的Linux版本,但键孙誉它们都使用了Linux内核。Linux可安装在各种计算机硬件设备中,比如手机、平板电脑、路由器、视频游戏控制台、台式计算机、大型机和超级计算机。
严格来讲,Linux这个词本身只表示Linux内核,但实际上人们已经习惯了用Linux来形容整个基于Linux内核,并且使用GNU工程各种工具和数据库的操作系统。
常常看到有些人想要知道自己的Linux主机到底开放了多少Port?要如何来检测呢。通常我们知道的Port有下面这几个:
* ftp:21
* telnet:23
* tp:25
* http:80
* pop-3:110
* netbios-ssn:139
* squid:3128
* mysql:3306
端口当然不只这些个,如何知道Port是否被开启呢?
检测你开启的服务有哪些?使用功能强大的 netstat 指令。
在做为服务器的Linux系统橡洞简中,服务项目是越少越好!这样可以减少避免不必要的入侵通道。要了解自己的系统梁裤当中的服务项目,最简便的方法就是使用nestat 了!这个颤裂命令不但简单(是每一个Linux系统都会安装的套件!),而且功能也是很不错的,例如我们在检查WWW使用者的人数时,就很需要这个命令!好了,我们来看一下netstat 的使用方法:
复制内容到剪贴板
代码:
# netstat
Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address Foreign AddressState
tcp 0 ::ffff:192.168.1.178:ssh ::ffff:192.168.1.175:ESTABLISHED
Active UNIX domain sockets (w/o servers)
Proto RefCnt FlagsTypeStateI-Node Path
unixDGRAM/dev/log
unixDGRAM@/var/run/hal/hotplug_socket
unixDGRAM@udevd
unixSTREAM CONNECTED/var/run/dbus/system_bus_socket
unixSTREAM CONNECTED
unixSTREAM CONNECTED/var/run/dbus/system_bus_socket
unixSTREAM CONNECTED
unixSTREAM CONNECTED
unixSTREAM CONNECTED
如上所示,单纯使用 netstat 的时候,仅 列出目前已经连通的服务与服务名称。所以你可以看到,由于目前仅有一个ssh连接成功,所有就只显示出一个 ESTABLISHED(连接中的意思)。 上面的 :
复制内容到剪贴板
代码:
tcp 0 ::ffff:192.168.1.178:ssh ::ffff:192.168.1.175:4235
这一行表示有一个SSH的服务开放,是由远端的 192.168.1.175这个IP连接到 192.168.1.178 的。而连接的端口是4235。那如果我需要将所有的项目列出来呢?
复制内容到剪贴板
代码:
# netstat -a
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign AddressState
tcp 0 *:*:*LISTEN
tcp 0 *:sunrpc *:*LISTEN
tcp 0 *:auth*:*LISTEN
tcp 0 localhost.localdomain:ipp *:*LISTEN
tcp 0 localhost.localdomain:tp *:*LISTEN
tcp 0 *:ssh*:*LISTEN
tcp 0 ::ffff:192.168.1.178:ssh ::ffff:192.168.1.175:ESTABLISHED
udp 0 *:*:*
udp 0 *:*:*
udp 0 *:sunrpc *:*
udp 0 *:ipp *:*
如上所示,加入 -a(all)就可以了。将所有在机器上 (监听 Listem)或者是(已建立连接的)的服务通通列出的意思。不过,服务的名称已经使用 /etc/services 里面的名称了,而不是使用 port 的数字!目前我主机上面的服务共开放了:sunrpc、auth、ssh、ipp、tp.等服务(就是 Listen的那几个服务)至于已经建立的服务就只有 SSH 这一个!那如果我想知道开放了哪些端口号呢?呵呵,就使用下面的命令吧!
复制内容到剪贴板
代码:
# netstat -an
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign AddressState
tcp 0 0.0.0.0:.0.0.0:* LISTEN
tcp 0 0.0.0.0:.0.0.0:* LISTEN
tcp 0 0.0.0.0:.0.0.0:* LISTEN
tcp 0 127.0.0.1: 0.0.0.0:* LISTEN
tcp 0 127.0.0.1: 0.0.0.0:* LISTEN
tcp 0 ::::::*LISTEN
tcp52 ::ffff:192.168.1.178:::ffff:192.168.1.175:ESTABLISHED
udp 0 0.0.0.0: 0.0.0.0:*
udp 0 0.0.0.0: 0.0.0.0:*
udp 0 0.0.0.0: 0.0.0.0:*
udp 0 0.0.0.0: 0.0.0.0:*
如上所示,我接通的服务只有22这一个,而其它的你可以参照上面的命令输出结果来对照,所以你就可以知道:tp为25端口。因此,通过使用此命令,就可以轻易的子解目前主机的运作状况与服务状态了。当然了,netstat的用途不止于此,你可以使用 man netstat 来查阅一番喔!相信对你的主机会有更大的了解。
相信有不少的朋友都会有这个困扰,就是要怎样删除已经建立的联机呢?因为总有些不速之客会连到您的主机来进行一些破坏的工作!或者是您根本不想让对方联机过来!呵呵!还记得 鸟哥的 Linux 私房菜–基础学习篇内的资源管理 里面提到的几个常用的指令吧!?那就是找出那个联机程序的 PID ,然后给他 kill 掉就是了!简单呀!不过,大问题是『我要怎样找出联机的 PID 呀!?』呵呵!由于 PID 的管理与整体的系统资源有关,这个时候,虽然可以使用 netstat 来观察 PID ,不过只有 root 可以观察到联机状态的 PID 号码呦!( 注:还记得资源管理提及的 PID 概念吗?就是说,在 Linux 系统之内,每个『程序』系统都会给予一个号码来管理!这个就是 PID 啰!)
复制内容到剪贴板
代码:
# netstat -ap
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local AddressForeign AddressStatePID/Program name
tcp 0 *:ssh *:*LISTEN/sshd
tcp84 140.116.141.19:ssh.168.1.11:ESTABLISHED 24751/sshd
Active UNIX domain sockets (servers and established)
Proto RefCnt FlagsTypeStateI-Node PID/Program name Path
unixDGRAM09/syslogd/dev/log
unixDGRAM16648/xinetd
unixDGRAM951/pppoe
unixDGRAM949/pppd
unixDGRAM28/crond
unixDGRAM14/klogd
unixSTREAM CONNECTED/init
看到上面那个斜体字的联机建立的网络状态了吗?嘿嘿!最后面一栏就是显示那个 PID/Program name ,那个 PID ( 上面是)也就是我们要来砍掉的啦!这个时候,如果要将该联机砍掉时,就直接以 kill 来做吧!
复制内容到剪贴板
代码:
# kill
这样就能将该联机给他『踢出去』您的主机啦!! ^_^””
root用户执游旅哗行netstat -ntupl
n表神行示不查询dns
t表示tcp协议
u表示udp协议
p表示查询占用的程序镇厅
几个cpu
Java代码
more /proc/cpuinfo |grep “physical id”|uniq|wc -l
每个cpu是几核(假设cpu配置相同)
Java代码
more /proc/cpuinfo |grep “physical id”|grep “0”|wc -l
Java代码
cat /proc/cpuinfo | grep processor
1. 查看物理CPU的个数
Java代码
#cat /proc/cpuinfo |grep “physical id”|sort |uniq|wc -l
2. 查看逻辑CPU的个数
Java代码
#cat /proc/cpuinfo |grep “processor”|wc -l
3. 查看CPU是几核
Java代码
#cat /proc/cpuinfo |grep “cores”|uniq
4. 查看CPU的主频
Java代码
#cat /proc/cpuinfo |grep MHz|uniq
Java代码
# uname -a
Linux euis1 2.6.9-55.ELp #1 P Fri Apr 20 17:03:35 EDT 2023 i686 i686 i386 GNU/Linux
(查看当前操作系统内核信息)
Java代码
# cat /etc/issue | grep Linux
Red Hat Enterprise Linux AS release 4 (Nahant Update 5)
(查看当前操作系统发行版信息)
Java代码
# cat /proc/cpuinfo | grep name | cut -f2 -d: | uniq -c
Intel(R) Xeon(R) CPUE@ 2.33GHz
(看到有8个逻辑CPU, 也型森知道了CPU型号)
Java代码
# cat /proc/cpuinfo | grep physical | uniq -c
physical id : 0
physical id : 1
(说明实际上是两颗4核的CPU)
Java代码
# getconf LONG_BIT
32
(说明当前CPU运行在32bit模式下, 但不代表CPU不支持64bit)
Java代码
# cat /proc/cpuinfo | grep flags | grep ‘ lm ‘ | wc -l
8
(结果大于0, 说明支持64bit计算. lm指long mode, 支持lm则是64bit)
如何获得CPU的详细信息:
linux命令:
Java代码
cat /proc/cpuinfo
用命令判断几个物理CPU,几个核等:
逻辑CPU个数:
Java代码
# cat /proc/cpuinfo | grep “processor” | wc -l
物理CPU个数:
Java代码
# cat /proc/cpuinfo | grep “physical id” | sort | uniq | wc -l
每个物理CPU中Core的个数:
Java代码
# cat /族握proc/cpuinfo | grep “cpu cores” | wc -l
是否为超线程?
如果有两个逻辑CPU具有相同的”core id”,那么超线程是打兆租庆开的。
每个物理CPU中逻辑CPU(可能是core, threads或both)的个数:
Java代码
# cat /proc/cpuinfo | grep “siblings”
查看文件夹大小
Java代码
du -sh *
列出所有端口
Java代码
netstat -a | more
列出所有 tcp 端口
Java代码
netstat -at
列出所有 udp 端口
Java代码
netstat -au
不显示主机,端口和用户名
Java代码
netstat -an | grep
输出中显示 PID 和进程名称
Java代码
netstat -p
显示 TCP 或 UDP 端口的统计信息
Java代码
# netstat -st
# netstat -su
显示所有端口的统计信息
Java代码
netstat -s
只显示监听端口
Java代码
netstat -l
只列出所有监听 tcp 端口
Java代码
netstat -lt
只列出所有监听 udp 端口
Java代码
netstat -lu
只列出所有监听 UNIX 端口
Java代码
netstat -lx
持续输出 netstat 信息
Java代码
netstat -c
显示系统不支持的地址族
Java代码
netstat –verbose
显示核心路由信息
Java代码
netstat -r
找出程序运行的端口
Java代码
netstat -ap | grep ssh
找出运行在指定端口的进程
Java代码
netstat -an | grep ‘:80’
显示网络接口列表
Java代码
netstat -i
显示详细信息,像是 ifconfig 使用
Java代码
netstat -ie
查看连接某服务端口最多的的IP地址
Java代码
netstat -nat | grep “192.168.1.15:22” |awk ‘{print $5}’|awk -F: ‘{print $1}’|sort|uniq -c|sort -nr|head
TCP各种状态列表
Java代码
netstat -nat |awk ‘{print $6}’
先把状态全都取出来,然后使用uniq -c统计,之后再进行排序。
Java代码
netstat -nat |awk ‘{print $6}’|sort|uniq -c
Java代码
netstat -nat |awk ‘{print $6}’|sort|uniq -c|sort -rn
需要解决更多linux问题,详情请看《Linux就该这样学》
关于linux udp服务端的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。
香港服务器选创新互联,2H2G首月10元开通。
创新互联(www.cdcxhl.com)互联网服务提供商,拥有超过10年的服务器租用、服务器托管、云服务器、虚拟主机、网站系统开发经验。专业提供云主机、虚拟主机、域名注册、VPS主机、云服务器、香港云服务器、免备案服务器等。
当前文章:轻松入门:LinuxUDP服务端实现(linuxudp服务端)
网址分享:http://www.shufengxianlan.com/qtweb/news44/260294.html
网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联