UDP通訊實現

服務器端:

1.獲取套接字

	int fd;fd=socket(AF_INET,SOCK_DGRAM,0);if(fd<0){perror("socket");exit(0);}

#include <sys/types.h>

#include <sys/socket.h>

int socket(int domain, int type, int protocol);

-domain: 指定通信域(通信地址族);

-type: 指定套接字類型;? ??數據報套接字:SOCK_DGRAM

-protocol: 指定協議;? ? ?數據報接字唯一對應TCP,所以無需要指定協議,設為0即可

2.綁定套接字

	struct sockaddr_in addr;bzero(&addr,sizeof(addr));addr.sin_port=htons(atoi(argv[2]));//man inet_aton,判斷地址轉換是否成功if((inet_aton(argv[1],&addr.sin_addr))==0){fprintf(stderr,"Invalid address\n");//表示將“Invalid address”給標準錯誤stderrexit(0);}if(bind(fd,(struct sockaddr *)&addr,sizeof(addr))<0){perror("bind");exit(0);}

函數1:

int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);

-sockfd:socket函數生成的套接字

-addr:通信結構體

-addrlen:通信結構體的長度

注意:參數addr是通用結構體sockaddr,要將初始化的sock_in結構體強制轉換

struct sockaddr_in { sa_family_t ? ?sin_family;

/* 地址族: AF_INET */ in_port_t ? ? ?sin_port; ?

/* 網絡字節序的端口號 */ struct in_addr sin_addr; ?

/*IP地址結構體 */ };

/* IP地址結構體 */ struct in_addr { uint32_t ? ? ? s_addr; ? ? /* 網絡字節序的IP地址 */ };

函數2:

在C語言中,inet_aton函數用于將表示IPv4地址的字符串轉換為網絡字節序的32位二進制數。該函數的原型如下:

int inet_aton(const char *cp, struct in_addr *inp);

其中:

  • cp是一個指向表示IPv4地址的字符串的指針。
  • inp是一個指向in_addr結構的指針,用于存儲轉換后的IPv4地址。

函數返回值為整型,如果字符串成功轉換為IPv4地址,則返回1;如果轉換失敗,則返回0。

函數3:

`bzero()` 函數用于將指定長度的內存區域清零,即將所有字節初始化為0。它通常用于清空敏感的數據或準備數據結構。`bzero()` 函數在許多系統中已經被廢棄,應該使用更現代的函數`memset()` 來替代。其原型如下:
void bzero(void *s, size_t n);

其中,參數 `s` 是指向要清零的內存區域的指針,參數 `n` 是要清零的字節數。

3.接收數據

	while(1){bzero(buf,BUFSIZ);recvfrom(fd,buf,BUFSIZ,0,NULL,NULL);printf("buf=%s\n",buf);}close(fd);

函數原型:ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,
? ? ? ? ? ? ? ? ? ? ? ? ? struct sockaddr *src_addr, socklen_t *addrlen);

功能:接收數據,并將接收到的數據存放到buf指向的緩沖區中。

參數說明:
- sockfd:要接收數據的套接字文件描述符。
- buf:指向用于存放接收數據的緩沖區。
- len:緩沖區的長度。
- flags:一些控制接收操作的標志。
- src_addr:指向發送方的地址結構體的指針。
- addrlen:發送方地址結構體的長度。

返回值:成功接收到數據時,返回接收到的數據的長度;失敗時,返回-1并設置errno。

原始代碼

#include<stdio.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<stdlib.h>
#include<strings.h>
#include<arpa/inet.h>
#include<netinet/in.h>
#include<unistd.h>
int main(int argc ,char *argv[]){int fd;char buf[BUFSIZ]={};struct sockaddr_in addr;if(argc<3){fprintf(stderr,"%s<addr><port>\n",argv[0]);exit(0);}fd=socket(AF_INET,SOCK_DGRAM,0);if(fd<0){perror("socket");exit(0);}bzero(&addr,sizeof(addr));addr.sin_port=htons(atoi(argv[2]));//man inet_aton,判斷地址轉換是否成功if((inet_aton(argv[1],&addr.sin_addr))==0){fprintf(stderr,"Invalid address\n");//表示將“Invalid address”給標準錯誤stderrexit(0);}if(bind(fd,(struct sockaddr *)&addr,sizeof(addr))<0){perror("bind");exit(0);}while(1){bzero(buf,BUFSIZ);recvfrom(fd,buf,BUFSIZ,0,NULL,NULL);printf("buf=%s\n",buf);}close(fd);return 0;
}

