UDP客户端与服务端执行bind和connect

udp服务器使用connect()函数指明套接字的目的地址/端口号,使服务器只接受特定主机的请求;
udp服务器调用了bind()函数为服务器套接字绑定本地地址/端口,使得客户端知道发数据的目的地址/端口;

udp客户端调用connect()函数指明目的地址/端口后,可使用send()函数向目的地址发送数据;
udp客户端在发送数据之前, 用bind()函数绑定本地地址/端口, 可避免操作系统该套接字随机分配地址信息和端口号;

上代码

配置参数

#define INET_SERVER_IP_ADDR    "192.168.1.39"
#define INET_CLIENT_IP_ADDR    "192.168.1.102"#define SERVER_UDP_PORT    "9877"
#define CLIENT_UDP_PORT    "9871"#define INET_IP_ADDR_LENGTH    (16U)#define UDP_DGRAM_LEN_MAX    (1024U)
#define MSG_SEND_INTERVAL    (50000)   /* unit: us */

服务器:

void server_init(void)
{pid_t pid;siginfo_t info;int server_sockfd;struct sockaddr_in local_addr, remote_addr;/* print_addrinfo("ftp"); */   /* domain daytime stream http ftp *//*____________________________________________________________________________________________*/server_sockfd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);if(server_sockfd < 0){perror("socket() fail");exit(EXIT_FAILURE);}/* socket_set_reuseaddr(); *//*____________________________________________________________________________________________*/memset(&local_addr, 0, sizeof(local_addr));if(inet_pton(AF_INET, INET_SERVER_IP_ADDR, &(local_addr.sin_addr)) < 0){perror("inet_pton() error");close(server_sockfd);exit(EXIT_FAILURE);}else{local_addr.sin_family = AF_INET;local_addr.sin_port = htons(atol(SERVER_UDP_PORT));}if(-1 == bind(server_sockfd, (struct sockaddr *)(&local_addr), sizeof(local_addr))){perror("bind() fail");close(server_sockfd);exit(EXIT_FAILURE);}/*____________________________________________________________________________________________*/char client_addr[INET_IP_ADDR_LENGTH];int ret;char rcv_buf[UDP_DGRAM_LEN_MAX] = {'\0'};memset(&remote_addr, 0, sizeof(remote_addr));socklen_t addr_len = sizeof(remote_addr);ret = recvfrom(server_sockfd, rcv_buf, UDP_DGRAM_LEN_MAX, 0, (struct sockaddr *)&remote_addr, &addr_len);if(-1 == ret){perror("recvfrom() failure");exit(EXIT_FAILURE);}else{if(NULL == inet_ntop(AF_INET, &remote_addr.sin_addr, client_addr, INET_IP_ADDR_LENGTH)){perror("inet_ntop() error");}else{printf("Received %d Bytes From Client: %s (Port: %u)\n", ret, client_addr, ntohs(remote_addr.sin_port));printf("%s\n", rcv_buf);}}/*____________________________________________________________________________________________*/#if falseif(inet_pton(AF_INET, INET_CLIENT_IP_ADDR, &(remote_addr.sin_addr)) < 0){perror("inet_pton() error");exit(EXIT_FAILURE);}else{remote_addr.sin_family = AF_INET;remote_addr.sin_port = htons(atol(CLIENT_UDP_PORT));}#endif#ifdef SERVER_CONNECT_ENif(-1 == connect(server_sockfd, (struct sockaddr *)(&remote_addr), sizeof(remote_addr))){perror("connect() fail");close(server_sockfd);exit(EXIT_FAILURE);}else{printf("Successfully Connected To Client-Socket!\n");}/*____________________________________________________________________________________________*/char send_buf[] = {"Of course, I still love you!"};if(-1 == send(server_sockfd, send_buf, sizeof(send_buf), 0)){perror("send() fail");}#elsechar send_buf[] = {"Of course, I still love you!"};if(-1 == sendto(server_sockfd, send_buf, sizeof(send_buf), 0, (struct sockaddr *)(&remote_addr), sizeof(remote_addr))){perror("sendto() fail");}#endif/*____________________________________________________________________________________________*/sigaction_config();/*____________________________________________________________________________________________*/pid = fork();if(pid < 0){perror("fork() error");}else if(pid == 0)  /* child */{#ifdef SERVER_CONNECT_ENdgram_send(server_sockfd);#elsedgram_sendto(server_sockfd, (struct sockaddr *)(&remote_addr), sizeof(remote_addr));#endif}else  /* parent */{#ifdef SERVER_CONNECT_ENdgram_recv(server_sockfd);#elsedgram_receive(server_sockfd);#endifif(-1 == waitid(P_PID, 0, &info, WEXITED)){perror("waitid() failure");}close(server_sockfd);exit(EXIT_SUCCESS);}
}

