文章目录

  • 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相关推荐

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

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

  2. Linux网络编程-UDP和TCP协议详解

    1|0一. 引言 网络协议是每个程序员都要掌握的基础知识,干啥都离不开网络,就算在家里新买了个路由器不是吗,同事连不上网,你的女朋友手机没有网看剧了正看到高潮部分,到那时候你打开百度......那嫌弃 ...

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

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

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

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

  5. 【Linux网络编程】UDP 套接字编程

    [Linux网络编程]UDP 套接字编程 [1]用户数据报协议(UDP) UDP是一个简单的传输层协议,不保证UDP数据报会到达其最终目的地,不保证各个数据报的先后顺序跨网络后保持不变,也不保证每个数 ...

  6. 【Socket网络编程】0.socket TCP/UDP 可参考 【lx青萍之末】 的 【Linux网络编程 】系列博客

    关于socket TCP/UDP 相关知识 可参考博主[ lx青萍之末] 的 [Linux网络编程 ]系列博客 https://blog.csdn.net/daaikuaichuan/category ...

  7. Linux io模型及函数调用,Linux 网络编程的5种IO模型:信号驱动IO模型

    Linux 网络编程的5种IO模型:信号驱动IO模型 背景 这一讲我们来看 信号驱动IO 模型. 介绍 情景引入: 在信号驱动IO模型中,当用户线程发起一个IO请求操作,会给对应的socket注册一个 ...

  8. linux网络编程二:基础socket, bind, listen, accept, connect

    linux网络编程二:基础socket, bind, listen, accept, connect 1. 创建socket #include <sys/types.h>     #inc ...

  9. linux网络编程常用函数详解与实例(socket--bind--listen--accept)

    常用的网络命令: netstat 命令netstat是用来显示网络的连接,路由表和接口统计等网络的信息.netstat有许多的选项我们常用的选项是 -an 用来显示详细的网络状态.至于其它的选项我们可 ...

最新文章

  1. .Net 自定义应用程序配置
  2. 【攻防世界015】notsequence
  3. wxWidgets:创建其他框架
  4. Elasticsearch 动态添加mapping
  5. POJ 并查集 题目汇总 ——czyuan原创(转)
  6. 演练 创建数据库MySchool 1007 sqlserver
  7. Android 12 将支持游戏“边下边玩”
  8. linux查询hive sql输出文件,数据库-如何将HiveQL查询的结果输出到CSV?
  9. 文档未记录的API之setContentToHTMLString
  10. struts2的struts.properties配置文件详解 (转)
  11. 为什么修改配置文件要重启server
  12. opencv findcontour查找最大的内轮廓
  13. 坐标c语言输入数组中,求助 C语言中如何利用二维数组计算多个坐标之间的距离...
  14. 小说我成了机器人桑尼_我在月球当皇帝
  15. Jetson Xavier中安装DIGITS-》Caffee中的错误
  16. 分布式服务架构:原理、设计与实践
  17. 改进网易云音乐的“音乐社交”构想
  18. SQL 求同比 环比
  19. 关于光模块用单模光纤和多模光纤小知识
  20. 利用C#进行CAD二次开发

热门文章

  1. 展开运算符解构赋值_解构式展开式搜索栏
  2. 学python应该掌握的英语单词怎么写_想学Python但是有好多英语单词不认识,Python的常见英语单词都在这儿...
  3. Debug/XXX.pch' is not a precompiled header file created with this compiler
  4. PCIe_TX/RX测试步骤
  5. 2014年终总结——-我的匆匆这一年(面试,毕业季,工作) ——借鉴我的2016毕业季
  6. ffmepg实践系列之--硬解接口实现
  7. 亚马逊美国站绑定万里汇WorldFirst收款教程!
  8. VScode 无法加载文件,因为在此系统上禁止运行脚本的解决方法
  9. WIN11USB转串口不识别 “PL2303TA不支援WINDOWS 11及后续版本”
  10. 顶控科技MT系列触摸屏PLC一体机在冷弯成型机2冲1切应用解决方案