客戶端:

1.獲取套接字

	int fd;fd=socket(AF_INET,SOCK_DGRAM,0);if(fd<0){perror("socket");exit(0);}

#include <sys/types.h>

#include <sys/socket.h>

int socket(int domain, int type, int protocol);

-domain: 指定通信域(通信地址族);

-type: 指定套接字類型;? ??數據報套接字:SOCK_DGRAM

-protocol: 指定協議;? ? ?數據報接字唯一對應TCP,所以無需要指定協議,設為0即可

2.發送數據

	char buf[BUFSIZ]={};struct sockaddr_in addr;socklen_t addrlen;addrlen=sizeof(addr);bzero(&addr,sizeof(addr));addr.sin_port=htons(atoi(argv[2]));//man inet_aton,判斷地址轉換是否成功if((inet_aton(argv[1],&addr.sin_addr))==0){fprintf(stderr,"Invalid address\n");//表示將“Invalid address”給標準錯誤stderrexit(0);}while(1){bzero(buf,BUFSIZ);printf("input>");fgets(buf,BUFSIZ,stdin);sendto(fd,buf,strlen(buf),0,(struct sockaddr *)&addr,addrlen);}

函數1:

在C語言中,inet_aton函數用于將表示IPv4地址的字符串轉換為網絡字節序的32位二進制數。該函數的原型如下:

int inet_aton(const char *cp, struct in_addr *inp);

其中:

  • cp是一個指向表示IPv4地址的字符串的指針。
  • inp是一個指向in_addr結構的指針,用于存儲轉換后的IPv4地址。

函數返回值為整型,如果字符串成功轉換為IPv4地址,則返回1;如果轉換失敗,則返回0。

函數2:

`bzero()` 函數用于將指定長度的內存區域清零,即將所有字節初始化為0。它通常用于清空敏感的數據或準備數據結構。`bzero()` 函數在許多系統中已經被廢棄,應該使用更現代的函數`memset()` 來替代。其原型如下:
void bzero(void *s, size_t n);

其中,參數 `s` 是指向要清零的內存區域的指針,參數 `n` 是要清零的字節數。

函數3:

sendto函數用于向指定的套接字發送數據。其聲明如下:

```c
#include <sys/types.h>
#include <sys/socket.h>

ssize_t sendto(int sockfd, const void *buf, size_t len, int flags, const struct sockaddr *dest_addr, socklen_t addrlen);
```

參數解釋:
- `sockfd`: 要發送數據的套接字文件描述符。
- `buf`: 指向要發送的數據的指針。
- `len`: 要發送的數據的長度。
- `flags`: 指定發送數據時的標志,通常為0。
- `dest_addr`: 目標地址的結構體指針,其中包含目標主機的IP地址和端口號。
- `addrlen`: 目標地址結構體的長度。

成功發送數據時,sendto函數返回發送的字節數。如果發生錯誤,則返回-1,并設置errno變量指示錯誤原因。
?

注意:

1.nc -u +IP地址+端口號,連接服務器,本地回環

2.udp停止服務器端,再開啟后,客戶端也是可以正常發送,服務器端正常接收

原始代碼:

#include<stdio.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<stdlib.h>
#include<strings.h>
#include<arpa/inet.h>
#include<netinet/in.h>
#include<unistd.h>
#include<string.h>
int main(int argc ,char *argv[]){int fd;char buf[BUFSIZ]={};struct sockaddr_in addr;socklen_t addrlen;addrlen=sizeof(addr);if(argc<3){fprintf(stderr,"%s<addr><port>\n",argv[0]);exit(0);}fd=socket(AF_INET,SOCK_DGRAM,0);if(fd<0){perror("socket");exit(0);}bzero(&addr,sizeof(addr));addr.sin_port=htons(atoi(argv[2]));//man inet_aton,判斷地址轉換是否成功if((inet_aton(argv[1],&addr.sin_addr))==0){fprintf(stderr,"Invalid address\n");//表示將“Invalid address”給標準錯誤stderrexit(0);}while(1){bzero(buf,BUFSIZ);printf("input>");fgets(buf,BUFSIZ,stdin);sendto(fd,buf,strlen(buf),0,(struct sockaddr *)&addr,addrlen);}close(fd);return 0;
}

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

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

