Linux中UDP服務端和客戶端

1 服務端代碼

#include <stdio.h>
#include <head.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>#define PORT 6666 //端口號:1024~49191
#define IP "192.168.1.110"//"192.168.122.120"int main(int argc, const char *argv[])
{//創建報式套接字int sfd = socket(AF_INET, SOCK_DGRAM, 0);if(sfd < 0){ERR_MSG("socket");return -1;}printf("sfd = %d\n",sfd);//填充服務器自身的地址信息結構體,真實的地址信息結構體根據地址族制定//AF_INET : man 7 ipstruct sockaddr_in sin;sin.sin_family         = AF_INET;      //必須填AF_INETsin.sin_port           = htons(PORT);  //端口號:1024~49151sin.sin_addr.s_addr    = inet_addr(IP);//本機IP:ifconfig//綁定服務器的地址信息結構體到套接字上if(bind(sfd, (struct sockaddr*)&sin,sizeof(sin)) < 0){ERR_MSG("bind");return -1;}printf("bind success\n");char buf[128]="";ssize_t res=0;struct sockaddr_in cin;socklen_t addrlen= sizeof(cin);while(1){bzero(buf,sizeof(buf));//接收數據//res = recvfrom(sfd,buf,sizeof(buf),0,NULL,NULL);//res = recv(sfd,buf,sizeof(buf),0);//res = read(sfd,buf,sizeof(buf));res = recvfrom(sfd,buf,sizeof(buf),0,(struct sockaddr*)&cin,&addrlen);if(res < 0){ERR_MSG("recvfrom");return -1;}printf("[%s : %d] : %s\n",\inet_ntoa(cin.sin_addr),ntohs(cin.sin_port),buf);//buf[sizeof(buf)-1]=0;strcat(buf,"*_*");//發送數據if(sendto(sfd,buf,sizeof(buf),0,(struct sockaddr*)&cin,sizeof(cin))<0){ERR_MSG("sendto");return -1;}printf("sendto success\n");}//關閉文件描述符close(sfd);return 0;
}

2 客戶端代碼

#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <head.h>#define PORT 6666               //端口號:服務器綁定的端口號
#define IP "192.168.1.110"//"192.168.122.109"    //IP:服務器綁定的IPint main(int argc, const char *argv[])
{//創建報式套接字int cfd = socket(AF_INET, SOCK_DGRAM, 0);if(cfd < 0){ERR_MSG("socket");return -1;}printf("cfd = %d\n", cfd);//綁定客戶端的地址信息結構體到套接字上---->非必須綁定//若不綁定,則操作系統會給客戶端綁定運行主機的IP和隨機端口//填充服務器的地址信息結構體,給sendto函數使用//要發給誰,就填誰的地址信息struct sockaddr_in sin;sin.sin_family      = AF_INET;      //必須填AF_INETsin.sin_port        = htons(PORT);      //端口號:服務器綁定的端口號                     sin.sin_addr.s_addr = inet_addr(IP);    //IP:服務器綁定的IPchar buf[128] = "";ssize_t res = 0;struct sockaddr_in rcvaddr;     //存儲接收到的數據包從哪里來socklen_t addrlen = sizeof(rcvaddr);while(1){bzero(buf, sizeof(buf));printf("請輸入>>> ");fgets(buf, sizeof(buf), stdin);buf[strlen(buf)-1] = 0;//發送數據if(sendto(cfd, buf, sizeof(buf), 0, (struct sockaddr*)&sin,  sizeof(sin)) < 0){ERR_MSG("sendto");return -1;}printf("sendto success\n");//接收數據res = recvfrom(cfd, buf, sizeof(buf), 0, (struct sockaddr*)&rcvaddr, &addrlen);//res = recvfrom(cfd, buf, sizeof(buf), 0, NULL, NULL);//res = recv(cfd, buf, sizeof(buf), 0);//res = read(cfd, buf, sizeof(buf));if(res < 0){ERR_MSG("recvfrom");return -1;}printf("[%s : %d] : %s\n", \inet_ntoa(rcvaddr.sin_addr), ntohs(rcvaddr.sin_port), buf);}//關閉文件描述符close(cfd);return 0;
}

3 服務端結果

ubuntu@ubuntu:03_udp$ gcc 01_ser.c -o ser
ubuntu@ubuntu:03_udp$ ./ser
sfd = 3
bind success
[192.168.1.110 : 48368] : 123
sendto success
[192.168.1.110 : 48368] : 123
sendto success
[192.168.1.110 : 48368] : 123
sendto success
[192.168.1.110 : 48368] : 333
sendto success
^C
ubuntu@ubuntu:03_udp$ 

4 客戶端結果

