轻松入门:Linux UDP服务端实现 (linux udp服务端)

随着互联网的普及和应用,网络通信技术也越来越成为大家所关注的话题。在网络通信中,UDP是一种常见的协议,它具有传输速度快、实时性高等特点。为了更好地理解UDP协议,本文将介绍如何在Linux环境下实现UDP服务端。

一、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服务端程序。

相关问题拓展阅读:

如何查看linux服务器开放了哪些端口

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表示查询占用的程序镇厅

怎么查看linux服务器的配置

几个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服务端的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。


数据运维技术 » 轻松入门:Linux UDP服务端实现 (linux udp服务端)