新聞中心
隨著互聯(lián)網(wǎng)的普及和應(yīng)用,網(wǎng)絡(luò)通信技術(shù)也越來(lái)越成為大家所關(guān)注的話題。在網(wǎng)絡(luò)通信中,UDP是一種常見(jiàn)的協(xié)議,它具有傳輸速度快、實(shí)時(shí)性高等特點(diǎn)。為了更好地理解UDP協(xié)議,本文將介紹如何在Linux環(huán)境下實(shí)現(xiàn)UDP服務(wù)端。

壽縣網(wǎng)站制作公司哪家好,找創(chuàng)新互聯(lián)公司!從網(wǎng)頁(yè)設(shè)計(jì)、網(wǎng)站建設(shè)、微信開發(fā)、APP開發(fā)、成都響應(yīng)式網(wǎng)站建設(shè)公司等網(wǎng)站項(xiàng)目制作,到程序開發(fā),運(yùn)營(yíng)維護(hù)。創(chuàng)新互聯(lián)公司于2013年開始到現(xiàn)在10年的時(shí)間,我們擁有了豐富的建站經(jīng)驗(yàn)和運(yùn)維經(jīng)驗(yàn),來(lái)保證我們的工作的順利進(jìn)行。專注于網(wǎng)站建設(shè)就選創(chuàng)新互聯(lián)公司。
一、UDP協(xié)議簡(jiǎn)介
UDP協(xié)議是無(wú)連接的傳輸協(xié)議,與TCP協(xié)議相比,它能提供更快的傳輸速度和更高的實(shí)時(shí)性。UDP協(xié)議不保證數(shù)據(jù)的可靠性,因?yàn)樵趥鬏斶^(guò)程中不進(jìn)行確認(rèn)和重傳。UDP協(xié)議是面向報(bào)文的,每個(gè)數(shù)據(jù)報(bào)文獨(dú)立,沒(méi)有完整的數(shù)據(jù)流。
二、UDP服務(wù)端的實(shí)現(xiàn)
在Linux環(huán)境下,我們需要制定一個(gè)UDP服務(wù)端的基本框架。基本框架應(yīng)該包括以下幾個(gè)步驟:
1.創(chuàng)建套接字:使用函數(shù)socket()創(chuàng)建一個(gè)套接字;
2.綁定IP地址和端口號(hào):使用函數(shù)bind()綁定IP地址和端口號(hào);
3.接收數(shù)據(jù):使用函數(shù)recvfrom()從客戶端接收數(shù)據(jù);
4.處理數(shù)據(jù):對(duì)收到的數(shù)據(jù)進(jìn)行處理;
5.發(fā)送數(shù)據(jù):使用函數(shù)sendto()向客戶端發(fā)送數(shù)據(jù)。
具體實(shí)現(xiàn)步驟如下:
1.創(chuàng)建套接字
在Linux環(huán)境下,使用函數(shù)socket()創(chuàng)建套接字。以流程為例,代碼如下所示:
“`
int sockfd;
sockfd = socket(AF_INET, SOCK_DGRAM, 0);
if (sockfd
printf(“Create socket fled!\n”);
return -1;
}
“`
對(duì)于函數(shù)socket()的參數(shù),之一個(gè)參數(shù)AF_INET表示協(xié)議族,第二個(gè)參數(shù)SOCK_DGRAM表示傳輸方式,第三個(gè)參數(shù)0表示協(xié)議編號(hào),通常為0。
2.綁定IP地址和端口號(hào)
綁定IP地址和端口號(hào)是必須的,這樣服務(wù)端才能接受客戶端的連接請(qǐng)求。在Linux環(huán)境下,使用函數(shù)bind()綁定IP地址和端口號(hào)。代碼如下所示:
“`
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;
}
“`
其中,函數(shù)bind()的之一個(gè)參數(shù)是套接字描述符,第二個(gè)參數(shù)是要綁定的地址和端口號(hào)信息結(jié)構(gòu)體,第三個(gè)參數(shù)是要綁定的結(jié)構(gòu)體的大小。
3.接收數(shù)據(jù)
接收數(shù)據(jù)是服務(wù)端向客戶端發(fā)送消息的重要步驟。在Linux環(huán)境下,使用函數(shù)recvfrom()接收數(shù)據(jù)。代碼如下所示:
“`
char buf[BUFSIZE];
memset(buf, 0, BUFSIZE);
//接收客戶端發(fā)送的數(shù)據(jù)
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);
“`
其中,函數(shù)recvfrom()的之一個(gè)參數(shù)是套接字描述符,第二個(gè)參數(shù)是接收數(shù)據(jù)緩沖區(qū),第三個(gè)參數(shù)是接收數(shù)據(jù)緩沖區(qū)大小,第四個(gè)參數(shù)是標(biāo)志位,通常為0,第五個(gè)參數(shù)是發(fā)送方的地址信息結(jié)構(gòu)體,第六個(gè)參數(shù)是發(fā)送方地址結(jié)構(gòu)體的大小。
4.處理數(shù)據(jù)
對(duì)于接收到的數(shù)據(jù),服務(wù)端需要進(jìn)行相應(yīng)的處理才能滿足業(yè)務(wù)需求??梢跃帉懽约旱奶幚砗瘮?shù)來(lái)進(jìn)行處理。
5.發(fā)送數(shù)據(jù)
服務(wù)端處理完數(shù)據(jù)后,需要將數(shù)據(jù)發(fā)送給客戶端。在Linux環(huán)境下,使用函數(shù)sendto()向客戶端發(fā)送數(shù)據(jù)。代碼如下所示:
“`
char sendbuf[BUFSIZE] = “Welcome to Linux UDP Server!”;
//發(fā)送消息給客戶端
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);
“`
其中,函數(shù)sendto()的之一個(gè)參數(shù)是套接字描述符,第二個(gè)參數(shù)是發(fā)送數(shù)據(jù)緩沖區(qū),第三個(gè)參數(shù)是發(fā)送數(shù)據(jù)緩沖區(qū)大小,第四個(gè)參數(shù)是標(biāo)志位,通常為0,第五個(gè)參數(shù)是接收方的地址信息結(jié)構(gòu)體,第六個(gè)參數(shù)是接收方地址結(jié)構(gòu)體的大小。
三、
本文介紹了在Linux環(huán)境下實(shí)現(xiàn)UDP服務(wù)端的步驟。對(duì)于初學(xué)者來(lái)說(shuō),可以先理解UDP協(xié)議的基本概念,再按照上述實(shí)現(xiàn)步驟,完成簡(jiǎn)單的UDP服務(wù)端程序。在實(shí)際應(yīng)用開發(fā)中,需要根據(jù)具體業(yè)務(wù)需求,編寫更加完善的UDP服務(wù)端程序。
相關(guān)問(wèn)題拓展閱讀:
- 如何查看linux服務(wù)器開放了哪些端口
- 怎么查看linux服務(wù)器的配置
如何查看linux服務(wù)器開放了哪些端口
netstat -nupl (UDP類型的端口)
netstat -ntpl (TCP類型的端口)
a 表示所有
n表示不查詢dns
t表示tcp協(xié)議
u表示udp協(xié)議
p表示查詢占用的程序
l表示查詢正在監(jiān)聽(tīng)的程序
netstat -nuplf|grep//這個(gè)表示查找處于監(jiān)聽(tīng)狀態(tài)的,端口號(hào)為3306的進(jìn)稿段程
Linux是一套免費(fèi)使用和自由傳播的類Unix操作系統(tǒng),是凱唯一個(gè)基于POSIX和UNIX的多用戶、多任務(wù)、支持多線程和多CPU的操作系統(tǒng)。它能運(yùn)行主要的UNIX工具軟件、應(yīng)用程序和網(wǎng)絡(luò)協(xié)議。它支持32位和64位硬件。Linux繼承了Unix以網(wǎng)絡(luò)為核心的設(shè)計(jì)思想,是一個(gè)性能穩(wěn)定的多用戶網(wǎng)絡(luò)操作系統(tǒng)。
Linux操作系統(tǒng)誕生于1991 年10 月5 日(這是之一次正式向外公布時(shí)間)。Linux存在著許多不同的Linux版本,但鍵孫譽(yù)它們都使用了Linux內(nèi)核。Linux可安裝在各種計(jì)算機(jī)硬件設(shè)備中,比如手機(jī)、平板電腦、路由器、視頻游戲控制臺(tái)、臺(tái)式計(jì)算機(jī)、大型機(jī)和超級(jí)計(jì)算機(jī)。
嚴(yán)格來(lái)講,Linux這個(gè)詞本身只表示Linux內(nèi)核,但實(shí)際上人們已經(jīng)習(xí)慣了用Linux來(lái)形容整個(gè)基于Linux內(nèi)核,并且使用GNU工程各種工具和數(shù)據(jù)庫(kù)的操作系統(tǒng)。
常??吹接行┤讼胍雷约旱腖inux主機(jī)到底開放了多少Port?要如何來(lái)檢測(cè)呢。通常我們知道的Port有下面這幾個(gè):
* ftp:21
* telnet:23
* tp:25
* http:80
* pop-3:110
* netbios-ssn:139
* squid:3128
* mysql:3306
端口當(dāng)然不只這些個(gè),如何知道Port是否被開啟呢?
檢測(cè)你開啟的服務(wù)有哪些?使用功能強(qiáng)大的 netstat 指令。
在做為服務(wù)器的Linux系統(tǒng)橡洞簡(jiǎn)中,服務(wù)項(xiàng)目是越少越好!這樣可以減少避免不必要的入侵通道。要了解自己的系統(tǒng)梁褲當(dāng)中的服務(wù)項(xiàng)目,最簡(jiǎn)便的方法就是使用nestat 了!這個(gè)顫裂命令不但簡(jiǎn)單(是每一個(gè)Linux系統(tǒng)都會(huì)安裝的套件!),而且功能也是很不錯(cuò)的,例如我們?cè)跈z查WWW使用者的人數(shù)時(shí),就很需要這個(gè)命令!好了,我們來(lái)看一下netstat 的使用方法:
復(fù)制內(nèi)容到剪貼板
代碼:
# 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 的時(shí)候,僅 列出目前已經(jīng)連通的服務(wù)與服務(wù)名稱。所以你可以看到,由于目前僅有一個(gè)ssh連接成功,所有就只顯示出一個(gè) ESTABLISHED(連接中的意思)。 上面的 :
復(fù)制內(nèi)容到剪貼板
代碼:
tcp 0 ::ffff:192.168.1.178:ssh ::ffff:192.168.1.175:4235
這一行表示有一個(gè)SSH的服務(wù)開放,是由遠(yuǎn)端的 192.168.1.175這個(gè)IP連接到 192.168.1.178 的。而連接的端口是4235。那如果我需要將所有的項(xiàng)目列出來(lái)呢?
復(fù)制內(nèi)容到剪貼板
代碼:
# 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)就可以了。將所有在機(jī)器上 (監(jiān)聽(tīng) Listem)或者是(已建立連接的)的服務(wù)通通列出的意思。不過(guò),服務(wù)的名稱已經(jīng)使用 /etc/services 里面的名稱了,而不是使用 port 的數(shù)字!目前我主機(jī)上面的服務(wù)共開放了:sunrpc、auth、ssh、ipp、tp.等服務(wù)(就是 Listen的那幾個(gè)服務(wù))至于已經(jīng)建立的服務(wù)就只有 SSH 這一個(gè)!那如果我想知道開放了哪些端口號(hào)呢?呵呵,就使用下面的命令吧!
復(fù)制內(nèi)容到剪貼板
代碼:
# 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:*
如上所示,我接通的服務(wù)只有22這一個(gè),而其它的你可以參照上面的命令輸出結(jié)果來(lái)對(duì)照,所以你就可以知道:tp為25端口。因此,通過(guò)使用此命令,就可以輕易的子解目前主機(jī)的運(yùn)作狀況與服務(wù)狀態(tài)了。當(dāng)然了,netstat的用途不止于此,你可以使用 man netstat 來(lái)查閱一番喔!相信對(duì)你的主機(jī)會(huì)有更大的了解。
相信有不少的朋友都會(huì)有這個(gè)困擾,就是要怎樣刪除已經(jīng)建立的聯(lián)機(jī)呢?因?yàn)榭傆行┎凰僦蜁?huì)連到您的主機(jī)來(lái)進(jìn)行一些破壞的工作!或者是您根本不想讓對(duì)方聯(lián)機(jī)過(guò)來(lái)!呵呵!還記得 鳥哥的 Linux 私房菜–基礎(chǔ)學(xué)習(xí)篇內(nèi)的資源管理 里面提到的幾個(gè)常用的指令吧?。磕蔷褪钦页瞿莻€(gè)聯(lián)機(jī)程序的 PID ,然后給他 kill 掉就是了!簡(jiǎn)單呀!不過(guò),大問(wèn)題是『我要怎樣找出聯(lián)機(jī)的 PID 呀?。俊缓呛?!由于 PID 的管理與整體的系統(tǒng)資源有關(guān),這個(gè)時(shí)候,雖然可以使用 netstat 來(lái)觀察 PID ,不過(guò)只有 root 可以觀察到聯(lián)機(jī)狀態(tài)的 PID 號(hào)碼呦!( 注:還記得資源管理提及的 PID 概念嗎?就是說(shuō),在 Linux 系統(tǒng)之內(nèi),每個(gè)『程序』系統(tǒng)都會(huì)給予一個(gè)號(hào)碼來(lái)管理!這個(gè)就是 PID 啰!)
復(fù)制內(nèi)容到剪貼板
代碼:
# 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
看到上面那個(gè)斜體字的聯(lián)機(jī)建立的網(wǎng)絡(luò)狀態(tài)了嗎?嘿嘿!最后面一欄就是顯示那個(gè) PID/Program name ,那個(gè) PID ( 上面是)也就是我們要來(lái)砍掉的啦!這個(gè)時(shí)候,如果要將該聯(lián)機(jī)砍掉時(shí),就直接以 kill 來(lái)做吧!
復(fù)制內(nèi)容到剪貼板
代碼:
# kill
這樣就能將該聯(lián)機(jī)給他『踢出去』您的主機(jī)啦??! ^_^””
root用戶執(zhí)游旅嘩行netstat -ntupl
n表神行示不查詢dns
t表示tcp協(xié)議
u表示udp協(xié)議
p表示查詢占用的程序鎮(zhèn)廳
怎么查看linux服務(wù)器的配置
幾個(gè)cpu
Java代碼
more /proc/cpuinfo |grep “physical id”|uniq|wc -l
每個(gè)cpu是幾核(假設(shè)cpu配置相同)
Java代碼
more /proc/cpuinfo |grep “physical id”|grep “0”|wc -l
Java代碼
cat /proc/cpuinfo | grep processor
1. 查看物理CPU的個(gè)數(shù)
Java代碼
#cat /proc/cpuinfo |grep “physical id”|sort |uniq|wc -l
2. 查看邏輯CPU的個(gè)數(shù)
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
(查看當(dāng)前操作系統(tǒng)內(nèi)核信息)
Java代碼
# cat /etc/issue | grep Linux
Red Hat Enterprise Linux AS release 4 (Nahant Update 5)
(查看當(dāng)前操作系統(tǒng)發(fā)行版信息)
Java代碼
# cat /proc/cpuinfo | grep name | cut -f2 -d: | uniq -c
Intel(R) Xeon(R) CPUE@ 2.33GHz
(看到有8個(gè)邏輯CPU, 也型森知道了CPU型號(hào))
Java代碼
# cat /proc/cpuinfo | grep physical | uniq -c
physical id : 0
physical id : 1
(說(shuō)明實(shí)際上是兩顆4核的CPU)
Java代碼
# getconf LONG_BIT
32
(說(shuō)明當(dāng)前CPU運(yùn)行在32bit模式下, 但不代表CPU不支持64bit)
Java代碼
# cat /proc/cpuinfo | grep flags | grep ‘ lm ‘ | wc -l
8
(結(jié)果大于0, 說(shuō)明支持64bit計(jì)算. lm指long mode, 支持lm則是64bit)
如何獲得CPU的詳細(xì)信息:
linux命令:
Java代碼
cat /proc/cpuinfo
用命令判斷幾個(gè)物理CPU,幾個(gè)核等:
邏輯CPU個(gè)數(shù):
Java代碼
# cat /proc/cpuinfo | grep “processor” | wc -l
物理CPU個(gè)數(shù):
Java代碼
# cat /proc/cpuinfo | grep “physical id” | sort | uniq | wc -l
每個(gè)物理CPU中Core的個(gè)數(shù):
Java代碼
# cat /族握proc/cpuinfo | grep “cpu cores” | wc -l
是否為超線程?
如果有兩個(gè)邏輯CPU具有相同的”core id”,那么超線程是打兆租慶開的。
每個(gè)物理CPU中邏輯CPU(可能是core, threads或both)的個(gè)數(shù):
Java代碼
# cat /proc/cpuinfo | grep “siblings”
查看文件夾大小
Java代碼
du -sh *
列出所有端口
Java代碼
netstat -a | more
列出所有 tcp 端口
Java代碼
netstat -at
列出所有 udp 端口
Java代碼
netstat -au
不顯示主機(jī),端口和用戶名
Java代碼
netstat -an | grep
輸出中顯示 PID 和進(jìn)程名稱
Java代碼
netstat -p
顯示 TCP 或 UDP 端口的統(tǒng)計(jì)信息
Java代碼
# netstat -st
# netstat -su
顯示所有端口的統(tǒng)計(jì)信息
Java代碼
netstat -s
只顯示監(jiān)聽(tīng)端口
Java代碼
netstat -l
只列出所有監(jiān)聽(tīng) tcp 端口
Java代碼
netstat -lt
只列出所有監(jiān)聽(tīng) udp 端口
Java代碼
netstat -lu
只列出所有監(jiān)聽(tīng) UNIX 端口
Java代碼
netstat -lx
持續(xù)輸出 netstat 信息
Java代碼
netstat -c
顯示系統(tǒng)不支持的地址族
Java代碼
netstat –verbose
顯示核心路由信息
Java代碼
netstat -r
找出程序運(yùn)行的端口
Java代碼
netstat -ap | grep ssh
找出運(yùn)行在指定端口的進(jìn)程
Java代碼
netstat -an | grep ‘:80’
顯示網(wǎng)絡(luò)接口列表
Java代碼
netstat -i
顯示詳細(xì)信息,像是 ifconfig 使用
Java代碼
netstat -ie
查看連接某服務(wù)端口最多的的IP地址
Java代碼
netstat -nat | grep “192.168.1.15:22” |awk ‘{print $5}’|awk -F: ‘{print $1}’|sort|uniq -c|sort -nr|head
TCP各種狀態(tài)列表
Java代碼
netstat -nat |awk ‘{print $6}’
先把狀態(tài)全都取出來(lái),然后使用uniq -c統(tǒng)計(jì),之后再進(jìn)行排序。
Java代碼
netstat -nat |awk ‘{print $6}’|sort|uniq -c
Java代碼
netstat -nat |awk ‘{print $6}’|sort|uniq -c|sort -rn
需要解決更多l(xiāng)inux問(wèn)題,詳情請(qǐng)看《Linux就該這樣學(xué)》
關(guān)于linux udp服務(wù)端的介紹到此就結(jié)束了,不知道你從中找到你需要的信息了嗎 ?如果你還想了解更多這方面的信息,記得收藏關(guān)注本站。
香港服務(wù)器選創(chuàng)新互聯(lián),2H2G首月10元開通。
創(chuàng)新互聯(lián)(www.cdcxhl.com)互聯(lián)網(wǎng)服務(wù)提供商,擁有超過(guò)10年的服務(wù)器租用、服務(wù)器托管、云服務(wù)器、虛擬主機(jī)、網(wǎng)站系統(tǒng)開發(fā)經(jīng)驗(yàn)。專業(yè)提供云主機(jī)、虛擬主機(jī)、域名注冊(cè)、VPS主機(jī)、云服務(wù)器、香港云服務(wù)器、免備案服務(wù)器等。
分享文章:輕松入門:LinuxUDP服務(wù)端實(shí)現(xiàn)(linuxudp服務(wù)端)
轉(zhuǎn)載來(lái)源:http://www.dlmjj.cn/article/cosodcj.html


咨詢
建站咨詢