ubuntu@ubuntu:03_udp$ gcc 02_cli.c -o cli
ubuntu@ubuntu:03_udp$ ./cli
cfd = 3
請輸入>>> 123
sendto success
[192.168.1.110 : 6666] : 123*_*
請輸入>>> 123
sendto success
[192.168.1.110 : 6666] : 123*_*
請輸入>>> 123
sendto success
[192.168.1.110 : 6666] : 123*_*
請輸入>>> 333
sendto success
[192.168.1.110 : 6666] : 333*_*
請輸入>>> ^C
ubuntu@ubuntu:03_udp$ 

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/40172.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/40172.shtml
英文地址,請注明出處:http://en.pswp.cn/news/40172.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

中國“諾貝爾獎”未來科學大獎公布2023年獲獎名單

未來科學大獎委員會于8月16日公布2023年獲獎名單。柴繼杰、周儉民因發現抗病小體并闡明其結構和在抗植物病蟲害中的功能做出的開創性工作獲得“生命科學獎”&#xff0c;趙忠賢、陳仙輝因對高溫超導材料的突破性發現和對轉變溫度的系統性提升所做出的開創性貢獻獲得“物質科學獎…

突破網絡編程1024限制的方法(修改配置文件)

文章目錄 概述修改linux配置相關命令步驟1. 打開終端2. 使用sudo權限編輯文件3. 添加資源限制配置4. 保存和退出5. 重啟系統或重新登錄 其他方法1. 使用事件驅動的框架2. 使用連接池3. 負載均衡4. 使用線程池和進程池5. 升級操作系統設置6. 使用專業的高性能服務器7. 分布式架構…

深入源碼分析kubernetes informer機制(三)Resync

[閱讀指南] 這是該系列第三篇 基于kubernetes 1.27 stage版本 為了方便閱讀&#xff0c;后續所有代碼均省略了錯誤處理及與關注邏輯無關的部分。 文章目錄 為什么需要resyncresync做了什么 為什么需要resync 如果看過上一篇&#xff0c;大概能了解&#xff0c;client數據主要通…

1、基于 CentOS 7 構建 LVS-DR 群集。 2、配置nginx負載均衡

一、基于CentOS7和、構建LVS-DR群集 準備四臺虛擬機 ip作用192.168.27.150客戶端192.168.27.151LVS192.168.27.152RS192.168.27.152RS 關閉防火墻 [rootlocalhost ~]# systemctl stop firewalld安裝ifconfig yum install net-tools.x86_64 -y1、DS上 1.1 配置LVS虛擬IP …

uniapp開發微信小程序使用painter將頁面轉換為圖片并保存到本地相冊

引言 我使用到painter的原因是&#xff0c;在uniapp開發微信小程序時&#xff0c;需要將一個頁面的內容轉換成圖片保存到本地相冊。 起初在網上找到很多都是在uniapp中使用 html2canvas 將網頁轉換成圖片再jspdf將圖片轉換為pdf&#xff0c;但是這種方式在小程序環境不支持&am…

opencv進階08-K 均值聚類cv2.kmeans()介紹及示例

K均值聚類是一種常用的無監督學習算法&#xff0c;用于將一組數據點分成不同的簇&#xff08;clusters&#xff09;&#xff0c;以便數據點在同一簇內更相似&#xff0c;而不同簇之間差異較大。K均值聚類的目標是通過最小化數據點與所屬簇中心之間的距離來形成簇。 當我們要預測…

opencv實現以圖搜圖

這里寫目錄標題 1. 步驟1.1 導入OpenCV庫&#xff1a;1.2 加載圖像1.3 提取特征1.4 匹配特征1.5 顯示結果 2. 完整代碼3. 測試圖片及效果 1. 步驟 1.1 導入OpenCV庫&#xff1a; 在您的C代碼中&#xff0c;首先需要導入OpenCV庫。您可以使用以下語句導入核心模塊&#xff1a;…

人工智能算法-SVM, KNN

目錄 SVM, KNN區別 一、KNN算法概述 算法的描述: 二、關于K的取值 K的取法: 三、關于距離的選取 Euclidean Distance 定義: 四、總結 SVM, KNN區別

化繁為簡,使用Hibernate Validator實現參數校驗

前言 在之前的悅享校園的開發中使用了SSM框架&#xff0c;由于當時并沒有使用參數參數校驗工具&#xff0c;方法的入參判斷使用了大量的if else語句&#xff0c;代碼十分臃腫&#xff0c;因此最近在重構代碼時&#xff0c;將框架改為SpringBoot后&#xff0c;引入了Hibernate V…

有一種新型病毒在 3Ds Max 環境中傳播,如何避免?

