UDP通信、本地套接字

news2024/11/16 13:22:27
#include <sys/types.h>
#include <sys/socket >
ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,const struct sockaddr *dest_addr, socklen_t addrlen);
	- 参数:
		- sockfd : 通信的fd
		- buf : 要发送的数据
		- len : 发送数据的长度
		- flags : 0
		- dest_addr : 通信的另外一端的地址信息
		- addrlen : 地址的内存大小
	
ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,struct sockaddr *src_addr, socklen_t *addrlen);
	- 参数:
		- sockfd : 通信的fd
		- buf : 接收数据的数组
		- len : 数组的大小

		- flags : 0
		- src_addr : 用来保存另外一端的地址信息,不需要可以指定为NULL
		- addrlen : 地址的内存大小

udp_server.c

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>

int main() {
    // 1.创建一个通信的socket
    int fd = socket(PF_INET,SOCK_DGRAM,0);
    if(fd == -1) {
        perror("socket");
        exit(-1);
    }
    // 2.绑定
    struct sockaddr_in saddr;
    saddr.sin_family = AF_INET;
    saddr.sin_port = htons(9999);
    saddr.sin_addr.s_addr = INADDR_ANY;
    int ret = bind(fd,(struct sockaddr*)&saddr,sizeof(saddr));
    if(ret == -1) {
        perror("bind");
        exit(-1);
    }
    // 3.通信 
    while (1) {
        char recvbuf[128] = {0};
        char ipbuf[16] = {0};
        struct sockaddr_in caddr;
        int len = sizeof(caddr);
        // 接收数据
        int num = recvfrom(fd,recvbuf,sizeof(recvbuf),0,(struct sockaddr*)&caddr,&len);
        if(num == -1) {
            perror("recvfrom");
            exit(-1);
        }
        inet_ntop(AF_INET,(struct sockaddr*)&caddr.sin_addr.s_addr,ipbuf,sizeof(ipbuf));
        printf("Client IP : %s,Port : %d\n",ipbuf,ntohs(caddr.sin_port));

        printf("client say : %s\n",recvbuf);

        // 发送数据
        sendto(fd,recvbuf,strlen(recvbuf) + 1,0,(struct sockaddr*)&caddr,sizeof(caddr));
    }
    close(fd);
    return 0;
}

udp_client.c

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>

int main() {
    // 1.创建一个通信的socket
    int fd = socket(PF_INET,SOCK_DGRAM,0);
    if(fd == -1) {
        perror("socket");
        exit(-1);
    }

    // 服务器的地址信息
    struct sockaddr_in saddr;
    saddr.sin_family = AF_INET;
    saddr.sin_port = htons(9999);
    inet_pton(AF_INET,"127.0.0.1",&saddr.sin_addr.s_addr);

    int num = 0;
    // 3.通信 
    while (1) {
        // 发送数据
        char sendBuf[128] = {0};
        sprintf(sendBuf,"hello,i am client %d \n",num++);
        sendto(fd,sendBuf,strlen(sendBuf) + 1,0,(struct sockaddr*)&saddr,sizeof(saddr));

        // 接收数据
        int num = recvfrom(fd,sendBuf,sizeof(sendBuf),0,NULL,NULL);
        printf("server say : %s\n",sendBuf);

        sleep(1);
    }
    close(fd);
    return 0;
}
heheda@heheda:~/Linux/lesson37$ gcc udp_server.c -o server
heheda@heheda:~/Linux/lesson37$ ./server
Client IP : 127.0.0.1,Port : 34127
client say : hello,i am client 0 

Client IP : 127.0.0.1,Port : 34127
client say : hello,i am client 1 

Client IP : 127.0.0.1,Port : 34127
client say : hello,i am client 2 

Client IP : 127.0.0.1,Port : 34127
client say : hello,i am client 3 

Client IP : 127.0.0.1,Port : 34127
client say : hello,i am client 4 

Client IP : 127.0.0.1,Port : 53230
client say : hello,i am client 0 

Client IP : 127.0.0.1,Port : 34127
client say : hello,i am client 5 

Client IP : 127.0.0.1,Port : 53230
client say : hello,i am client 1 

Client IP : 127.0.0.1,Port : 34127
client say : hello,i am client 6 

Client IP : 127.0.0.1,Port : 53230
client say : hello,i am client 2 

Client IP : 127.0.0.1,Port : 34127
client say : hello,i am client 7 

Client IP : 127.0.0.1,Port : 53230
client say : hello,i am client 3 

Client IP : 127.0.0.1,Port : 34127
client say : hello,i am client 8 

