UDP广播的客户端和服务器端的代码设计
实验环境
linux
注意:
使用UDP广播,是客户端发送广播消息,服务器端接收消息。实际上是客户端探测局域网中可用服务器的一种手段。客户端发送,服务器端接收,千万不能弄混淆!!!
为了避免混淆,本文不使用client、server字眼。而使用send,recv
构建send_broadcast.c。发送广播消息,并打印接收端的IP和端口,退出时发送"done"消息
流程:创建一个socket,并用setscokopt函数声明这是一个broadcast类型的socket,然后通过这个socket向INADDR_BROADCAST("255.255.255.255")发送消息。
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h> #define PORT 1234
#define BUFFER_SIZE 100 int32_t main()
{
char msg[BUFFER_SIZE] = "I am a broadcast message";
int32_t nb = ;
struct sockaddr_in addrto;
int32_t nlen=sizeof(addrto); int32_t sockfd = -;
if ((sockfd = socket(AF_INET, SOCK_DGRAM, )) == -)
{
perror("create socket failed\n");
return -;
} const int opt = ;
//设置该套接字为广播类型,
nb = setsockopt(sockfd, SOL_SOCKET, SO_BROADCAST | SO_REUSEADDR, &opt, sizeof(opt));
if(nb == -)
{
perror("set socket error...\n");
return -;
} /**< 接收者地址结构 */
bzero(&addrto, sizeof(struct sockaddr_in));
addrto.sin_family = AF_INET;
addrto.sin_addr.s_addr = htonl(INADDR_BROADCAST);
addrto.sin_port = htons(PORT); int ret = sendto(sockfd, msg, BUFFER_SIZE, , (struct sockaddr*)&addrto, nlen);
if (ret < )
{
perror("send error.\n");
} /**< 打印接收者的IP和端口号 */
printf("recver's ip is %s, port is %d.\n", inet_ntoa(addrto.sin_addr), htons(addrto.sin_port)); bzero(msg, BUFFER_SIZE);
memcpy(msg, "done", ); sendto(sockfd, msg, BUFFER_SIZE, , (struct sockaddr*)&addrto, nlen); printf("Done\n");
return ;
}
构建recv_broadcast.c 接收广播消息,打印发送端的IP和端口号,在接收到done后停止并退出
流程:创建一个socket并绑定INADDR_ANY的本地地址,接收消息
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h> #define PORT 1234
#define BUFFER_SIZE 100 int32_t main()
{
struct sockaddr_in addrto; struct sockaddr_in from;
int32_t listenfd = -;
int32_t len = sizeof(from);
char recvbuf[BUFFER_SIZE]; if ((listenfd = socket(AF_INET, SOCK_DGRAM, )) == -)
{
perror("create socket failed\n");
return -;
} bzero(&addrto, sizeof(struct sockaddr_in));
bzero(&from, sizeof(struct sockaddr_in));
addrto.sin_family = AF_INET;
addrto.sin_port = htons(PORT);
addrto.sin_addr.s_addr = htonl(INADDR_ANY); const int opt = ;
int32_t nb = setsockopt(listenfd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));
if(nb == -)
{
perror("set socket error...\n");
return -;
} /**< 绑定自己的地址 */
if (bind(listenfd, (struct sockaddr *)&addrto, len) == -)
{
perror("bind error\n");
return -;
} while ()
{
//从广播地址接收消息
int ret = recvfrom(listenfd, recvbuf, BUFFER_SIZE, , (struct sockaddr*)&from, &len);
if (ret > )
{
recvbuf[ret] = '\0';
printf("receive messgse:%s\n", recvbuf);
if (!strcmp("done", recvbuf))
{
break;
}
}
else
{
perror("recv error.\n"); }
bzero(recvbuf, BUFFER_SIZE); /**< 打印发送者的ip和端口号 */
printf("sender's ip is %s, port is %d.\n", inet_ntoa(from.sin_addr), htons(from.sin_port));
} close(listenfd);
printf("Done\n");
return ;
}
Makefile
all:sender recver
sender:
gcc send_broadcast.c -o sender recver:
gcc recv_broadcast.c -o recver clean:
rm -rf sender recver
UDP广播的客户端和服务器端的代码设计的更多相关文章
- 基于UDP的客户端和服务器端的代码设计
实验平台 linux 实验内容 编写UDP服务器和客户端程序,客户端发送消息,服务器接收消息,并打印客户端的IP地址和端口号. 实验原理 UDP是无需连接的通信,其主要实现过程如下: 同样,我们可以按 ...
- 基于TCP的客户端和服务器端的代码设计
实验平台 linux 实验内容 编写TCP服务器和客户端程序,程序运行时服务器等待客户端连接.一旦连接成功,服务器显示客户端的IP地址和端口号,并向客户端发送字符串 实验原理 TCP是面向连接的通信, ...
- C/S模型:TCP,UDP构建客户端和服务器端(BIO实现
Java中提供了socket编程来构建客户端和服务器端 TCP构建服务器端的步骤:(1)bind:绑定端口号(2)listen:监听客户端的连接请求(3)accept:返回和客户端连接的实例(4)re ...
- Java实现UDP之Echo客户端和服务端
Java实现UDP之Echo客户端和服务端 代码内容 采用UDP协议编写服务器端代码(端口任意) 编写客户机的代码访问该端口 客户机按行输入 服务器将收到的字符流和接收到的时间输出在服务器consol ...
- UDP广播 与 TCP客户端 --服务端
随着倒计时的响声,自觉无心工作,只想为祖国庆生. 最近有遇到过这样一个问题,将摄像头识别的行人,车辆实时显示在客户端中.有提供接口,会以Json的数据的形式将实时将识别的对象进行Post提交.所以我们 ...
- 牛客网Java刷题知识点之TCP、UDP、TCP和UDP的区别、socket、TCP编程的客户端一般步骤、TCP编程的服务器端一般步骤、UDP编程的客户端一般步骤、UDP编程的服务器端一般步骤
福利 => 每天都推送 欢迎大家,关注微信扫码并加入我的4个微信公众号: 大数据躺过的坑 Java从入门到架构师 人工智能躺过的坑 Java全栈大联盟 ...
- android客户端从服务器端获取json数据并解析的实现代码
今天总结一下android客户端从服务器端获取json数据的实现代码,需要的朋友可以参考下 首先客户端从服务器端获取json数据 1.利用HttpUrlConnection /** * 从指定的U ...
- 在vs code中使用ftp-sync插件实现客户端与服务器端代码的同步
在vs code中使用ftp-sync插件实现客户端与服务器端代码的同步 下载安装 vscode-ftp-sync 插件. 安装方法1. Ctrl+Shift+P 输入 ext install [插件 ...
- (转)android客户端从服务器端获取json数据并解析的实现代码
今天总结一下android客户端从服务器端获取json数据的实现代码,需要的朋友可以参考下 首先客户端从服务器端获取json数据 1.利用HttpUrlConnection 复制代码 ...
随机推荐
- Windows10操作技巧系列——删除最常用,最常访问,快速访问记录
Win10除了有传统意义上的,网络历史记录外,还包含了两种本地文件浏览记录,分别是资源管理器中的“快速访问”记录,和开始菜单以及任务栏中的“最常用”“最近”“最常访问”等“最记录”. 资源管理器中的“ ...
- C++线性表的链式存储结构
C++实现线性表的链式存储结构: 为了解决顺序存储不足:用线性表另外一种结构-链式存储.在顺序存储结构(数组描述)中,元素的地址是由数学公式决定的,而在链式储存结构中,元素的地址是随机分布的,每个元素 ...
- redis中的缓存-缓存雪崩和缓存穿透
缓存雪崩 缓存雪崩是由于原有缓存失效(过期),新缓存未到期间.所有请求都去查询数据库,而对数据库CPU和内存造成巨大压力,严重的会造成数据库宕机.从而形成一系列连锁反应,造成整个系统崩溃. 1. 碰到 ...
- ConcurrentHashMap和 CopyOnWriteArrayList提供线程安全性和可伸缩性 以及 同步的集合类 Hashtable 和 Vector Collections.synchronizedMap 和 Collections.synchronizedList 区别缺点
ConcurrentHashMap和 CopyOnWriteArrayList提供线程安全性和可伸缩性 DougLea的 util.concurrent 包除了包含许多其他有用的并发构造块之外,还包含 ...
- Python 文件拼接
# -*- coding:utf-8 -*- import re import csv file = open('make_setup.cfg', 'w+') with open("tyb. ...
- CVE-2020-1938:Apache-Tomcat-Ajp漏洞-复现
0x00 漏洞简介 Apache与Tomcat都是Apache开源组织开发的用于处理HTTP服务的项目,两者都是免费的,都可以做为独立的Web服务器运行. Apache Tomcat服务器存在文件包含 ...
- 新版本Xcode 6的视图调试详解
开发者会经常遇到视图或者Auto Layout约束中存在bug的情况,并且这种bug很难通过代码发现,所以开发者很有必要熟知如何进行简单高效的视图调试,而Xcode 6的发布使得视图调试变得前所未有的 ...
- 【Java】FlowControl 流程控制
FlowControl 流程控制 什么是流程控制? 控制流程(也称为流程控制)是计算机运算领域的用语,意指在程序运行时,个别的指令(或是陈述.子程序)运行或求值的顺序. 不论是在声明式编程语言或是函数 ...
- redis list 基本操作
写在前面的话 本篇笔记写在笔者刚工作时.如有问题,请指教. 简介 list是链表,redis list的应用场景很多,也是Redis 最重要的数据结构之一,比如微博的关注列表,粉丝列表,消息列表等功能 ...
- 安装python3.8和python2.7
在同一台电脑上同时安装Python2和Python3 目前Python的两个版本Python2和Python3同时存在,且这两个版本同时在更新与维护. 到底是选择Python2还是选择Python3, ...