相關文章

Elasticsearch 面試題指南

Elasticsearch 面試題指南 本文檔提供了一份詳細的 Elasticsearch 面試題指南&#xff0c;涵蓋了 Elasticsearch 的核心概念、架構、配置、操作和實際應用場景等方面的內容。希望通過這份指南能夠幫助你在 Elasticsearch 面試中取得成功。 目錄 Elasticsearch 基礎知識 什么…

Retrofit框架源碼深度剖析【Android熱門框架分析第二彈】

Android熱門框架解析&#xff0c;你確定不來看看嗎&#xff1f; OkHttp框架源碼深度剖析【Android熱門框架分析第一彈】 Retrofit框架源碼深度剖析【Android熱門框架分析第二彈】 什么是Retrofit&#xff1f; 準確來說&#xff0c;Retrofit 是一個 RESTful 的 HTTP 網絡請求…

網絡編程:數據包的封裝----libnet庫

使用libnet庫封裝數據包 安裝庫sudo apt-get install libnet-dev 1、數據包內存初始化 libnet_t *libnet_init(int injection_type, char *device, char *err_buf) 2、構造數據包&#xff0c; 由應用層UDP/TCP到MAC層的順序構造 封裝udp數據包的函數 libnet_ptag_t libnet_bui…

Miniconda的常見用法——以Isaacgym為例

1. ubuntu24.04安裝minicondda mkdir -p ~/miniconda3 wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh -O ~/miniconda3/miniconda.sh解釋下這段代碼 bash ~/miniconda3/miniconda.sh -b -u -p ~/miniconda3~/miniconda3/miniconda.sh: 指向Mi…

java中Function、Consumer和Supplier是函數式接口嗎?

是的&#xff0c;在Java中&#xff0c;Function、Consumer 和 Supplier 都是函數式接口&#xff0c;它們都是Java 8引入的java.util.function包中的一部分。這些接口為Lambda表達式提供了類型支持&#xff0c;允許以更簡潔的方式表示方法引用和匿名內部類。 Function<T, R&g…

SHARPNESS-AWARE MINIMIZATION FOR EFFICIENTLY IMPROVING GENERALIZATION--論文筆記

論文筆記 資料 1.代碼地址 https://github.com/google-research/sam https://github.com/davda54/sam 2.論文地址 https://arxiv.org/abs/2010.01412 3.數據集地址 論文摘要的翻譯 在當今嚴重過度參數化的模型中&#xff0c;訓練損失的值很難保證模型的泛化能力。事實上…

代碼隨想錄算法訓練營第三十天|62.不同路徑、63. 不同路徑 II

62.不同路徑 一個機器人位于一個 m x n 網格的左上角 &#xff08;起始點在下圖中標記為 “Start” &#xff09;。 機器人每次只能向下或者向右移動一步。機器人試圖達到網格的右下角&#xff08;在下圖中標記為 “Finish” &#xff09;。 問總共有多少條不同的路徑&#xff…

軟設之生成器模式

生成器模式的意圖是:將一個復雜的類表示與其構造分離&#xff0c;使得相同的構建過程能夠得出不同的表示 Builder:抽象建造者&#xff0c;為創建一個產品對象各個部件指定抽象接口&#xff0c;把產品的生產過程分解為不同的步驟&#xff0c;從而使具體建造者在具體的建造步驟上…

Java中的對象克隆詳解

Java中的對象克隆詳解 大家好&#xff0c;我是免費搭建查券返利機器人省錢賺傭金就用微賺淘客系統3.0的小編&#xff0c;也是冬天不穿秋褲&#xff0c;天冷也要風度的程序猿&#xff01; 對象克隆在Java編程中是一個重要的概念和技術。它允許我們創建一個對象的精確副本&…

MySQL第三次練習