3ds Max渲染慢&#xff0c;可以使用渲云渲染農場&#xff1a; 渲云渲染農場解決本地渲染慢、電腦配置不足、緊急項目渲染等問題&#xff0c;可批量渲染&#xff0c;批量出結果&#xff0c;速度快&#xff0c;效率高。 此外3dmax支持的CG MAGIC插件專業版正式上線&#xff0c;…

機器學習筆記(1):機器學習入門的概念

導航 一、 人工智能&#xff0c;機器學習&#xff0c;深度學習和傳統學習二、數學基礎三、編程語言 如果你剛剛入門機器學習&#xff0c;會接觸到了非常多的概念。比如人工智能&#xff0c;機器學習&#xff0c;深度學習&#xff0c;神機網絡&#xff0c;強化學習&#xff0c;各…

0基礎學習VR全景平臺篇 第85篇:智慧眼-如何分配角色的權限?

一、功能說明 角色權限&#xff0c;是指給智慧眼的所有角色成員分配具體的操作權限。 二、后臺編輯界面 1、點擊“添加權限”&#xff0c;選擇其可操作的“權限”。注意權限只能逐項選擇&#xff0c;所以如果某個角色擁有多項權限的話&#xff0c;那么需要進行多次添加。“快…

uniapp app 實現右上角回首頁;點homeButton返回上一頁;onNavigationBarButtonTap不生效問題

場景&#xff1a; app&#xff0c;Android移動端 實現點擊右上角圖標&#xff0c;回首頁。 問題&#xff1a;用了官網的 homeButton&#xff0c;圖標正常展示了&#xff0c;也可點擊&#xff0c;但每次點擊后是會返回上一頁而非首頁。 后來查到說&#xff0c;要結合onNavigatio…

linux兩臺服務器互相備份文件(sshpass + crontab)

crontab crontab是linux系統自帶的定時調度軟件&#xff0c;可用于設置周期性被執行的指令&#xff0c;一般用在每天的非高峰負荷時間段運行作業&#xff0c;可在無需人工干預的情況下運行作業。支持在一周或一月中的不同時段運行。 crontab命令允許用戶提交、編輯或刪除相應的…

滴滴Ceph分布式存儲系統優化之鎖優化

摘自&#xff1a;https://mp.weixin.qq.com/s/oWujGOLLGItu1Bv5AuO0-A 2020-09-02 21:45 0.引言 Ceph是國際知名的開源分布式存儲系統&#xff0c;在工業界和學術界都有著重要的影響。Ceph的架構和算法設計發表在國際系統領域頂級會議OSDI、SOSP、SC等上。Ceph社區得到Red Hat…

Transformers架構系列---transformers庫的使用

Transformers最初是由Google發布的論文 Attention is All You Need (2017) 提出的一種新的深度學習網絡架構,這篇論文證明了序列模型(如 LSTM)可以完全被注意力機制取代,甚至可以獲得更好的性能。Transformers網絡結構自2017年提出之后僅僅一兩年的時間內就一直在NLP領域及…

Vue:使用Promise.all()方法并行執行多個請求

在Vue中&#xff0c;可以使用Promise.all()方法來并行執行多個請求。當需要同時執行多個異步請求時&#xff0c;可以將這些請求封裝為Promise對象并使用Promise.all()方法來執行它們。 示例1&#xff1a; 以下是一個示例代碼&#xff0c;展示了如何通過Promise.all()方法并行…

C語言——動態內存管理

動態內存管理詳解 前言&#xff1a;一、為什么存在動態內存分配二、動態內存函數2.1malloc函數2.2calloc函數2.3realloc函數2.4free函數 三、常見的動態內存錯誤3.1 對NULL指針解引用操作3.2 對動態開辟空間的越界訪問3.3 對非動態開辟內存使用free釋放3.4 使用free釋放動態開辟…

Unity UI內存泄漏優化

項目一運行&#xff0c;占用的內存越來越多&#xff0c;不會釋放&#xff0c;導致GC越來越頻繁&#xff0c;越來越慢&#xff0c;這些都是為什么呢&#xff0c;今天從UI方面談起。 首先讓我們來聊聊什么是內存泄漏呢&#xff1f; 一般來講內存泄漏就是指我們的應用向內存申請…

Rabbitmq消息不丟失

目錄 一、消息不丟失1.消息確認2.消息確認業務封裝2.1 發送確認消息測試2.2 消息發送失敗&#xff0c;設置重發機制 一、消息不丟失 消息的不丟失&#xff0c;在MQ角度考慮&#xff0c;一般有三種途徑&#xff1a; 1&#xff0c;生產者不丟數據 2&#xff0c;MQ服務器不丟數據…