linux网络编程---UDP
文章目录
- UDP编程模型
- 举例
- UDP_A
- UDP_ B
- UDP域套接字
- LOCAL_A
- LOCAL_B
UDP编程模型
举例
UDP_A
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <strings.h>
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
#include <errno.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <pthread.h>
#include <signal.h>void print_err(char *str, int line, int err_no)
{printf("%d, %s: %s\n", line, str, strerror(err_no));exit(-1);
}int sockfd = -1;struct sockaddr_in peer_addr = {0};void *pth_fun(void *pth_arg)
{int ret = -1;char buf[100] = {0};int peer_addr_size = 0; while(1){ bzero(buf, sizeof(buf));peer_addr_size = sizeof(peer_addr); /* 接收对方发送的数据,并保存对方的ip和端口,以便回答 */ret = recvfrom(sockfd, buf, sizeof(buf), 0, \(struct sockaddr *)&peer_addr, &peer_addr_size); if(ret == -1) print_err("recvfrom fial", __LINE__, errno);else if(ret > 0){printf("peerip:%s, peerport:%d\n", \inet_ntoa(peer_addr.sin_addr), ntohs(peer_addr.sin_port));printf("%s\n", buf);}}return NULL;
}int main(int argc, char **argv)
{int ret = 0;char buf[100] = {0};if(argc != 3){printf("./a.out peer_ip peer_port\n");exit(-1);}/* 创建套接字文件,指定使用UDP协议 */sockfd = socket(PF_INET, SOCK_DGRAM, 0);if(sockfd == -1) print_err("socket fial", __LINE__, errno);/* 使用UDP来通信,如果要接收数据的话,必须绑* 定固定的IP和端口,方便对方发送数据 */struct sockaddr_in addr;addr.sin_family = AF_INET;addr.sin_port = htons(5001);addr.sin_addr.s_addr = inet_addr("192.168.1.106"); ret = bind(sockfd, (struct sockaddr *)&addr, sizeof(addr));if(ret == -1) print_err("bind fial", __LINE__, errno); /* 创建此线程,用于循环接收对方发送的数据 */pthread_t tid;ret = pthread_create(&tid, NULL, pth_fun, NULL);if(ret != 0) print_err("pthread_create fail", __LINE__, errno);/* 主线程发送数据 */ while(1){/* 设置对方的IP和端口 */peer_addr.sin_family = AF_INET;peer_addr.sin_port = htons(atoi(argv[2]));peer_addr.sin_addr.s_addr = inet_addr(argv[1]);bzero(buf, sizeof(buf));scanf("%s", buf);ret = sendto(sockfd, buf, sizeof(buf), 0, \(struct sockaddr *)&peer_addr, sizeof(peer_addr));if(ret == -1) print_err("sendto fial", __LINE__, errno);}return 0;
}
UDP_ B
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <strings.h>
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
#include <errno.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <pthread.h>
#include <signal.h>void print_err(char *str, int line, int err_no)
{printf("%d, %s: %s\n", line, str, strerror(err_no));exit(-1);
}int sockfd = -1;struct sockaddr_in peer_addr = {0};void *pth_fun(void *pth_arg)
{int ret = -1;char buf[100] = {0};int peer_addr_size = 0; while(1){ bzero(buf, sizeof(buf));peer_addr_size = sizeof(peer_addr); /* 接收对方发送的数据,并保存对方的ip和端口,以便回答 */ret = recvfrom(sockfd, buf, sizeof(buf), 0, \(struct sockaddr *)&peer_addr, &peer_addr_size); if(ret == -1) print_err("recvfrom fial", __LINE__, errno);else if(ret > 0){printf("peerip:%s, peerport:%d\n", \inet_ntoa(peer_addr.sin_addr), ntohs(peer_addr.sin_port));printf("%s\n", buf);}}return NULL;
}int main(int argc, char **argv)
{int ret = 0;char buf[100] = {0};if(argc != 3){printf("./a.out peer_ip peer_port\n");exit(-1);}/* 创建套接字文件,指定使用UDP协议 */sockfd = socket(PF_INET, SOCK_DGRAM, 0);if(sockfd == -1) print_err("socket fial", __LINE__, errno);/* 使用UDP来通信,如果要接收数据的话,必须绑* 定固定的IP和端口,方便对方发送数据 */struct sockaddr_in addr;addr.sin_family = AF_INET;addr.sin_port = htons(5009);//addr.sin_addr.s_addr = inet_addr("192.168.1.106"); addr.sin_addr.s_addr = inet_addr("192.168.1.106"); ret = bind(sockfd, (struct sockaddr *)&addr, sizeof(addr));if(ret == -1) print_err("bind fial", __LINE__, errno); /* 创建此线程,用于循环接收对方发送的数据 */pthread_t tid;ret = pthread_create(&tid, NULL, pth_fun, NULL);if(ret != 0) print_err("pthread_create fail", __LINE__, errno);/* 主线程发送数据 */ while(1){/* 设置对方的IP和端口 */peer_addr.sin_family = AF_INET;peer_addr.sin_port = htons(atoi(argv[2]));peer_addr.sin_addr.s_addr = inet_addr(argv[1]);bzero(buf, sizeof(buf));scanf("%s", buf);ret = sendto(sockfd, buf, sizeof(buf), 0, \(struct sockaddr *)&peer_addr, sizeof(peer_addr));if(ret == -1) print_err("sendto fial", __LINE__, errno);}return 0;
}
UDP域套接字
LOCAL_A
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
#include <string.h>
#include <strings.h>
#include <errno.h>
#include <pthread.h>
#include <signal.h>
#include <sys/un.h>void print_err(char *str, int line, int err_no)
{printf("%d, %s: %s\n", line, str, strerror(err_no));exit(-1);
}int sockfd = -1;
struct sockaddr_un peer_addr;void *pth_fun(void *pth_arg)
{int ret = -1;char buf[100] = {0};int peer_addr_size = sizeof(peer_addr);while(1){bzero(buf, sizeof(buf));ret = recvfrom(sockfd, buf, sizeof(buf), 0, \(struct sockaddr *)&peer_addr, &peer_addr_size); if(ret == -1) print_err("recvfrom fail", __LINE__, errno);else if(ret > 0) {printf("%s\n", buf);}}
}void signal_fun(int signo)
{if(SIGINT == signo){remove("./unix_sock_A");exit(-1);}
}int main(int argc, char **argv)
{int ret = -1;if(argc != 2){printf("./a.out peer_file\n");exit(-1);}signal(SIGINT, signal_fun);sockfd = socket(PF_UNIX, SOCK_DGRAM, 0);if(sockfd == -1) print_err("socket fail", __LINE__, errno);struct sockaddr_un addr;addr.sun_family = AF_UNIX;strcpy(addr.sun_path, "./unix_sock_A");ret = bind(sockfd, (struct sockaddr *)&addr, sizeof(addr)); pthread_t tid;ret = pthread_create(&tid, NULL, pth_fun, NULL);if(ret != 0) print_err("pthread_create fail", __LINE__, ret);char buf[100] = {0};while(1){peer_addr.sun_family = AF_UNIX;strcpy(peer_addr.sun_path, argv[1]);bzero(buf, sizeof(buf));scanf("%s", buf);ret = sendto(sockfd, buf, sizeof(buf), 0, \(struct sockaddr *)&peer_addr, sizeof(peer_addr)); if(ret == -1) print_err("sendto fail", __LINE__, errno);}return 0;
}
LOCAL_B
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
#include <string.h>
#include <strings.h>
#include <errno.h>
#include <pthread.h>
#include <signal.h>
#include <sys/un.h>void print_err(char *str, int line, int err_no)
{printf("%d, %s: %s\n", line, str, strerror(err_no));exit(-1);
}int sockfd = -1;
struct sockaddr_un peer_addr;void *pth_fun(void *pth_arg)
{int ret = -1;char buf[100] = {0};int peer_addr_size = sizeof(peer_addr);while(1){bzero(buf, sizeof(buf));ret = recvfrom(sockfd, buf, sizeof(buf), 0, \(struct sockaddr *)&peer_addr, &peer_addr_size); if(ret == -1) print_err("recvfrom fail", __LINE__, errno);else if(ret > 0) {printf("%s\n", buf);}}
}void signal_fun(int signo)
{if(SIGINT == signo){remove("./unix_sock_B");exit(-1);}
}int main(int argc, char **argv)
{int ret = -1;if(argc != 2){printf("./a.out peer_file\n");exit(-1);}signal(SIGINT, signal_fun);sockfd = socket(PF_UNIX, SOCK_DGRAM, 0);if(sockfd == -1) print_err("socket fail", __LINE__, errno);struct sockaddr_un addr;addr.sun_family = AF_UNIX;strcpy(addr.sun_path, "./unix_sock_B");ret = bind(sockfd, (struct sockaddr *)&addr, sizeof(addr)); pthread_t tid;ret = pthread_create(&tid, NULL, pth_fun, NULL);if(ret != 0) print_err("pthread_create fail", __LINE__, ret);char buf[100] = {0};while(1){peer_addr.sun_family = AF_UNIX;strcpy(peer_addr.sun_path, argv[1]);bzero(buf, sizeof(buf));scanf("%s", buf);ret = sendto(sockfd, buf, sizeof(buf), 0, \(struct sockaddr *)&peer_addr, sizeof(peer_addr)); if(ret == -1) print_err("sendto fail", __LINE__, errno);}return 0;
}
linux网络编程---UDP相关推荐
- 6、linux网络编程--UDP协议编程
一.概述: UDP 是 User Datagram Protocol 的简称, 中文名是用户数据报协议,是一个简单的面向数据报的运输层协议,在网络中用于处理数据包,是一种无连接的协议.UDP 不提供可 ...
- Linux网络编程-UDP和TCP协议详解
1|0一. 引言 网络协议是每个程序员都要掌握的基础知识,干啥都离不开网络,就算在家里新买了个路由器不是吗,同事连不上网,你的女朋友手机没有网看剧了正看到高潮部分,到那时候你打开百度......那嫌弃 ...
- 基于UDP客户端服务器的编程模型-linux网络编程
坚持在代码中注释,边读代码边学习Linux网络编程 使用到的发送函数原型: #include <sys/types.h>#include <sys/socket.h>ssize ...
- 【Linux网络编程】循环服务器之UDP循环模型
00. 目录 文章目录 00. 目录 01. 概述 02. UDP循环服务器的实现方法 03. UDP循环服务器模型 04. UDP循环服务器实现 05. 附录 01. 概述 服务器设计技术有很多,按 ...
- 【Linux网络编程】UDP 套接字编程
[Linux网络编程]UDP 套接字编程 [1]用户数据报协议(UDP) UDP是一个简单的传输层协议,不保证UDP数据报会到达其最终目的地,不保证各个数据报的先后顺序跨网络后保持不变,也不保证每个数 ...
- 【Socket网络编程】0.socket TCP/UDP 可参考 【lx青萍之末】 的 【Linux网络编程 】系列博客
关于socket TCP/UDP 相关知识 可参考博主[ lx青萍之末] 的 [Linux网络编程 ]系列博客 https://blog.csdn.net/daaikuaichuan/category ...
- Linux io模型及函数调用,Linux 网络编程的5种IO模型:信号驱动IO模型
Linux 网络编程的5种IO模型:信号驱动IO模型 背景 这一讲我们来看 信号驱动IO 模型. 介绍 情景引入: 在信号驱动IO模型中,当用户线程发起一个IO请求操作,会给对应的socket注册一个 ...
- linux网络编程二:基础socket, bind, listen, accept, connect
linux网络编程二:基础socket, bind, listen, accept, connect 1. 创建socket #include <sys/types.h> #inc ...
- linux网络编程常用函数详解与实例(socket--bind--listen--accept)
常用的网络命令: netstat 命令netstat是用来显示网络的连接,路由表和接口统计等网络的信息.netstat有许多的选项我们常用的选项是 -an 用来显示详细的网络状态.至于其它的选项我们可 ...
最新文章
- .Net 自定义应用程序配置
- 【攻防世界015】notsequence
- wxWidgets:创建其他框架
- Elasticsearch 动态添加mapping
- POJ 并查集 题目汇总 ——czyuan原创(转)
- 演练 创建数据库MySchool 1007 sqlserver
- Android 12 将支持游戏“边下边玩”
- linux查询hive sql输出文件,数据库-如何将HiveQL查询的结果输出到CSV?
- 文档未记录的API之setContentToHTMLString
- struts2的struts.properties配置文件详解 (转)
- 为什么修改配置文件要重启server
- opencv findcontour查找最大的内轮廓
- 坐标c语言输入数组中,求助 C语言中如何利用二维数组计算多个坐标之间的距离...
- 小说我成了机器人桑尼_我在月球当皇帝
- Jetson Xavier中安装DIGITS-》Caffee中的错误
- 分布式服务架构:原理、设计与实践
- 改进网易云音乐的“音乐社交”构想
- SQL 求同比 环比
- 关于光模块用单模光纤和多模光纤小知识
- 利用C#进行CAD二次开发
热门文章
- 展开运算符解构赋值_解构式展开式搜索栏
- 学python应该掌握的英语单词怎么写_想学Python但是有好多英语单词不认识,Python的常见英语单词都在这儿...
- Debug/XXX.pch' is not a precompiled header file created with this compiler
- PCIe_TX/RX测试步骤
- 2014年终总结——-我的匆匆这一年(面试,毕业季,工作) ——借鉴我的2016毕业季
- ffmepg实践系列之--硬解接口实现
- 亚马逊美国站绑定万里汇WorldFirst收款教程!
- VScode 无法加载文件,因为在此系统上禁止运行脚本的解决方法
- WIN11USB转串口不识别 “PL2303TA不支援WINDOWS 11及后续版本”
- 顶控科技MT系列触摸屏PLC一体机在冷弯成型机2冲1切应用解决方案