Client IP : 127.0.0.1,Port : 53230
client say : hello,i am client 4 

Client IP : 127.0.0.1,Port : 34127
client say : hello,i am client 9 

Client IP : 127.0.0.1,Port : 53230
client say : hello,i am client 5 

Client IP : 127.0.0.1,Port : 34127
client say : hello,i am client 10 

Client IP : 127.0.0.1,Port : 53230
client say : hello,i am client 6 

Client IP : 127.0.0.1,Port : 34127
client say : hello,i am client 11 

Client IP : 127.0.0.1,Port : 53230
client say : hello,i am client 7 

Client IP : 127.0.0.1,Port : 34127
client say : hello,i am client 12 

Client IP : 127.0.0.1,Port : 53230
client say : hello,i am client 8 

Client IP : 127.0.0.1,Port : 34127
client say : hello,i am client 13 

Client IP : 127.0.0.1,Port : 53230
client say : hello,i am client 9 

Client IP : 127.0.0.1,Port : 34127
client say : hello,i am client 14 

Client IP : 127.0.0.1,Port : 53230
client say : hello,i am client 10 

Client IP : 127.0.0.1,Port : 34127
client say : hello,i am client 15 

Client IP : 127.0.0.1,Port : 53230
client say : hello,i am client 11 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/935289.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

leetcode 567. 字符串的排列(滑动窗口-java)

滑动窗口 字符串的排列滑动窗口代码演示进阶优化版 上期经典 字符串的排列 难度 -中等 leetcode567. 字符串的排列 给你两个字符串 s1 和 s2 &#xff0c;写一个函数来判断 s2 是否包含 s1 的排列。如果是&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 换句…

curl --resolve参数的作用

之所以会有这样的操作&#xff0c;是因为域名一般对应的都是一个反向代理&#xff0c;直接请求域名&#xff0c;反向代理会将流量随机选一台机器打过去&#xff0c;而无法确保所有的机器都可用。所以直接用ip。 在 curl 命令中&#xff0c;--resolve 参数用于指定自定义的主机名…

【LeetCode-中等题】2. 两数相加

文章目录 题目方法一&#xff1a;借助一个进制位&#xff0c;以及更新尾结点方法一改进&#xff1a;相比较第一种&#xff0c;给head一个临时头节点&#xff08;开始节点&#xff09;&#xff0c;最后返回的时候返回head.next&#xff0c;这样可以省去第一次的判断 题目 方法一…

Java-继承和多态(上)

面向对象思想中提出了继承的概念&#xff0c;专门用来进行共性抽取&#xff0c;实现代码复用。 继承(inheritance)机制&#xff1a;继承主要解决的问题是&#xff1a;共性的抽取&#xff0c;实现代码复用。 继承的语法 在Java中如果要表示类之间的继承关系&#xff0c;需要借助…

2 hadoop的目录

1. 目录结构&#xff1a; 其中比较的重要的路径有&#xff1a; hdfs,mapred,yarn &#xff08;1&#xff09;bin目录&#xff1a;存放对Hadoop相关服务&#xff08;hdfs&#xff0c;yarn&#xff0c;mapred&#xff09;进行操作的脚本 &#xff08;2&#xff09;etc目录&#x…

docker之 Consul(注册与发现)

目录 一、什么是服务注册与发现&#xff1f; 二、什么是consul 三、consul 部署 3.1建立Consul服务 3.1.1查看集群状态 3.1.2通过 http api 获取集群信息 3.2registrator服务器 3.2.1安装 Gliderlabs/Registrator 3.2.2测试服务发现功能是否正常 3.2.3验证 http 和 ng…

Seaborn绘制热力图的子图

Seaborn绘制热力图的子图 提示&#xff1a;如何绘制三张子图 绘制的时候&#xff0c;会出现如下问题 &#xff08;1&#xff09;如何绘制1*3的子图 &#xff08;2&#xff09;三个显示条&#xff0c;如何只显示最后一个 提示&#xff1a;下面就展示详细步骤 Seaborn绘制热力…

虾皮shopee国际站区域根据ID取商品详情 API 返回值说明

虾皮shopee国际站区域根据ID取商品详情 API 数据代码如下&#xff1a; item_get-根据ID取商品详情 shopee.item_get 公共参数 名称类型必须描述技术交流18179014480keyString是调用key&#xff08;必须以GET方式拼接在URL中&#xff09;API接口接入secretString是调用密钥a…

数据结构(Java实现)-包装类和泛型

