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

(一)UDP基本编程步骤

UDP服务端编程分5步:

1.创建 UDP socket套接字,用socket函数。

2.设置socket的属性,用setsockopt()函数,(可选)

3.往socket绑定包含 IP信息,地址信息的 struct sockaddr_in(IPv4)结构体。用bind()函数

4.循环接收消息,用recvfrom()函数

5.关闭socket套接字

UDP客户端编程分:

1.创建 UDP socket套接字,用socket函数。

2.用sendto()函数往指定的IP,地址发送信息。

UDP的发送函数sendto()和接收函数 recvfrom():

1.sendto():

int ret = recvfrom(int sockfd,void *buf,size_t len,0, struct sockaddr *to , int fromlen);

第一个参数为服务端的udp监听套接字

第二个参数为发送数据的缓冲区

第三个参数为缓存区的大小

第四个参数一般为0;

第五个参数一般为:记录地址信息,ip信息的结构体 。

第六个参数为:第五个参数的大小。

返回值:成功返回实际发送出去的信息的字节数,失败返回-1

2.recvfrom():

int ret = recvfrom(int sockfd,void *buf,size_t len,0, struct sockaddr *from,socket_t *fromlen);

第一个参数为服务端的udp监听套接字

第二个参数为接收数据的缓冲区

第三个参数为缓存区的大小

第四个参数一般为0;

第五个参数一般为:记录地址信息,ip信息的结构体 。

第六个参数为:第五个参数的大小,取地址。

返回值:成功返回接收到的信息的字节数,失败返回-1

头文件:

#ifndef _MYHEAD_H_
#define _MYHEAD_H_

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <strings.h>
#include <unistd.h>
#include <errno.h>
#include <sys/stat.h>
#include <dirent.h>
#include <sys/mman.h>
#include <sys/wait.h>
#include <signal.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/msg.h>
#include <sys/sem.h>
#include <pthread.h>
#include <semaphore.h>
#include <poll.h>
#include <sys/epoll.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netinet/in.h>


#endif

服务端:

#include"myhead.h"
char rbuf[50];