作業三 一 先創建DB abc&#xff0c;創建table student 1、插入一條記錄 2、添加多條記錄 3、添加部分記錄 4、加0.5 5、刪除成績為空的記錄 二 1、創建一個用戶test1使他只能本地登錄擁有查詢student表的權限。 2、查詢用戶test1的權限。 3、刪除用戶test1. 全在一張圖上…

怎樣優化 PostgreSQL 中對日期時間范圍的模糊查詢?

文章目錄 一、問題分析&#xff08;一&#xff09;索引未有效利用&#xff08;二&#xff09;日期時間格式不統一&#xff08;三&#xff09;復雜的查詢條件 二、優化策略&#xff08;一&#xff09;使用合適的索引&#xff08;二&#xff09;規范日期時間格式&#xff08;三&a…

AI學習指南機器學習篇-層次聚類(Hierarchical Clustering)簡介

AI學習指南機器學習篇-層次聚類(Hierarchical Clustering)簡介 在機器學習領域中&#xff0c;層次聚類(Hierarchical Clustering)是一種常見的無監督學習算法&#xff0c;用于將數據集中的樣本分成具有相似特征的群組。層次聚類不需要預先指定要分成的群組數目&#xff0c;而是…

邏輯回歸模型(非回歸問題,而是分類問題)

目錄&#xff1a; 一、Sigmoid函數&#xff1a;二、邏輯回歸介紹&#xff1a;三、決策邊界四、邏輯回歸模型訓練過程&#xff1a;1.訓練目標&#xff1a;2.梯度下降調整參數&#xff1a; 一、Sigmoid函數&#xff1a; Sigmoid函數是構建邏輯回歸模型的重要函數&#xff0c;如下…

免費壓縮pdf文件大小軟件收費嗎?pdf如何壓縮文件大小?12款壓縮應用推薦!

在數字化時代&#xff0c;PDF文件因其跨平臺、格式統一的特點而廣受歡迎。然而&#xff0c;隨著文件內容的增加&#xff0c;PDF文件的大小也逐漸增大&#xff0c;給存儲和傳輸帶來了諸多不便。因此&#xff0c;尋找一款合適的PDF壓縮軟件成為了許多用戶的需求。本文將詳細介紹1…

單調隊列與單調棧(集訓day2)

一、目錄 1、單調隊列 2、單調棧 二、正文 1.單調棧題型&#xff1a; &#xff08;1&#xff09;給出一個數組找出其中每個數左邊第一個比它小&#xff08;大&#xff09;的數字 830. 單調棧 - AcWing題庫 &#xff08;2&#xff09;求直方圖中最大的矩形&…

電子設備常用的膠水有哪些?

目錄 1、502膠水 2、703膠水 3、704膠水 4、AB膠 5、紅膠 6、Underfill 7、導電膠 8、UV膠 9、熱熔膠 10、環氧樹脂膠 11、硅酮膠 12、聚氨酯膠 13、丙烯酸膠 14、丁基膠 1、502膠水 502膠水&#xff0c;也被稱為瞬間膠或快干膠&#xff0c;是一種非常常見的粘合…

電動卡丁車語音芯片方案選型:讓駕駛體驗更智能、更安全

在追求速度與激情的電動卡丁車領域&#xff0c;每一次升級都意味著更加極致的駕駛體驗。而今天&#xff0c;我們要介紹的&#xff0c;正是一款能夠顯著提升電動卡丁車智能化與安全性的語音芯片方案——為您的愛車增添一份獨特的魅力與安全保障。 智能化升級&#xff0c;從“聽…

[Python學習篇] Python面向對象——繼承

繼承是什么 繼承是面向對象編程&#xff08;OOP&#xff09;中的一個核心概念。繼承允許一個類&#xff08;稱為子類或派生類&#xff09;從另一個類&#xff08;稱為父類或基類&#xff09;繼承屬性和方法。這樣可以重用代碼&#xff0c;提高代碼的模塊化和可維護性。 父類&am…

js面試題2024

1.js的數據類型 boolean number string null undefined bigint symbol object 按存儲方式分&#xff0c;前面七種為基本數據類型&#xff0c;存儲在棧上&#xff0c;object是引用數據類型&#xff0c;存儲在堆上&#xff0c;在棧中存儲指針 按es標準分&#xff0c;bigint 和sym…