客户端:

void client_init(void)
{pid_t pid;siginfo_t info;int client_sockfd;struct sockaddr_in local_addr, remote_addr;/*____________________________________________________________________________________________*/client_sockfd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);if(client_sockfd < 0){perror("socket() fail");exit(EXIT_FAILURE);}/*____________________________________________________________________________________________*/memset(&local_addr, 0, sizeof(local_addr));local_addr.sin_family = AF_INET;local_addr.sin_port = htons(atol(CLIENT_UDP_PORT));local_addr.sin_addr.s_addr = htonl(INADDR_ANY);if(-1 == bind(client_sockfd, (struct sockaddr *)(&local_addr), sizeof(local_addr))){perror("bind() fail");close(client_sockfd);exit(EXIT_FAILURE);}/*____________________________________________________________________________________________*/memset(&remote_addr, 0, sizeof(remote_addr));if(inet_pton(AF_INET, INET_SERVER_IP_ADDR, &(remote_addr.sin_addr)) < 0){perror("inet_pton() error");close(client_sockfd);exit(EXIT_FAILURE);}else{remote_addr.sin_family = AF_INET;remote_addr.sin_port = htons(atol(SERVER_UDP_PORT));}/*____________________________________________________________________________________________*/char send_buf[] = {"Hello World!"};int ret;ret = sendto(client_sockfd, send_buf, sizeof(send_buf), 0, (struct sockaddr *)(&remote_addr), sizeof(remote_addr));if(-1 == ret){perror("sendto() failure");close(client_sockfd);exit(EXIT_FAILURE);}else{printf("Say \"Hello\" To Server: %s With Port: %s\n", INET_SERVER_IP_ADDR, SERVER_UDP_PORT);fflush(stdout);}/*____________________________________________________________________________________________*/char server_addr[INET_IP_ADDR_LENGTH];char rcv_buf[UDP_DGRAM_LEN_MAX] = {'\0'};memset(&remote_addr, 0, sizeof(remote_addr));socklen_t addr_len = sizeof(remote_addr);ret = recvfrom(client_sockfd, rcv_buf, UDP_DGRAM_LEN_MAX, 0, (struct sockaddr *)&remote_addr, &addr_len);if(-1 == ret){perror("recvfrom() failure");exit(EXIT_FAILURE);}else{if(NULL == inet_ntop(AF_INET, &remote_addr.sin_addr, server_addr, INET_IP_ADDR_LENGTH)){perror("inet_ntop() error");}else{printf("Received %d Bytes From Server: %s (Port: %u)\n", ret, server_addr, ntohs(remote_addr.sin_port));printf("%s\n", rcv_buf);}}/*____________________________________________________________________________________________*/if(-1 == connect(client_sockfd, (struct sockaddr *)(&remote_addr), sizeof(remote_addr))){perror("connect() fail");close(client_sockfd);exit(EXIT_FAILURE);}else{printf("Successfully Connected To Server-Socket!\n");}/*____________________________________________________________________________________________*/sigaction_config();/*____________________________________________________________________________________________*/pid = fork();if(pid < 0){perror("fork() error");}else if(pid == 0)  /* child */{dgram_send(client_sockfd);}else  /* parent */{dgram_recv(client_sockfd);if(-1 == waitid(P_PID, 0, &info, WEXITED)){perror("waitid() failure");}close(client_sockfd);exit(EXIT_SUCCESS);}
}

