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

linux网络编程之UDP编程

linux网络编程之UDP编程

  • UDP编程模型
      • 服务端
      • 客户端
    • tcp与udp的区别

UDP编程模型

服务端

1.创建socket
2.构建服务器协议地址簇
3.绑定
4. 通信

sendto(多了两个参数) == send + connect

#include <stdio.h>
#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>
#include <netinet/in.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
#include <signal.h>
#include <arpa/inet.h>

int main(){
	//1. 创建socket 		
	int serverFd = socket(AF_INET,SOCK_DGRAM,0);
	if(-1  ==  serverFd) printf("创建socket失败:%m\n"),exit(-1);
	printf("创建socket成功!\n");				
	//2. 构建服务器协议地址族	
	struct sockaddr_in  addr = {0};
	addr.sin_family =   AF_INET;//和socket函数第一个参数一致
	addr.sin_addr.s_addr = inet_addr("192.168.249.135");//把字符串转成整型
	addr.sin_port = htons(9999);//端口号			
	//3. 绑定
	int r = bind(serverFd,(struct sockaddr*)&addr,sizeof addr);
	if(-1  ==  r) printf("绑定失败:%m\n"),close(serverFd),exit(-1);
	printf("绑定成功!\n");	
	//4. 通信
	char buff[256];

	//用来存储客户端协议地址族
	struct sockaddr_in  cAddr = {0};
	int cLen = sizeof cAddr;
	while(1){
		r = recvfrom(serverFd,buff,255,0,
		(struct sockaddr*)&cAddr,&cLen);//和read一样
		if(r>0){
			buff[r] = 0;//添加'\0'
			printf("客户端%s发来的数据>>%s\n",
				inet_ntoa(cAddr.sin_addr),buff);

			sendto(serverFd,"妖怪,吃俺老孙一棒",
				strlen("妖怪,吃俺老孙一棒"),0,
				(struct sockaddr*)&cAddr,sizeof cAddr);
		}
	}

}

客户端

1.创建socket
2.获取服务器协议地址簇
3,通信
recvform(多了两个参数) == recv + accept

#include <stdio.h>
#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>
#include <netinet/in.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
#include <signal.h>
#include <arpa/inet.h>

int main(){
	//1. 创建socket 		
	int serverFd = socket(AF_INET,SOCK_DGRAM,0);
	if(-1  ==  serverFd) printf("创建socket失败:%m\n"),exit(-1);
	printf("创建socket成功!\n");				
	//2. 构建服务器协议地址族	
	struct sockaddr_in  addr = {0};
	addr.sin_family =   AF_INET;//和socket函数第一个参数一致
	addr.sin_addr.s_addr = inet_addr("192.168.249.135");//把字符串转成整型
	addr.sin_port = htons(9999);//端口号			
	//3. 通信
	char buff[256];
	int r;
	char temp[256];
	int len = sizeof addr;
	while(1){
		memset(buff,0,256);
		printf("请输入>>");
		scanf("%s",buff);
		r = sendto(serverFd,buff,strlen(buff),0,
			(struct sockaddr*)&addr,sizeof addr);
		printf("r:%d\n",r);

		r = recvfrom(serverFd,temp,255,0,
			(struct sockaddr*)&addr,&len);
		if(r > 0){
			temp[r] = 0;
			printf("服务器说:%s\n",temp);
		}
	}



}

tcp与udp的区别

1.tcp有连接 udp没有连接
2.tcp数据流, udp数据报文
3. tcp 数据有边界 , udp数据无边界
4. tcp数据有序, udp数据无序
5.tcp安全 稳定 可靠 udp不安全
安全: 相对不容易被窃取
稳定:传输速率变化
可靠:是否一定能收到
6. tcp相对慢很多,udp传输速度快
7.tcp有中心(服务器) udp没有


http://www.kler.cn/a/148858.html

相关文章:

  • 轮转数组
  • 万字长文解读深度学习——生成对抗网络GAN
  • 动态规划问题-删除并获得点数(Java实现)
  • RabbitMQ高效的消息队列中间件原理及实践
  • Diffusion Policy——斯坦福机器人UMI所用的扩散策略:从原理到其编码实现(含Diff-Control、ControlNet详解)
  • 数字后端教程之Innovus report_property和get_property使用方法及应用案例
  • 详细讲解1.js处理日期对象输出标准的“2000年12月22日 周三“ 的格式
  • 杂记 | 使用Docker安装并配置MongoDB以支持事务(单副本,并解决了证书文件错误的问题)
  • centos7.9 + gitlab12.3.0安装
  • PyQt6 QLineEdit单行文本框控件
  • 使用python提取出身份证的出生日期(18位和15位)
  • C# freesql技术 常用的增删改查sql命令
  • linux安装终端连接工具Tabby
  • DjiTello + YoloV5的无人机的抽烟检测
  • 创建Dataloader基础篇【一】
  • 拆解按摩器:有意思的按键与LED控制电路,学习借鉴一下!
  • <Linux>(极简关键、省时省力)《Linux操作系统原理分析之Linux 进程管理 9》(13)
  • IELTS学习笔记_grammar_新东方
  • 基于MBC调制方法的准Z源三相逆变器Simulink建模与仿真
  • 目标检测YOLO系列从入门到精通技术详解100篇-【目标检测】特征点检测与匹配
  • MySQL慢查询
  • Flink Flink中的合流
  • Python---lambda表达式
  • 交换机的VRRP主备配置例子
  • 计网Lesson3 - 计算机网络评价指标与封包解包
  • 别再让假的fiddler教程毒害你了,来看这套最全最新的fiddler全工具讲解