文章目录

  • 前言
  • 一、udp编程相关函数
    • 1、socket函数
    • 2、bind函数
    • 3、sendto函数
    • 4、recvfrom函数
    • 5、close函数
  • 二、实际案例
  • 总结

前言

1、UDP通信协议,服务器端和客户端无需建立连接,只需要知道对方套接字的地址信息就可以发送数据
2、UDP通信流程图:

一、udp编程相关函数

1、socket函数

功能:创建套接字并返回套接字描述符

头文件:
#include<sys/socket.h>
函数原型:
int socket(int family,int type,int protocol)
参数:
family:协议族AF_INET:IPv4协议AF_INET6:IPv6协议
type:套接字类型SOCK_STREAM:流式套接字(tcp)SOCK_DGRAM:数据报套接字(udp)
protocol:0
返回值:
非负套接字描述符

2、bind函数

功能:将套接字与IP地址和端口号绑定

头文件:
#include<sys/socket.h>
函数原型:
int bind(int sockfd,(struct sockaddr *)my_addr,int addrlen)
参数:
sockfd:套接字描述符
my_addr:绑定的地址
addrlen:地址长度

3、sendto函数

功能:发送数据

头文件:
#include<sys/socket.h>
函数原型:
int send(int sockfd,const void *buf,int len,int flags,const struct sockaddr *to,int tolen);
参数:
sockfd:套接字描述符
buf:发送缓存区的地址
len:发送数据的长度
flags:一般为0
to:接收方套接字的ip地址和端口号
tolen:地址长度
返回值:
实际发送的字节数

4、recvfrom函数

功能:接收数据

头文件:
#include<sys/socket.h>
函数原型:
int recv(int sockfd,void *buf,int len,unsigned int flags,const struct sockaddr *from,int fromlen)
参数:
sockfd:套接字描述符
buf:存放接收数据的缓存区的地址
len:接收数据的长度
flags:一般为0
from:发送方的ip地址和端口号
fromlen:地址长度
返回值:
实际接收的字节数

5、close函数

功能:关闭套接字

头文件:
#include<sys/socket.h>
函数原型:
int close(int sockfd)
参数:
sockfd:套接字描述符

二、实际案例

1、代码功能:两个进程可以相互收发数据
2、实现需要开启两个终端,同时运行相同的代码,一端发送,一端接收