测试:

服务端:

客户端:

参考链接:

https://blog.csdn.net/wanggao_1990/article/details/108020190

 https://blog.csdn.net/qq_29344757/article/details/71616748

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/758980.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ubuntu10.04 apache2.2开启tls1.2的支持,使现代的edge和firefox浏览器能正常访问https

最近发现自己ubuntu10.04服务器上的apache https无法通过win11上的edge和firefox浏览器访问&#xff0c;但xp下的ie6和ie8没有问题。 firefox的错误提示为“此网站可能不支持TLS 1.2协议,而这是Firefox支持的最低版本”。 经过检查发现&#xff1a; IE6访问https所需的版本是SS…

时序预测 | Matlab实现BiTCN-BiLSTM双向时间卷积神经网络结合双向长短期记忆神经网络时间序列预测

时序预测 | Matlab实现BiTCN-BiLSTM双向时间卷积神经网络结合双向长短期记忆神经网络时间序列预测 目录 时序预测 | Matlab实现BiTCN-BiLSTM双向时间卷积神经网络结合双向长短期记忆神经网络时间序列预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.Matlab实现BiTCN…

ASP .Net Core ILogger日志服务

&#x1f433;简介 ILogger日志服务是.NET平台中的一个内置服务&#xff0c;主要用于应用程序的日志记录。它提供了灵活的日志记录机制&#xff0c;允许开发者在应用程序中轻松地添加日志功能。以下是其主要特点和组件&#xff1a; ILogger接口&#xff1a;这是ILogger日志服…

【Vue】三、使用ElementUI实现图片上传

目录 一、前端代码实现 二、后端代码实现 三、调试效果实现 一、前端代码实现 废话不多说直接上代码 <el-form-item prop"image" label"上传图片" v-model"form.image"><el-upload:action"http://localhost:8…

【C语言】循环语句(语句使用建议)