包装类 在Java中&#xff0c;由于基本类型不是继承自Object&#xff0c;为了在泛型代码中可以支持基本类型&#xff0c;Java给每个基本类型都对应了 一个包装类型。 基本数据类型和对应的包装类 装箱和拆箱 装箱操作&#xff0c;新建一个 Integer 类型对象&#xff0c;将 i 的…

css选择器,只有第一个不加边框,其余都加

我们在开发中&#xff0c;经常会遇到这样的场景&#xff1a; 要给除了第一个以外的其他元素添加样式&#xff0c;那么我们通过css选择器就可以做到这一点&#xff0c;往下看吧&#xff01; 1. 示例代码 2. 效果展示

Transformer模块(Restormer)

由一个MDTA模块和一个GDFN模块组成一个Transformer Block 我们看一下代码实现&#xff1a; class TransformerBlock(nn.Module):def __init__(self, dim, num_heads, ffn_expansion_factor, bias, LayerNorm_type):super(TransformerBlock, self).__init__()self.norm1 Laye…

C++ - C++11

文章目录 1. std::initializer_list2. decltype3. 左值引用和右值引用4. 完美转发(模板中的&&万能引用)5. 类的新功能6. 可变参数模板7. lambda表达式8. 包装器 1. std::initializer_list 内置类型 int main() {/* 内置类型 */int x1 1;int x2 { 2 };int x3{ 3 };i…

经管博士科研必备【6】Gumbel分布

关于Gumbel分布的相关知识也可以参考: 1.3.6.6.16. Extreme Value Type I Distribution Chapter 4 The Multinomial Logit Model | A Self-Instructing Course in Mode Choice Modeling 1.什么是Gumbel分布 在推导MNL模型(Multinomial Logit)、NL(Nested Logit)模型前,我…

dvwa xss通关

反射型XSS通关 low难度 选择难度&#xff1a; 直接用下面JS代码尝试&#xff1a; <script>alert(/xss/)</script>通关成功&#xff1a; medium难度 直接下面代码尝试后失败 <script>alert(/xss/)</script>发现这段代码直接被输出&#xff1a; 尝试…

Python爬虫框架之Selenium库入门:用Python实现网页自动化测试详解

概要 是否还在为网页测试而烦恼&#xff1f;是否还在为重复的点击、等待而劳累&#xff1f;试试强大的Selenium&#xff01;让你的网页自动化测试变得轻松有趣&#xff01; 一、Selenium库到底是什么&#xff1f; Selenium 是一个强大的自动化测试工具&#xff0c;它可以让你直…

OLED透明屏水波纹效果:打造独特的显示体验

OLED透明屏水波纹效果是一种独特的显示技术&#xff0c;通过模拟水波纹的视觉效果&#xff0c;为用户带来更加生动逼真的观感。 根据市场调研报告显示&#xff0c;OLED透明屏水波纹效果已经在广告、游戏和商业领域得到广泛应用&#xff0c;为品牌提供了新的展示方式&#xff0…

Git想远程仓库与推送以及拉取远程仓库

理解分布式版本控制系统 1.中央服务器 我们⽬前所说的所有内容&#xff08;⼯作区&#xff0c;暂存区&#xff0c;版本库等等&#xff09;&#xff0c;都是在本地也就是在你的笔记本或者计算机上。⽽我们的 Git 其实是分布式版本控制系统&#xff01;什么意思呢? 那我们多人…

java八股文面试[多线程]——为什么要用线程池、线程池参数

速记7个&#xff1a; 核心、最大 存活2 队列 工厂 拒绝 线程池处理流程&#xff1a; 线程池底层工作原理&#xff1a; 线程复用原理&#xff1a; 知识来源&#xff1a; 【并发与线程】为什么使用线程池&#xff0c;参数解释_哔哩哔哩_bilibili 【并发与线程】线程池处理流程…

【⑮MySQL | 视图】概述 | 创建 | 查看 | 更新 | 修改 | 删除

前言 ✨欢迎来到小K的MySQL专栏&#xff0c;本节将为大家带来MySQL视图概述 | 创建 | 查看 | 更新 | 修改 | 删除的分享✨ 目录 前言1.视图概述2.创建视图3.查看视图4.更新视图数据5.修改视图6.删除视图总结 1.视图概述 1.1 为什么使用视图&#xff1f; 视图一方面可以帮我们使…

【Acwing91】最短Hamilton路径详细题解

题目描述 题目分析 首先我们来分析暴力做法&#xff0c;此时最大需要遍历&#xff08;n20&#xff09;20个顶点的排列方式&#xff0c;总共计算的次数为20!&#xff0c;数量级远远大于10^8&#xff0c;显然是不合理的。 此时&#xff0c;我们可以对上述dfs遍历的众多情况进行…