#include <arpa/inet.h>
#include <sys/socket.h>
#include <pthread.h>
#include <stdio.h>
struct sockaddr_in my_addr;//定义本段代码套接字
struct sockaddr_in to_addr;//定义另一端代码套接字
int fd;//定义套接字描述符
void *send_fun(void *p)//处理发送功能的线程函数
{char buf[100] = { 0 };while(1){gets(buf);//输入字符串sendto(fd, buf, 100, 0, (struct sockaddr*)&to_addr, 16);//发送数据}
}
int main(int argc, char *argv[])
{pthread_t id;//线程idfd = socket(AF_INET, SOCK_DGRAM, 0);//套接字fd赋值my_addr.sin_family = AF_INET;my_addr.sin_port = htons(atoi(argv[3]));   //argv[3] 自己的端口号  9999my_addr.sin_addr.s_addr = htonl(INADDR_ANY); //inet_addr("192.168.31.252");  INADDR_ANY 得到当前计算机的ip地址bind(fd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr));//绑定自己的ip地址和端口号to_addr.sin_family = AF_INET;to_addr.sin_port = htons(atoi(argv[2]));  //argv[2]对方的端口号  8888to_addr.sin_addr.s_addr = inet_addr(argv[1]); //argv[1]对方的ip地址  127.0.0.1pthread_create(&id, NULL, send_fun,NULL);//创建线程while(1){char buf[100];int len = 16;recvfrom(fd, buf, 100, 0, (struct sockaddr *)&to_addr, &len);//接收数据printf("from %d:%s\n", ntohs(to_addr.sin_port), buf);//输出对方的IP地址和端口号}
}

结果展示
可以实现相互发送数据的两端:
1、127.0.0.1是环回地址
2、8888和9999是两端套接字地址的端口号

总结

1、UDP通信是不可靠的,其中一点是没有建立连接机制,使用ip地址进行数据的传输
2、UDP和TCP主要在于sendto和recvfrom两个函数,这两个函数参数包括了对方的ip地址和端口号,这点与TCP通信区别较大

Linux网络编程——UDP编程相关推荐

  1. 菜鸟学习笔记:Java提升篇10(网络2——UDP编程、TCPSocket通信、聊天室案例)

    菜鸟学习笔记:Java提升篇10(网络2--UDP编程.TCPSocket通信) UDP编程 TCP编程(Socket通信) 单个客户端的连接 多个客户端的连接(聊天室案例) UDP编程 在上一篇中讲 ...

  2. linux下java基于UDP编程聊天_基于Linux下的UDP编程

    一. Linux下UDP编程框架 使用UDP进行程序设计可以分为客户端和服务器端两部分. 1.服务器端程序包括: ? 建立套接字 ? 将套接字地址结构进行绑定 ? 读写数据 ? 关闭套接字 2.客户端 ...

  3. Linux网络原理与编程——第十一节 网络基础及套接字

    目录 一.网络的层状划分结构 二.网络发展史 三.协议 四.OSI七层结构模型 五.TCP/IP四层(五层)协议结构模型 六.局域网中通信原理初识 封包.解包.分用.mac帧 七.跨网络通信原理初始 ...

  4. Java网络编程UDP编程

    一. 简单先介绍一下网络编程 1. 概念 : 通过网络IP连接起来,实现网络通信,数据传输的操作,就是网络编程 2. 实现 : 目前来说当前主要有两种实现的方法,TCP和UDP: 其中TCP需要划分客 ...

  5. [linux] Linux网络之Socket编程入门

    目录 1. 前言 2. 网络基础 2.1 协议 2.1.1 TCP和UDP协议 2.2 网络的层状结构 2.3 一台主机向另一台主机的发送数据的流向 2.4 IP和MAC地址 2.5 端口 2.6 网 ...

  6. 网络编程——TCP网络编程UDP编程

    1.计算机网络:将分布在不同区域不同地方的多台计算机和网络设备通过线程连接起来组成一套大型系统,来实现计算机之间的信息传递和资源共享的设备. 2.网络编程:编写一个程序来实现网络间信息传递. 网络编程 ...

  7. Java TCP/UDP编程

    java TCP & UDP编程 UDP编程 TCP编程 UDP编程 UPD: User Datagram Protocol.面向无连接,不安全. UDP中,发送方无需知道接收方是否接受,只考 ...

  8. 6、linux网络编程--UDP协议编程

    一.概述: UDP 是 User Datagram Protocol 的简称, 中文名是用户数据报协议,是一个简单的面向数据报的运输层协议,在网络中用于处理数据包,是一种无连接的协议.UDP 不提供可 ...

  9. 基于UDP客户端服务器的编程模型-linux网络编程

    坚持在代码中注释,边读代码边学习Linux网络编程 使用到的发送函数原型: #include <sys/types.h>#include <sys/socket.h>ssize ...

  10. 【Linux网络编程】循环服务器之UDP循环模型

    00. 目录 文章目录 00. 目录 01. 概述 02. UDP循环服务器的实现方法 03. UDP循环服务器模型 04. UDP循环服务器实现 05. 附录 01. 概述 服务器设计技术有很多,按 ...

最新文章

  1. linux项目课程设计,LINUX课程设计项目需求解析.doc
  2. 【Python】matplotlib.pyplot 标题换行
  3. Object类Objects类总结
  4. Android之 Fragment
  5. Vue组件通信原理剖析(二)全局状态管理Vuex
  6. css3-6 表格如何设置样式和定位样式是什么
  7. Codeforces Global Round 15 (A-D)没有C
  8. linux 普通用户touch权限不够_Linux 开启指令
  9. matlab 28m35,F28M35M22C
  10. pyqt5获取显示器的分辨率
  11. jQuery密码强度校验
  12. web导出excel文件的几种方法(转)
  13. WES7 定制界面完整过程(去除所有windows标识)
  14. Google街景下载
  15. cAdvisor资源监控工具入门
  16. CAD二次开发--自动加载插件
  17. 基础平台项目之树形菜单权限配置实现
  18. Qos报文分类和标记原理与实验
  19. APICloud入门初体验
  20. APP 跳转微信小程序和回调

热门文章

  1. 线性代数笔记5——平面方程与矩阵
  2. 目标跟踪 SiamFC++ (Towards Robust and Accurate Visual Tracking with Target Estimation Guidelines)
  3. win10下安装 迅雷精简版,提示阻止此应用
  4. 转接口IC ADV7280/ADV7280-M:CVBS转MIPI芯片 10位、4倍过采样标清电视视频解码器,支持去隔行
  5. 关关php采集插件,推荐使用:关关采集器(杰奇全版本通用编码版)v3.5.00
  6. win7 64位系统epson LQ630k 不打印的问题解决方法
  7. IDA Pro、OllyDbg、LordPE和UltraEdit简单实用实验
  8. 【Eclipse使用教程】Java导包快捷键
  9. Cool_gamesetup.exe山寨版熊猫烧香病毒
  10. 处理minidump文件用到的“工具”的分享