文章目录 **while循环****while循环的实践****补充:if语句与while语句区别****for循环(使用频率最高)****for循环的实践****while循环和for循环的对比****Do-while循环****break和continue语句****循环的嵌套****goto语句(不常用)****循环语句的效率(来自于高质量的C/C编程书籍…

nRF Sniffer在wireshark下的环境搭建

一、准备 nRF Sinffer 安装包&#xff1a; 直接下载&#xff1a;https://nsscprodmedia.blob.core.windows.net/prod/software-and-other-downloads/desktop-software/nrf-sniffer/sw/nrf_sniffer_for_bluetooth_le_4.1.1.zip 官网下载&#xff1a; nRF Sniffer for Bluetooth…

webpack中常见的Plugin?解决了什么问题?

一、是什么 Plugin&#xff08;Plug-in&#xff09;是一种计算机应用程序&#xff0c;它和主应用程序互相交互&#xff0c;以提供特定的功能 是一种遵循一定规范的应用程序接口编写出来的程序&#xff0c;只能运行在程序规定的系统下&#xff0c;因为其需要调用原纯净系统提供…

Flask学习(五):flask中添加装饰器

一、注意装饰器函数所在的位置&#xff1a; 代码示例如下&#xff1a; from flask import Flaskapp Flask(__name__)def wapper(func):def inner(*args, **kwargs):print("执行了装饰器")return func(*args, **kwargs)return innerwapper app.route("/index1…

CTF题型 匿名函数考法例题总结

CTF题型 匿名函数考法&例题总结 文章目录 CTF题型 匿名函数考法&例题总结一 .原理分析二 .重点匿名函数利用1.create_function()如何实现create_function代码注入 2.array_map()3.call_user_func()4.call_user_func_array()5.array_filter() 三.例题讲解1.[Polar 靶场 …

【WEB3安全基建项目Secwarex】空投指南

GoPlusSecurity是WEB3安全基建项目&#xff0c;3月8日完成400万美元的私募融资&#xff0c;目前总融资已经高达1500万美元&#xff0c;其中包括Binance Labs、Huobi Incubator、Kucoin Ventures、Avalanche等知名机构参投。 1、打开网址&#xff1a;secwarex.io&#xff0c;点…

【考研数学】武忠祥全年各阶段用书搭配

正常来说&#xff0c;你已经跟了武忠祥老师&#xff0c;那武老师的高数辅导讲义和严选题&#xff0c;应该你都有入手了&#xff0c;这个时候你再加一本1800&#xff0c;如何能够保证有充分的时间&#xff0c;将这些习题册做透&#xff0c;将它们的最大作用发挥出来呢&#xff0…

【C++】仿函数优先级队列反向迭代器

目录 一、优先级队列 1、priority_queue 的介绍 2、priority_queue 的使用 3、 priority_queue 的模拟实现 1&#xff09;priority_queue()/priority_queue(first, last) 2&#xff09;push&#xff08;x&#xff09; 3&#xff09;pop&#xff08;&#xff09; 4&#…

Vue+Element-UI Table表格实现复选框单选效果(隐藏表头上的全选Checkbox)

实现效果 完整代码 <div class"box-pos"><el-table ref"table" :header-cell-style"{ color: #FFF, background: #333 }":cell-style"{ color: #FFF, background: #333 }" :data"grListData" style"width: 1…

前端知识点03(JS)

文章目录 前端知识点03&#xff08;JS&#xff09;1、JS中this指向问题2、script中的async和defer的区别3、setTimeOut和setInterval4、Es6和ES5的区别5、ES6的新特性 &#x1f389;写在最后 前端知识点03&#xff08;JS&#xff09; hello hello~ &#xff0c;这里是 code袁~&…

python日常刷题(一)

前言&#xff1a;本文记录2024年3月11日至2024年3月19日牛客网所做的基础题目&#xff08;错题本&#xff09;&#xff1a; &#x1f3ac;个人简介&#xff1a;努力学习ing &#x1f4cb;本专栏&#xff1a;python日常刷题 &#x1f380;CSDN主页&#xff1a;愚润求学 文章目录…

软件的安装与卸载(YUM)

YUM&#xff1a;yum 是一个方便的"应用商店"&#xff0c;你可以通过它轻松地安装、更新和删除软件包&#xff0c;就像从应用商店中下载和安装应用程序一样。&#xff08;这个得用root身份&#xff0c;普通用户权限不够&#xff09; 常用命令&#xff1a; 1.安装软件…

7.安全性基础知识

主要议题&#xff1a; 安全防护体系&#xff1a;7层次&#xff0c;要记7层次的名称以及这些层次与哪些方面相关&#xff1b; 安全保护等级&#xff1a;5等级&#xff0c;要记5等级安全性的高低排序&#xff0c;掌握每个等级的特点&#xff1b; 用户认证机制&#xff1a;用户认…

python网络爬虫实战教学——urllib的使用(2)

文章目录 专栏导读1、前言2、URLError3、HTTPError4、urlparse5、urlunparse 专栏导读 ✍ 作者简介&#xff1a;i阿极&#xff0c;CSDN 数据分析领域优质创作者&#xff0c;专注于分享python数据分析领域知识。 ✍ 本文录入于《python网络爬虫实战教学》&#xff0c;本专栏针对…

第1章 数据管理

思维导图 1.1 引言 从数据中获取的价值不可能凭空产生或依赖于偶然&#xff0c;需要有目标、规划、协作、和保障&#xff0c;也需要管理和领导力。定义&#xff1a; 数据管理是为了交付、控制、保护并提升数据和信息资产的价值&#xff0c;在其整个生命周期中制定计划、制度、…

【Web】浅聊Hessian反序列化原生jdk利用与高版本限制绕过

目录 前言 原理分析 EXP Hessian2 低版本 直接Runtime命令执行 Hessian2 高版本 利用Unsafe加载恶意字节码二次调用触发初始化 利用TemplatesImpl实例化恶意类 jdk高版本打JNDI 前文&#xff1a;【Web】浅聊Hessian异常toString姿势学习&复现 前言 上篇文章介绍…