当前位置: 首页 > news >正文

网络通信(基于UDP协议的Socket编程模型)

       

被接收者需要完成的任务(服务端):
1、创建socket内核对象,内核创建完成后会返回它的描述符
    type:SOCK_DGRAM
2、准备本机地址(ip地址+端口号)
3、绑定(把本机地址与socket对象进行绑定)

for(;;)
{
    4、接收请求,同时接收发送者的地址
    5、返回结果,按发送者的地址进行返回
}
6、关闭Socket对象

发送者需要完成的任务:
1、创建socket内核对象,内核创建完成后会返回它的描述符
    type:SOCK_DGRAM
2、准备接收者的地址(ip地址+端口号)

for(;;)
{
    3、发送请求,根据接收者的地址发送数据
    4、接收结果,并接收返回者的地址
}
5、关闭Socket对象
 

size_t sendto(int sockfd, const void *buf, size_t len, int flags,const struct sockaddr *dest_addr, socklen_t addrlen);
功能:UDP专用的数据发送函数。
dest_addr:收件人的地址。
addrlen:地址长度。ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,struct sockaddr *src_addr, socklen_t *addrlen);
功能:UDP专用的数据接收函数。
src_addr:发件人的地址,也是数据返回时的地址
addrlen:地址长度,既是输入也是输出

服务端:
 

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>int main(int argc,const char* argv[])
{int sockfd = socket(AF_INET,SOCK_DGRAM,0);if(0 > sockfd){perror("socket");return -1;}struct sockaddr_in addr;addr.sin_family = AF_INET;addr.sin_port = htons(3344);addr.sin_addr.s_addr = inet_addr("10.0.2.15");socklen_t addrlen = sizeof(addr);if(bind(sockfd,(struct sockaddr*)&addr,addrlen)){perror("bind");return -2;}char buf[BUFSIZ];for(;;){int ret = recvfrom(sockfd,buf,BUFSIZ,0,(struct sockaddr*)&addr,&addrlen);if(0 >= ret)break;printf("recv:%s byte:%d from:%s:%hu\n",buf,ret,inet_ntoa(addr.sin_addr),ntohs(addr.sin_port));strcat(buf,",return!");ret = sendto(sockfd,buf,strlen(buf)+1,0,(struct sockaddr*)&addr,addrlen);if(0 >= ret)break;}printf("通信结束!\n");close(sockfd);return 0;
}

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>int main(int argc,const char* argv[])
{int sockfd = socket(AF_INET,SOCK_DGRAM,0);if(0 > sockfd){perror("socket");return -1;}	struct sockaddr_in addr;addr.sin_family = AF_INET;addr.sin_port = htons(3344);addr.sin_addr.s_addr = inet_addr("10.0.2.15");socklen_t addrlen = sizeof(addr);if(connect(sockfd,(struct sockaddr*)&addr,addrlen)){perror("connect");return -2;}char buf[BUFSIZ];for(;;){printf(">>>");scanf("%s",buf);//int ret = sendto(sockfd,buf,strlen(buf)+1,0,//		(struct sockaddr*)&addr,addrlen);int ret = send(sockfd,buf,strlen(buf)+1,0);if(0 >= ret || !strcmp("quit",buf))break;// ret = recvfrom(sockfd,buf,BUFSIZ,0,//		(struct sockaddr*)&addr,&addrlen);ret = recv(sockfd,buf,BUFSIZ,0);if(0 >= ret)break;printf("recv:%s byte:%d from:%s:%hu\n",buf,ret,inet_ntoa(addr.sin_addr),ntohs(addr.sin_port));}printf("通信结束!\n");close(sockfd);return 0;
}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 全球海事航行通告解析辅助决策系统
  • 【概率统计】三扇门游戏(蒙提霍尔问题)
  • 重启人生计划-积蓄星火
  • keepalived高可用集群
  • 【Pytorch实用教程】Pytorch中加载数据推荐实用:Dataset类
  • 【C++语言】list的构造函数与迭代器
  • 使用flask遇到的问题及解决方法
  • 软考又变了!4大科目同时换教材,备考如何适应?
  • Scratch跑酷引擎1.0! Scratch教程3
  • LabVIEW光纤管道泄漏检测系统
  • 6.7分不降反升的IEEE trans:“江湖地位”超稳的1区,离TOP还有多远?
  • 线上研讨会 | CATIA助力AI提升汽车造型设计
  • Install pytorch 使用 torch 的例子
  • javaFx程序找不到加载Thread线程类的解决方法
  • Linux:进程控制
  • 「面试题」如何实现一个圣杯布局?
  • 2018以太坊智能合约编程语言solidity的最佳IDEs
  • Druid 在有赞的实践
  • extract-text-webpack-plugin用法
  • Javascripit类型转换比较那点事儿,双等号(==)
  • JS正则表达式精简教程(JavaScript RegExp 对象)
  • LeetCode算法系列_0891_子序列宽度之和
  • 百度贴吧爬虫node+vue baidu_tieba_crawler
  • 机器学习中为什么要做归一化normalization
  • 利用DataURL技术在网页上显示图片
  • 聊聊flink的BlobWriter
  • 面试总结JavaScript篇
  • 让你成为前端,后端或全栈开发程序员的进阶指南,一门学到老的技术
  • 如何设计一个微型分布式架构?
  • [Shell 脚本] 备份网站文件至OSS服务(纯shell脚本无sdk) ...
  • 进程与线程(三)——进程/线程间通信
  • ​【原创】基于SSM的酒店预约管理系统(酒店管理系统毕业设计)
  • ​决定德拉瓦州地区版图的关键历史事件
  • # SpringBoot 如何让指定的Bean先加载
  • # Swust 12th acm 邀请赛# [ E ] 01 String [题解]
  • #大学#套接字
  • #单片机(TB6600驱动42步进电机)
  • #微信小程序:微信小程序常见的配置传旨
  • #我与Java虚拟机的故事#连载17:我的Java技术水平有了一个本质的提升
  • (MIT博士)林达华老师-概率模型与计算机视觉”
  • (MTK)java文件添加简单接口并配置相应的SELinux avc 权限笔记2
  • (PADS学习)第二章:原理图绘制 第一部分
  • (Redis使用系列) Springboot 使用redis实现接口幂等性拦截 十一
  • (不用互三)AI绘画:科技赋能艺术的崭新时代
  • (二)原生js案例之数码时钟计时
  • (附源码)c#+winform实现远程开机(广域网可用)
  • (附源码)spring boot校园健康监测管理系统 毕业设计 151047
  • (十)Flink Table API 和 SQL 基本概念
  • (四)Android布局类型(线性布局LinearLayout)
  • (淘宝无限适配)手机端rem布局详解(转载非原创)
  • .[hudsonL@cock.li].mkp勒索加密数据库完美恢复---惜分飞
  • .net core 连接数据库,通过数据库生成Modell
  • .NET Core、DNX、DNU、DNVM、MVC6学习资料
  • .net操作Excel出错解决
  • .net专家(张羿专栏)