網絡編程——UDP網絡編程

文章目錄

    • 1、sendto(),recvfrom()

在這里插入圖片描述

與TCP編程不同的是:

  • 無需建立連接,在recvfrom()阻塞等待客戶端的數據,收到數據后進入do something進行數據的處理。

1、sendto(),recvfrom()

  • ssize_t sendto(int socket, void *message, size_t length, int flags, struct sockaddr *dest_addr, socklen_t dest_len);

    • struct sockaddr *dest_addr:接收數據方的IP地址和端口號
    • socklen_t *address_len:存放地址長度的變量
  • size_t recvfrom(int socket, void *buffer, size_t length, int flags, struct sockaddr *dest_addr, socklen_t *address_len);

    • struct sockaddr *dest_addr:發送數據方的IP地址和端口號
    • socklen_t *address_len:存放地址長度的變量
  • 這兩個函數一般在使用UDP協議時使用

代碼舉例:net.h

#ifndef __MAKEU_NET_H__
#define __MAKEU_NET_H__#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <errno.h>
#include <stdlib.h>
#include <strings.h>
#include <sys/types.h>                  /* See NOTES */
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/ip.h>                 /* superset of previous */#define SERV_PORT 5001
#define SERV_IP_ADDR "192.168.7.246"#define QUIT_STR "quit"#endif

server.c