int main()
{
	int sockfd;
	int size;
	int ret;
	int on =1;
	struct sockaddr_in saddr;
	struct sockaddr_in raddr;

	//设置地址信息,ip信息
	size = sizeof(struct sockaddr_in);
	bzero(&saddr,size);
	saddr.sin_family = AF_INET;
	saddr.sin_port = htons(8888);
	saddr.sin_addr.s_addr = htonl(INADDR_ANY);

	//创建udp 的套接字
	sockfd = socket(AF_INET,SOCK_DGRAM,0);
	if(sockfd<0)
	{
		perror("socket failed");
		return -1;
	}

	//设置端口复用
	setsockopt(sockfd,SOL_SOCKET,SO_REUSEADDR,&on,sizeof(on)); 

	//绑定地址信息,ip信息
	ret = bind(sockfd,(struct sockaddr*)&saddr,sizeof(struct sockaddr));
	if(ret<0)
	{
		perror("sbind failed");
		return -1;
	}

	int val = sizeof(struct sockaddr);
	//循环接收客户端发来的消息
	while(1)
	{
		puts("waiting data");
		ret=recvfrom(sockfd,rbuf,50,0,(struct sockaddr*)&raddr,&val);
		if(ret <0)
		{
			perror("recvfrom failed");
		}

		printf("the data :%s
",rbuf);
		bzero(rbuf,50);
	}
	//关闭udp套接字,这里不可达的。
	close(sockfd);
	return 0;
}

客户端:

#include"myhead.h"
char wbuf[50];

int main()
{
	int sockfd;
	int size,on = 1;
	struct sockaddr_in saddr;
	int ret;

	size = sizeof(struct sockaddr_in);
	bzero(&saddr,size);

	//设置地址信息,ip信息
	saddr.sin_family = AF_INET;
	saddr.sin_port = htons(8888);
	saddr.sin_addr.s_addr = inet_addr("192.168.152.128");//192.168.152.128为服务端所在的ip,由于本代码是本机测试,所以写的是自己的ip

	//创建udp 的套接字
	sockfd= socket(AF_INET,SOCK_DGRAM,0);
	if(sockfd<0)
	{
		perror("failed socket");
		return -1;
	}
	//设置端口复用
	setsockopt(sockfd,SOL_SOCKET,SO_REUSEADDR,&on,sizeof(on));

	//循环发送信息给服务端
	while(1)
	{
		puts("please enter data:");
		scanf("%s",wbuf);
		ret=sendto(sockfd,wbuf,50,0,(struct sockaddr*)&saddr,
			sizeof(struct sockaddr));
		if(ret<0)
		{
			perror("sendto failed");
		}

		bzero(wbuf,50);
	}
	close(sockfd);
	return 0;
}

相关文章:

  • (附源码)spring boot公选课在线选课系统 毕业设计 142011
  • 新作文杂志新作文杂志社新作文编辑部2022年第8期目录
  • d的nan讨论4
  • Python 运算符和表达式
  • 【LeetCode】2022 8月 每日一题
  • AcWing-1-递归实现指数型枚举
  • 易基因|文献科普:DNA甲基化测序揭示DNMT3a在调控T细胞同种异体反应中的关键作用
  • 基于springboot小型车队管理系统毕业设计源码061709
  • 大数据ClickHouse进阶(一):ClickHouse使用场景和集群安装
  • js面向对象之封装,继承,多态,类的详解
  • 永久免费H5直播点播播放器SkeyeWebPlayer.js实现webrtc流播放
  • JavaScript-HelloWorld、浏览器控制台使用、数据类型
  • Centos部署Docker
  • 视频剪辑教程自学技巧:关于正确的短视频剪辑流程分享
  • 30、三维表面重建-Convolutional Occupancy Network
  • ES6指北【2】—— 箭头函数
  • 收藏网友的 源程序下载网
  • Java深入 - 深入理解Java集合
  • java正则表式的使用
  • js正则,这点儿就够用了
  • KMP算法及优化
  • Linux CTF 逆向入门
  • RxJS 实现摩斯密码(Morse) 【内附脑图】
  • springboot_database项目介绍
  • 百度小程序遇到的问题
  • 成为一名优秀的Developer的书单
  • 纯 javascript 半自动式下滑一定高度,导航栏固定
  • 高度不固定时垂直居中
  • 模仿 Go Sort 排序接口实现的自定义排序
  • 排序(1):冒泡排序
  • 巧用 TypeScript (一)
  • “十年磨一剑”--有赞的HBase平台实践和应用之路 ...
  • Java性能优化之JVM GC(垃圾回收机制)
  • ​​​​​​​Installing ROS on the Raspberry Pi
  • ​一文看懂数据清洗:缺失值、异常值和重复值的处理
  • # 数论-逆元
  • $HTTP_POST_VARS['']和$_POST['']的区别
  • (二)学习JVM —— 垃圾回收机制
  • (附源码)spring boot基于小程序酒店疫情系统 毕业设计 091931
  • (附源码)计算机毕业设计ssm基于Internet快递柜管理系统
  • (十二)python网络爬虫(理论+实战)——实战:使用BeautfulSoup解析baidu热搜新闻数据
  • (新)网络工程师考点串讲与真题详解
  • (转)关于pipe()的详细解析
  • .“空心村”成因分析及解决对策122344
  • .Net 中Partitioner static与dynamic的性能对比
  • .net 逐行读取大文本文件_如何使用 Java 灵活读取 Excel 内容 ?
  • .NET精简框架的“无法找到资源程序集”异常释疑
  • ::前边啥也没有
  • @ 代码随想录算法训练营第8周(C语言)|Day57(动态规划)
  • @property @synthesize @dynamic 及相关属性作用探究
  • [ Linux Audio 篇 ] 音频开发入门基础知识
  • [100天算法】-实现 strStr()(day 52)
  • [AutoSar]工程中的cpuload陷阱(三)测试
  • [c#基础]值类型和引用类型的Equals,==的区别
  • [ExtJS5学习笔记]第三十节 sencha extjs 5表格gridpanel分组汇总