LinuxGod.net
Linux大神网——精选每一篇高品质的技术干货
  1. 首页
  2. 开源快讯
  3. 正文

udpsocket编程1.UDP编程框架常用函数小插曲

2022年12月22日 159点热度

一、基本的udp socket编程1. UDP编程框架

c socket通信_linux使用socket通信_c socket 通信

2. UDP程序设计常用函数

#include           
#include 
int socket(int domain, int type, int protocol);

参数domain:用于设置网络通信的域,socket根据这个参数选择信息协议的族
Name                                     Purpose                         
AF_UNIX, AF_LOCAL          Local communication              
AF_INET                           IPv4 Internet protocols          //用于IPV4
AF_INET6                         IPv6 Internet protocols          //用于IPV6
AF_IPX                             IPX - Novell protocols
AF_NETLINK                     Kernel user interface device     
AF_X25                            ITU-T X.25 / ISO-8208 protocol   
AF_AX25                          Amateur radio AX.25 protocol
AF_ATMPVC                      Access to raw ATM PVCs
AF_APPLETALK                 AppleTalk                        
AF_PACKET                      Low level packet interface       
AF_ALG                           Interface to kernel crypto API

小插曲:PF_XXX和AF_XXXSOCK_STREAMProvides sequenced, reliable, two-way, connection-based byte streams. //用于TCPSOCK_DGRAMSupports datagrams (connectionless, unreliable messages ). //用于UDPSOCK_RAWProvides raw network protocol access. //RAW类型,用于提供原始网络访问

#include 
#include 
ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,
              const struct sockaddr *dest_addr, socklen_t addrlen);

第一个参数sockfd:正在监听端口的套接口文件描述符鸟哥的linux私房菜,通过socket获得第二个参数buf:发送缓冲区,往往是使用者定义的数组,该数组装有要发送的数据第三个参数len:发送缓冲区的大小,单位是字节第四个参数flags:填0即可第五个参数dest_addr:指向接收数据的主机地址信息的结构体,也就是该参数指定数据要发送到哪个主机哪个进程第六个参数addrlen:表示第五个参数所指向内容的长度

#include 
#include 
ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,
                struct sockaddr *src_addr, socklen_t *addrlen);

第一个参数sockfd:正在监听端口的套接口文件描述符,通过socket获得第二个参数buf:接收缓冲区,往往是使用者定义的数组,该数组装有接收到的数据第三个参数len:接收缓冲区的大小,单位是字节第四个参数flags:填0即可第五个参数src_addr:指向发送数据的主机地址信息的结构体,也就是我们可以从该参数获取到数据是谁发出的第六个参数addrlen:表示第五个参数所指向内容的长度

#include 
#include 
int bind(int sockfd, const struct sockaddr* my_addr, socklen_t addrlen);

c socket通信_linux使用socket通信_c socket 通信

第一个参数sockfd:正在监听端口的套接口文件描述符linux使用socket通信,通过socket获得第二个参数my_addr:需要绑定的IP和端口第三个参数addrlen:my_addr的结构体的大小

#include 
int close(int fd);

3. 搭建UDP通信框架

server:

 1 #include 
 2 #include 
 3 #include 
 4 #include 
 5 #include 
 6 
 7 #define SERVER_PORT 8888
 8 #define BUFF_LEN 1024
 9 