#include "net.h"int main(void)
{int fd = -1;struct sockaddr_in sin;/* 1. 創建socket fd */if ((fd = socket (AF_INET, SOCK_DGRAM, 0)) < 0) { //udp程序perror ("socket");exit (1);}/* 2. 允許綁定地址快速重用 */int b_reuse = 1;setsockopt (fd, SOL_SOCKET, SO_REUSEADDR, &b_reuse, sizeof (int));/*2. 綁定 *//*2.1 填充struct sockaddr_in結構體變量 */bzero (&sin, sizeof (sin));sin.sin_family = AF_INET;sin.sin_port = htons (SERV_PORT);       //網絡字節序的端口號/* 讓服務器程序能綁定在任意的IP上 */
#if 1sin.sin_addr.s_addr = htonl (INADDR_ANY);
#elseif (inet_pton (AF_INET, SERV_IP_ADDR, (void *) &sin.sin_addr) != 1) {perror ("inet_pton");exit (1);}
#endif/*2.2 綁定 */if (bind (fd, (struct sockaddr *) &sin, sizeof (sin)) < 0) {perror ("bind");exit (1);}char buf[BUFSIZ];struct sockaddr_in cin;socklen_t addrlen = sizeof(cin);printf("\nUDP server started!\n");while(1) {bzero(buf, BUFSIZ);if( recvfrom(fd, buf, BUFSIZ-1, 0,(struct sockaddr *)&cin, &addrlen ) < 0) {perror("recvfrom");continue;}char ipv4_addr[16];if (!inet_ntop (AF_INET, (void *) &cin.sin_addr, ipv4_addr, sizeof (cin))) {perror ("inet_ntop");exit (1);}printf("Recived from(%s:%d), data:%s",ipv4_addr, ntohs(cin.sin_port), buf);if (!strncasecmp (buf, QUIT_STR, strlen (QUIT_STR))) {  //用戶輸入了quit字符printf ("Client(%s:%d) is exiting!\n", ipv4_addr, ntohs(cin.sin_port));}}close(fd);return 0;
}

client.c

/*udp demo */
/* usage:* ./client serv_ip serv_port 
*/
#include "net.h"
void usage(char *s)
{printf("\nThis is udp demo!\n");printf("\nUsage:\n\t %s serv_ip serv_port",s);printf("\n\t serv_ip: udp server ip address");printf("\n\t serv_port: udp server port(serv_port > 5000)\n\n");
}int main(int argc, char *argv[])
{int fd = -1;int port = SERV_PORT;port = atoi(argv[2]);if(port < 0 || (port >0 && port <= 5000)) {usage(argv[0]);exit(1);}struct sockaddr_in sin;if(argc !=3) {usage(argv[0]);exit(1);}        /* 1. 創建socket fd*/if( (fd = socket(AF_INET,SOCK_DGRAM, 0)) < 0) { //UDP編程perror("socket");exit(1);}/*2.1 填充struct sockaddr_in結構體變量 */bzero(&sin,sizeof(sin));sin.sin_family = AF_INET;sin.sin_port = htons(SERV_PORT); //網絡字節序的端口號
#if 0sin.sin_addr.s_addr = inet_addr(argv[1]);
#elseif( inet_pton(AF_INET, argv[1], (void *)&sin.sin_addr) != 1) {perror("inet_pton");exit(1);}
#endif	printf("UDP client started!\n");char buf[BUFSIZ];while(1) {fprintf(stderr,"pls input string:");bzero(buf, BUFSIZ);if( fgets(buf, BUFSIZ-1, stdin) ==NULL) {perror("fgets");continue;}sendto(fd, buf, strlen(buf), 0, (struct sockaddr *)&sin, sizeof(sin)); if( !strncasecmp(buf, QUIT_STR, strlen(QUIT_STR))) {  //用戶輸入了quit字符printf("Client is exited!\n");break;}}close(fd);return 0;
}

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

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

相關文章

OpenSSL詳解

這里寫目錄標題 選項&#xff1a;**通用選項&#xff1a;**1. genrsa&#xff1a;生成RSA密鑰對3. req&#xff1a;生成證書簽名請求4. x509&#xff1a;生成自簽名證書 **證書管理&#xff1a;**1. verify&#xff1a;驗證證書2. x509&#xff1a;查看證書詳情3. crl&#xff…

MySQL的日志和備份

目錄 一. MySQL的日志 1.1 日志的作用 1.2 日志的分類 1.3 事務日志 1.4 錯誤日志 1.5 通用日志 1.6 慢查詢日志 1.7 二進制備份 二. 備份 2.1 數據備份的重要性 2.2 備份的分類 2.3 MySQL備份的內容 2.4 備份的注意點 2.5 備份的工具 2.6 實戰案例 2.7 mysql…

前端性能優化:如何讓網頁加載更快?

摘要 想象一下&#xff0c;滿心期待點開一個網頁&#xff0c;卻等了十幾秒還卡在加載界面&#xff0c;你是不是瞬間就想關掉走人&#xff1f;這可不是個別用戶的 “急性子”&#xff0c;數據顯示&#xff0c;網頁每多延遲 1 秒&#xff0c;用戶流失率可能增加 11%&#xff01;…

[論文閱讀]Prompt Injection attack against LLM-integrated Applications

Prompt Injection attack against LLM-integrated Applications [2306.05499] Prompt Injection attack against LLM-integrated Applications 傳統提示注入攻擊效果差&#xff0c;主要原因在于&#xff1a; 不同的應用對待用戶的輸入內容不同&#xff0c;有的將其視為問題&a…

微信小程序進階第2篇__事件類型_冒泡_非冒泡

在小程序中&#xff0c; 事件分為兩種類型&#xff1a; 冒泡事件&#xff0c; 當一個組件上的事件被觸發后&#xff0c;該事件會向父節點傳遞非冒泡事件&#xff0c; 當一個組件上的事件被觸發后&#xff0c; 該事件不會向父節點傳遞。 一 冒泡事件 tap&#xff0c; touchst…

[免費]SpringBoot+Vue在線教育(在線學習)系統(高級版)【論文+源碼+SQL腳本】

大家好&#xff0c;我是java1234_小鋒老師&#xff0c;看到一個不錯的SpringBootVue在線教育(在線學習)系統(高級版)【論文源碼SQL腳本】&#xff0c;分享下哈。 項目視頻演示 【免費】SpringBootVue在線教育(在線學習)系統(高級版) Java畢業設計_嗶哩嗶哩_bilibili 項目介紹…

TypeScript 針對 iOS 不支持 JIT 的優化策略總結

# **TypeScript 針對 iOS 不支持 JIT 的優化策略總結** 由于 iOS 的 **JavaScriptCore (JSC)** 引擎 **禁用 JIT&#xff08;Just-In-Time 編譯&#xff09;**&#xff0c;JavaScript 在 iOS 上的執行性能較差&#xff0c;尤其是涉及動態代碼時。 **TypeScript&#xff08;T…

項目部署一次記錄

鏈路&#xff1a;&#xff08;用戶&#xff09;客戶端 → Nginx:192.168.138.100→ Tomcat &#xff08;程序&#xff09;:192.168.138.101→ MySQL/Redis 打開數據庫&#xff1a;systemctl start mysqld 重啟網絡&#xff1a; systemctl restart NetworkManager 關閉防火墻&am…

C 語言學習筆記

文章目錄 程序設計入門 --- C 語言第一周 程序設計與 C 語言1 計算機與編程語言&#xff1a;計算機怎么做事情的&#xff0c;編程語言是什么&#x1f4d2; 1.1 計算機的普遍應用 —— 離了它&#xff0c;現代人可能不會“活”了**&#x1f310; 科學計算&#xff1a;計算機的“…

服務器修改/home的掛載路徑

寫在前面&#xff1a;前段時間新裝了一臺服務器&#xff0c;/home目錄原本是掛在在系統盤/dev/sda4的分區下&#xff0c;但是系統盤的空間比較小&#xff0c;為了保證后續使用起來&#xff0c;不會遇到磁盤很快就占滿的情況&#xff0c;現在需要將 /home 獨立出來&#xff0c;掛…

刷機維修進階教程-----沒有開啟usb調試 如何在鎖定機型的撥號界面特殊手段來開啟ADB

有時候我們會遇到一些機型被屏幕鎖 賬號鎖等鎖定。無法進入系統界面。也沒有開啟usb調試的情況下如何通過一些操作來開啟adb調試。然后通過adb指令來禁用對應的app順利進入系統。以此來操作保數據等操作. 通過博文了解?????? 1??????----了解一些品牌機型鎖定狀態…

虛擬文件(VFS)

核心知識點&#xff1a;虛擬文件系統&#xff08;VFS&#xff09; 1. 通俗易懂的解釋 想象一下你家里的冰箱。你把食物放進去&#xff0c;不用管它是放在塑料盒里、玻璃罐里還是直接用保鮮膜包著&#xff0c;你只需要知道它在冰箱的哪個位置&#xff08;比如“蔬菜抽屜里”&a…

前后端聯調實戰指南:Axios攔截器、CORS與JWT身份驗證全解析

前言 在現代Web開發中&#xff0c;前后端分離架構已成為主流&#xff0c;而前后端聯調則是開發過程中不可避免的關鍵環節。本文將深入探討前后端聯調中的三大核心技術&#xff1a;Axios攔截器的靈活運用、CORS跨域問題的全面解決方案以及JWT身份驗證的安全實現。通過本文&…

Postman基礎操作

1.Postman是什么&#xff1f; Postman是接口測試的工具&#xff0c;簡單來說它能模擬瀏覽器對服務器的某個接口發起請求并接收響應數據。 1.1 Postman工作原理 2.Postman發送請求 2.1 發送GET請求 我們知道GET請求是沒用請求體的&#xff0c;所以我們需要將請求參數寫在Param…

Elasticsearch Synthetic _source

_source 字段包含索引時傳入的原始 JSON 文檔體。_source 字段本身不被索引&#xff08;因此不可搜索&#xff09;&#xff0c;但會被存儲&#xff0c;以便在執行獲取請求&#xff08;如 get 或 search&#xff09;時返回。 如果磁盤使用很重要&#xff0c;可以考慮以下選項&a…

Vue3 + Element Plus 實現用戶管理模塊

本文介紹一個使用 Vue3 Element Plus 實現的用戶與小組管理模塊&#xff0c;支持用戶的增刪改查&#xff08;CRUD&#xff09;和分頁管理&#xff0c;以及小組的新增和刪除功能&#xff0c;適用于管理后臺系統中的用戶權限管理場景。 一、項目簡介 該模塊具備以下功能&#…

Python應用“面向對象”小練習

大家好!面向對象編程是一種以 “對象” 為核心的編程思想。對象可以看作是具有特定屬性和行為的實體。例如&#xff0c;一個學生可以是一個對象&#xff0c;他的屬性包括姓名和年齡&#xff0c;行為可以是打招呼。? 代碼呈現: # 定義類和對象 class Student:def __init__(sel…

線性回歸原理推導與應用(八):邏輯回歸二分類乳腺癌數據分類

乳腺癌數據是sklearn中自帶的數據集&#xff0c;需要通過相關特征對是否患有乳腺癌進行分類。 數據清洗與建模 首先加載相關庫和相關數據 from sklearn.datasets import load_breast_cancer from sklearn.linear_model import LogisticRegression import numpy as np import…

nginx的一些配置的意思

1.用這個端口可以訪問到nginx 2.工作進程&#xff0c;設置成和cpu核心數一樣即可 3.每個工作進程的最大網絡連接數。 4.主機名稱 設置反向代理時&#xff0c;把server_name設置成ip。 5.反向代理進行轉發&#xff0c;localhost指的是nginx所在的機器。 關鍵字proxy_pass。 …

SID103S/D/Q-300nA, 軌至軌, CMOS 運算放大器替代SGM8141

概述 SID103系列產品是專注于超低功耗、軌至軌、CMOS運算放大器&#xff0c;最低工作電壓可以支持到1.4V&#xff0c;并且工作時每個通道僅消耗300nA的電流。特別適合穿戴式、獨立式等對功耗敏感的電池供電場景。 SID103系列產品擁有5kHz的增益帶寬積&#xff0c;外接500pF電…