距离详解Linux下的UDP方式通讯
UDP方式点对点通讯
#include <stdio.h> #include <string.h> #include <sys/types.h> #include <netinet/in.h> #include <sys/socket.h> #include <errno.h> #include <stdlib.h> #include <arpa/inet.h> int main(int argc, char **argv) { struct sockaddr_in s_addr; struct sockaddr_in c_addr; int sock; socklen_t addr_len; int len; char buff[128]; /* 创建 socket , 关键在于这个 SOCK_DGRAM */ if ((sock = socket(AF_INET, SOCK_DGRAM, 0)) == -1) { perror("socket"); exit(errno); } else printf("create socket.\n\r"); memset(&s_addr, 0, sizeof(struct sockaddr_in)); /* 设置地址和端口信息 */ s_addr.sin_family = AF_INET; if (argv[2]) s_addr.sin_port = htons(atoi(argv[2])); else s_addr.sin_port = htons(7838); if (argv[1]) s_addr.sin_addr.s_addr = inet_addr(argv[1]); else s_addr.sin_addr.s_addr = INADDR_ANY; /* 绑定地址和端口信息 */ if ((bind(sock, (struct sockaddr *) &s_addr, sizeof(s_addr))) == -1) { perror("bind"); exit(errno); } else printf("bind address to socket.\n\r"); /* 循环接收数据 */ addr_len = sizeof(c_addr); while (1) { len = recvfrom(sock, buff, sizeof(buff) - 1, 0, (struct sockaddr *) &c_addr, &addr_len); if (len < 0) { perror("recvfrom"); exit(errno); } buff[len] = '\0'; printf("收到来自%s:%d的消息:%s\n\r", inet_ntoa(c_addr.sin_addr), ntohs(c_addr.sin_port), buff); } return 0; }
客户端源代码如下:
#include <stdio.h> #include <string.h> #include <sys/types.h> #include <netinet/in.h> #include <sys/socket.h> #include <errno.h> #include <stdlib.h> #include <arpa/inet.h> int main(int argc, char **argv) { struct sockaddr_in s_addr; int sock; int addr_len; int len; char buff[128]; /* 创建 socket , 关键在于这个 SOCK_DGRAM */ if ((sock = socket(AF_INET, SOCK_DGRAM, 0)) == -1) { perror("socket"); exit(errno); } else printf("create socket.\n\r"); /* 设置对方地址和端口信息 */ s_addr.sin_family = AF_INET; if (argv[2]) s_addr.sin_port = htons(atoi(argv[2])); else s_addr.sin_port = htons(7838); if (argv[1]) s_addr.sin_addr.s_addr = inet_addr(argv[1]); else { printf("消息必须有一个接收者!\n"); exit(0); } /* 发送UDP消息 */ addr_len = sizeof(s_addr); strcpy(buff, "hello i'm here"); len = sendto(sock, buff, strlen(buff), 0, (struct sockaddr *) &s_addr, addr_len); if (len < 0) { printf("\n\rsend error.\n\r"); return 3; } printf("send success.\n\r"); return 0; }
编译程序用下列命令:
gcc -Wall simple-udpserver.c -o server gcc -Wall simple-udpclient.c -o client
运行程序用下列命令:
./server 127.0.0.1 7838 ./client 127.0.0.1 7838
UDP方式广播通讯
源代码变成下面的:
#include <stdio.h> #include <string.h> #include <sys/types.h> #include <netinet/in.h> #include <sys/socket.h> #include <errno.h> #include <stdlib.h> #include <arpa/inet.h> int main(int argc, char **argv) { struct sockaddr_in s_addr; int sock; int addr_len; int len; char buff[128]; int yes; /* 创建 socket */ if ((sock = socket(AF_INET, SOCK_DGRAM, 0)) == -1) { perror("socket"); exit(errno); } else printf("create socket.\n\r"); /* 设置通讯方式对广播,即本程序发送的一个消息,网络上所有主机均可以收到 */ yes = 1; setsockopt(sock, SOL_SOCKET, SO_BROADCAST, &yes, sizeof(yes)); /* 唯一变化就是这一点了 */ /* 设置对方地址和端口信息 */ s_addr.sin_family = AF_INET; if (argv[2]) s_addr.sin_port = htons(atoi(argv[2])); else s_addr.sin_port = htons(7838); if (argv[1]) s_addr.sin_addr.s_addr = inet_addr(argv[1]); else { printf("消息必须有一个接收者!\n"); exit(0); } /* 发送UDP消息 */ addr_len = sizeof(s_addr); strcpy(buff, "hello i'm here"); len = sendto(sock, buff, strlen(buff), 0, (struct sockaddr *) &s_addr, addr_len); if (len < 0) { printf("\n\rsend error.\n\r"); return 3; } printf("send success.\n\r"); return 0; }
编译这个程序用下列命令:
gcc -Wall broadc-udpclient.c -o client
运行程序用下列命令:
./client 192.168.0.255 7838
就会往192.168.0网络内所有主机发消息。
其它主机如果运行了服务端:
./server 自己的IP地址 7838
则都会收到上述客户端发的消息了。
上一篇:c++实现简单的线程池
栏 目:C语言
下一篇:Swift编程中的泛型解析
本文标题:距离详解Linux下的UDP方式通讯
本文地址:https://www.xiuzhanwang.com/a1/Cyuyan/2664.html
您可能感兴趣的文章
- 01-10求子数组最大和的解决方法详解
- 01-10深入二叉树两个结点的最低共同父结点的详解
- 01-10数据结构课程设计- 解析最少换车次数的问题详解
- 01-10数据结构课程设计-用栈实现表达式求值的方法详解
- 01-10HDOJ 1443 约瑟夫环的最新应用分析详解
- 01-10使用C++实现全排列算法的方法详解
- 01-10如何查看进程实际的内存占用情况详解
- 01-10深入Main函数中的参数argc,argv的使用详解
- 01-10APUE笔记之:进程环境详解
- 01-10深入第K大数问题以及算法概要的详解
阅读排行
本栏相关
- 04-02c语言函数调用后清空内存 c语言调用
- 04-02func函数+在C语言 func函数在c语言中
- 04-02c语言的正则匹配函数 c语言正则表达
- 04-02c语言用函数写分段 用c语言表示分段
- 04-02c语言中对数函数的表达式 c语言中对
- 04-02c语言编写函数冒泡排序 c语言冒泡排
- 04-02c语言没有round函数 round c语言
- 04-02c语言分段函数怎么求 用c语言求分段
- 04-02C语言中怎么打出三角函数 c语言中怎
- 04-02c语言调用函数求fibo C语言调用函数求
随机阅读
- 08-05dedecms(织梦)副栏目数量限制代码修改
- 01-10delphi制作wav文件的方法
- 04-02jquery与jsp,用jquery
- 01-10SublimeText编译C开发环境设置
- 01-10使用C语言求解扑克牌的顺子及n个骰子
- 01-11Mac OSX 打开原生自带读写NTFS功能(图文
- 01-11ajax实现页面的局部加载
- 08-05DEDE织梦data目录下的sessions文件夹有什
- 01-10C#中split用法实例总结
- 08-05织梦dedecms什么时候用栏目交叉功能?