10 void handle_udp_msg(int fd)
11 {
12     char buf[BUFF_LEN];  //接收缓冲区,1024字节
13     socklen_t len;
14     int count;
15     struct sockaddr_in clent_addr;  //clent_addr用于记录发送方的地址信息
16     while(1)
17     {
18         memset(buf, 0, BUFF_LEN);
19         len = sizeof(clent_addr);
20         count = recvfrom(fd, buf, BUFF_LEN, 0, (struct sockaddr*)&clent_addr, &len);  //recvfrom是拥塞函数,没有数据就一直拥塞
21         if(count == -1)
22         {
23             printf("recieve data fail!n");
24             return;
25         }
26         printf("client:%sn",buf);  //打印client发过来的信息

c socket 通信_c socket通信_linux使用socket通信

27 memset(buf, 0, BUFF_LEN); 28 sprintf(buf, "I have recieved %d bytes data!n", count); //回复client 29 printf("server:%sn",buf); //打印自己发送的信息给 30 sendto(fd, buf, BUFF_LEN, 0, (struct sockaddr*)&clent_addr, len); //发送信息给client,注意使用了clent_addr结构体指针 31 32 } 33 } 34 35 36 /* 37 server: 38 socket-->bind-->recvfrom-->sendto-->close 39 */ 40 41 int main(int argc, char* argv[]) 42 { 43 int server_fd, ret; 44 struct sockaddr_in ser_addr; 45 46 server_fd = socket(AF_INET, SOCK_DGRAM, 0); //AF_INET:IPV4;SOCK_DGRAM:UDP 47 if(server_fd < 0) 48 { 49 printf("create socket fail!n"); 50 return -1; 51 } 52 53 memset(&ser_addr, 0, sizeof(ser_addr)); 54 ser_addr.sin_family = AF_INET; 55 ser_addr.sin_addr.s_addr = htonl(INADDR_ANY); //IP地址,需要进行网络序转换,INADDR_ANY:本地地址 56 ser_addr.sin_port = htons(SERVER_PORT); //端口号,需要网络序转换 57

58 ret = bind(server_fd, (struct sockaddr*)&ser_addr, sizeof(ser_addr)); 59 if(ret < 0) 60 { 61 printf("socket bind fail!n"); 62 return -1; 63 } 64 65 handle_udp_msg(server_fd); //处理接收到的数据 66 67 close(server_fd); 68 return 0; 69 }

client:

 1 #include 
 2 #include 
 3 #include 
 4 #include 
 5 #include 
 6 
 7 #define SERVER_PORT 8888
 8 #define BUFF_LEN 512
 9 #define SERVER_IP "172.0.5.182"
10 
11 
12 void udp_msg_sender(int fd, struct sockaddr* dst)
13 {
14 
15     socklen_t len;
16     struct sockaddr_in src;
17     while(1)

c socket通信_c socket 通信_linux使用socket通信

18 { 19 char buf[BUFF_LEN] = "TEST UDP MSG!n"; 20 len = sizeof(*dst); 21 printf("client:%sn",buf); //打印自己发送的信息 22 sendto(fd, buf, BUFF_LEN, 0, dst, len); 23 memset(buf, 0, BUFF_LEN); 24 recvfrom(fd, buf, BUFF_LEN, 0, (struct sockaddr*)&src, &len); //接收来自server的信息 25 printf("server:%sn",buf); 26 sleep(1); //一秒发送一次消息 27 } 28 } 29 30 /* 31 client: 32 socket-->sendto-->revcfrom-->close 33 */ 34 35 int main(int argc, char* argv[]) 36 { 37 int client_fd; 38 struct sockaddr_in ser_addr; 39 40 client_fd = socket(AF_INET, SOCK_DGRAM, 0); 41 if(client_fd 49 //ser_addr.sin_addr.s_addr = inet_addr(SERVER_IP); 50 ser_addr.sin_addr.s_addr = htonl(INADDR_ANY); //注意网络序转换 51 ser_addr.sin_port = htons(SERVER_PORT); //注意网络序转换 52 53 udp_msg_sender(client_fd, (struct sockaddr*)&ser_addr); 54 55 close(client_fd); 56 57 return 0; 58 }

server端:

c socket通信_c socket 通信_linux使用socket通信

client端:

c socket通信_linux使用socket通信_c socket 通信

server端:

linux使用socket通信_c socket通信_c socket 通信

client端:

linux使用socket通信_c socket 通信_c socket通信

二、高级udp socket编程1. udp的connect函数未连接的UDP套接字已连接的UDP套接字连接套接字输出第一个数据报断开套接字连接连接套接字输出第二个数据报断开套接字连接连接套接字输出第一个数据报输出第二个数据报

c socket通信_linux使用socket通信_c socket 通信

void udp_handler(int s, struct sockaddr* to)
{
    char buf[1024] = "TEST UDP !";
    int n = 0;
    connect(s, to, sizeof(*to);
 
    n = write(s, buf, 1024);
 
    read(s, buf, n);
}

2. udp报文丢失问题使用信号SIGALRM为recvfrom设置超时。首先我们为SIGALARM建立一个信号处理函数,并在每次调用前通过alarm设置一个5秒的超时。如果recvfrom被我们的信号处理函数中断了linux使用socket通信,那就超时重发信息;若正常读到数据了linux定时器,就关闭报警时钟并继续进行下去。使用select为recvfrom设置超时

设置select函数的第五个参数即可。3. udp报文乱序问题4. udp流量控制问题

c socket 通信_c socket通信_linux使用socket通信

本作品采用 知识共享署名 4.0 国际许可协议 进行许可
标签: recvfrom socket udp 数据报
最后更新:2022年12月22日

Linux大神网

每日更新,欢迎收藏♥ 不积跬步无以至千里,加油,共勉。

点赞
< 上一篇
下一篇 >

文章评论

您需要 登录 之后才可以评论

Linux大神网

每日更新,欢迎收藏♥
不积跬步无以至千里,加油,共勉。

最新 热点 随机
最新 热点 随机
英伟达将LinuxGPU内核模块作为开放源码/MIT双重许可证(图) virtualboxlinux官方版免费、小巧,同时支持Windows、Linux和Mac系统主机 Linux平台下的嵌入式软件要具备说明技能吗? 图解linuxlinux内核结构框图对内核框图有个总体的把握 linux虚拟机的安装步骤是什么?虚拟机和服务器的区别 精通Linux程序设计的高级程序员并非一件可望不可及的事情 linux虚拟机软件 Linux在安装的时候要注意什么?Linux安装注意事项 Python都有哪些应用,学习完成Python后能的工作方向 微软考虑用Rust开发内核的Linux内核-Hartman Linux内核和文件系统权限管理的基本用法——ACL权限 Linux内核启动有次引导程序Grub 小白在阿里云云服务器上如何发布自己的网站(建站|详细) 阿里云>社区>主题地图S>查看存储推荐 Linux的内核放在了哪里?/boot的启动目录一览 Linux中修改文件权限的命令、创建者所在组、所有人 linux到底难不难学呢?推荐可以查看Linux命令大全 Linux下修改文件权限的权限与所有权的实现就显得很有必要 国内性价比很高的Linux虚拟主机系统安装的流程是什么? 1.Linux磁盘分区和目录Linux发行版本之间的差别很少? 基于命令修改文件的权限命令-ld
Linux5.12的推送请求不断涌入新开放的合并窗口预计4月底看到它的稳定版本go语言被称作互联网时代的c语言,用来开发嵌入式linux的理由腾讯云服务器上也搭建一套环境,安装成功自动启动个人笔记本安装Ubuntu20.04LTS下载地址启动第一步--加载BIOS当你打开计算机电源(组图)虚拟机安装Ubuntu操作系统-Ubuntu空间20G镜像下载指令中各个make-C~/linuxM=`pwd编译Linux启动过程中的几个部分内核的引导(图)如何在Linux上安装虚拟机的结果大多都是怎么安装的一个免费软件时间跟进的小白鼠是什么鬼?专题计算机是如何启动的?、内核操作系统的启动流程学习Linux最简单、最实用的环境就是虚拟机环境(上)linux系统位数最简单的命令--linux基于命令修改文件的权限命令-lddf显示指定磁盘文件和目录的磁盘使用空间命令参数《构建高性能web站点》推荐理由及方法都能找到1.Linux磁盘分区和目录Linux发行版本之间的差别很少?centos系统版本详细信息解决方案与操作系统版本兼容的重要性分析国内性价比很高的Linux虚拟主机系统安装的流程是什么?Linux下修改文件权限的权限与所有权的实现就显得很有必要
php入门到就业线上直播课:linux同步时间的设置 目录说明/处于linux系统树形结构的最顶端,它是linux文件系统 linux到底难不难学呢?推荐可以查看Linux命令大全 Linux里并没有安装rsync的安装过程及安装 【Linux基础知识】Linux下的共享库和动态库 虚拟磁盘文件丢失怎么办?数据恢复结果怎么样? Linux内核虚拟内存管理的难点分析与解决办法(一) Linux内核使用全局变量jiffies来记录系统的优点和缺点? Windows环境中远程连接Linux服务器_轻量 苹果MacOSX系统刷新DNS的方法,你知道吗? LionPlayer支持macOS10.11到最新的macOS内核是什么画面? Linux2.6.32内核的64为操作系统的命令-苏州安嘉 RedHatLinux-安装MySQL入门到精通 解决Windows文件在Ubuntu解压后文件名出现文件名乱码的问题 【知识点】如何记录常用的linux命令?(二) 在文档中查找字符串用grep命令的使用:几个 可编程器由器与可扩展器由器(ScalableRouter)的精确定义 《深入linux设备驱动程序内核机制》(1)_社会万象_光明网(图) 虚拟网络编辑器网络配置教程,各个方法都不一样! 0005编程精粹-Microsoft编写优质无错程序秘诀(bjchenxu)
标签聚合
linux系统 unix linux服务器 电脑 sudo 软件 shell 虚拟机 命令模式 文件目录
书籍
课程
技术群
技术干货大合集↓
  • 2023年2月 / 1篇
  • 2023年1月 / 161篇
  • 2022年12月 / 187篇
  • 2022年11月 / 76篇

COPYRIGHT © 2023 linuxgod.net ALL RIGHTS RESERVED.