【socket编程-08】socket数据的接收和发送

socket数据的接收和发送 Linux下数据的接收和发送 Linux 不区分套接字文件和普通文件,使用 write() 可以向套接字中写入数据,使用 read() 可以从套接字中读取数据。 前面我们说过,两台计算机之间的通信相当于两个套接字之间的通信,在服务器端用 write() 向套接字写入数据,客户端就能收到,然后再使用 read() 从套接字中读取出来,就完成了一次通信。 write() 的原型为: s 阅读详情

  声明:本博客所转《socket编程》系列教程来自C语言中文网,本文地址socket数据的接收和发送,本文仅供学习交流,更多内容请支持原创!


Linux下数据的接收和发送

Linux 不区分套接字文件和普通文件,使用 write() 可以向套接字中写入数据,使用 read() 可以从套接字中读取数据。

前面我们说过,两台计算机之间的通信相当于两个套接字之间的通信,在服务器端用 write() 向套接字写入数据,客户端就能收到,然后再使用 read() 从套接字中读取出来,就完成了一次通信。

write() 的原型为:

ssize_t write(int fd, const void *buf, size_t nbytes);

fd 为要写入的文件的描述符,buf 为要写入的数据的缓冲区地址,nbytes 为要写入的数据的字节数。

size_t 是通过 typedef 声明的 unsigned int 类型;ssize_t 在 “size_t” 前面加了一个"s",代表 signed,即 ssize_t 是通过 typedef 声明的 signed int 类型。

write() 函数会将缓冲区 buf 中的 nbytes 个字节写入文件 fd,成功则返回写入的字节数,失败则返回 -1。

read() 的原型为:

ssize_t read(int fd, void *buf, size_t nbytes);

fd 为要读取的文件的描述符,buf 为要接收数据的缓冲区地址,nbytes 为要读取的数据的字节数。

read() 函数会从 fd 文件中读取 nbytes 个字节并保存到缓冲区 buf,成功则返回读取到的字节数(但遇到文件结尾则返回0),失败则返回 -1。

Windows下数据的接收和发送

Windows 和 Linux 不同,Windows 区分普通文件和套接字,并定义了专门的接收和发送的函数。

从服务器端发送数据使用 send() 函数,它的原型为:

int send(SOCKET sock, const char *buf, int len, int flags);

sock 为要发送数据的套接字,buf 为要发送的数据的缓冲区地址,len 为要发送的数据的字节数,flags 为发送数据时的选项。

返回值和前三个参数不再赘述,最后的 flags 参数一般设置为 0 或 NULL,初学者不必深究。

在客户端接收数据使用 recv() 函数,它的原型为:

int recv(SOCKET sock, char *buf, int len, int flags);
异步SOCKET编程-发送和接收数据[转] 异步SOCKET编程-发送和接收数据[转] 我本想把发送和接收分开作为两部分,但是最后我决定只略微解释一下 FD_READ ,留下更多的时间来说明更复杂的 FD_WRITE , FD_READ 事件非常容易掌握. 当有数据发送过来时, WinSock 会以 FD_READ 事件通知你, 对于每一个 FD_READ 事件, 你需要像下面这样调用 recv() :int bytes_recv = recv(wParam, &data, 阅读详情

相关推荐

2 socket循环接收数据 socket循环接收大数据 问 socket异步接收数据

2 socket循环接收数据 socket循环接收大数据 问 socket异步接收数据

hhduyc的博客 3748

【网络编程】对套接字读写的理解(1):write、send 和read

在封装TCP读写的时候,遇到了读写函数的选择问题,进而研究了一下,在此记录。常用的三个函数分别为write、send 和 sendmsg。函数原型如下: 每个函数可以单独使用,但使用的场景有所不同:上面这些可能查下资料,大家基本都可以知道,然后觉得套接字读写和普通文件的读写没有什么区别,其实里面暗含了很多内在的区别。对于普通文件描述符而言,一个文件描述符代表了打开的一个文件句柄,通过调用 write 函数,操作系统内核帮我们不断地往文件系统中写入字节流。注意,写入的字节流大小通常和输入参数 size 的值是

qq_41950508的博客 3515

c# Socket同步发送接收数据

string stringData = "";             Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);             try             {                 byte[] byteMessage;

rongaimeng的专栏 7070

网络编程中接收,发送数据函数比较

1.send,write的区别 | recv,read的区别 send,recv除了发送数据之外,还可以指定一些特殊的选项,比如带外数据OOB。 对于send函数,需要知道的是如果开启了OOB选项的话,只是在TCP头部里面设置了URG位和URG指针,而且也只能读取一个字节而已... 对于recv函数,如果开启了MSG_PEEK以及MSG_DONTWAIT,不会向read函数一样读取后就清除缓冲区的内容。 2.readv,writev函数 readv,writev可以一次性将保存在多个...

MrZhuangzhipeng的博客 1471

windows socket编程,连续发送接收

注:改编参考: [1]http://blog.youkuaiyun.com/oinux/article/details/8525823 [2]http://www.ibm.com/developerworks/cn/aix/library/0807_liugb_tcpip/ 流程图 服务器端: //#include "stdafx.h" #include #include #pragma

wxd_zswx的专栏 647

【socket】 read和recv区别、write和send区别

1.问chatGPT应用:socket read和recv区别? 2.问chatGPT应用:socket write和send区别?

数字人生 2714

Raw Socket 接收和发送数据包

snippet/raw-socket.md at master · xgfone/snippet · GitHubhttps://github.com/xgfone/snippet/blob/master/snippet/docs/linux/program/raw-socket.md Raw Socket 接收和发送数据包 前言 对于网络层IP数据包的接收、发送,RAW SOCKET 接口是通用的,具有可移植性。 但对于数据链路层数据帧的接收、发送,不同的系统有不同的机制,不具有可移植性。 对于

maimang1001的专栏 2万+

通过Socket编程实现邮件的SMTP/POP3发送与接收

POP3(Post Office Protocol 3)是一种离线邮件处理协议,它是互联网上从邮件服务器接收邮件的标准协议。用户通过电子邮件客户端使用POP3协议来下载服务器上的邮件到本地机器,并且通常在下载后删除这些邮件。作为邮件协议的另一种标准,IMAP(Internet Message Access Protocol)与之并行发展,两者的主要区别在于对邮件的处理方式。IMAP允许用户在服务器上管理邮件,而POP3则侧重于将邮件下载到本地进行管理。

weixin_36487018的博客 1050

socket数据的发送和接收

下文对计算机socket编程的讲解通俗易懂,对我自己回顾以前的知识,以及学习很有帮助,感谢原作的分享!在此转载。 原文地址:http://c.biancheng.net/cpp/html/3037.html 在 Linux 和 Windows 平台下,使用不同的函数发送和接收 socket 数据,下面我们分别讲解。 Linux下数据的接收和发送 Linux 不区分套接字文件和普通文件,使用...

积累点滴,保持自我 4355

TCP结构体双向收发通信

采用C++开发的服务端和客户端均可运用TCP通信收发结构体信息

AD9361快速锁定实战:Profile寄存器配置与频率调谐算法解析

本文深入解析了AD9361射频收发器的快速锁定(Fast Lock)功能,重点阐述了其核心机制——Profile寄存器配置。通过剖析16字节Profile结构,详细讲解了频率调谐算法,包括LO_DIV、LO_INT、LO_FRAC等关键参数的计算,以及如何通过查表获取优化的环路滤波器参数。文章提供了完整的Python算法示例和FPGA实现要点,旨在帮助工程师实现毫秒级甚至微秒级的频率切换,满足跳频通信等高性能应用需求。

weixin_29196315的博客 229

Socket、send/recv的循环发送和接收、缓冲区、阻塞

这篇文章略作删减后转过来了。主要有以下几点值得自己注意的: (1)刚开头对套接字的理解。 (2)缓冲区的理解。 其他部分有时间重新整理。 套接字的概念及分类 在网络中,要全局的标识一个参与通信的进程,需要三元组:协议,IP地址以及端口号。要描述两个应用进程之间的端到端的通信关联需要五元组:协议,信源主机IP,信源应用进程端口,信宿主机IP,信宿应用进程端口。为了实现两个应用...

mijichui2153的博客 2万+

手把手教你用AppsFlyer SDK实现延迟深度链接(附Android/iOS代码示例)

本文详细介绍了如何使用AppsFlyer SDK实现延迟深度链接,提供Android和iOS双平台代码示例,帮助开发者解决跨平台精准跳转与用户归因问题。通过实战案例和高级场景分析,提升应用的用户转化率和广告投放效果。

sre5engineer的博客 698

c# socket 大数据_socket对于大数据的发送和接收

大数据是指大于32K或者64K的数据。大数据的发送和接收通过TSTREAM对象来进行是非常方便的。我们把大数据分割成一个个4K大小的小包,然后再依次传输。一、大数据的发送的类语言描述:1)创建流对象,用流对象一次性地加载完大数据2)移动流的POSITION,一次将流的4K大小的一块内存读进一块BUF里面3)SOCKET发送这块大小为4K的BUF4)重复执行二、三步骤,直至发完二、大数据的接收的类语...

weixin_39702480的博客 2079

保姆级教程:中科蓝讯Downloader配置详解,从软硬开关机到EQ调音一步到位

本文详细介绍了中科蓝讯Downloader的配置流程,从硬件初始化到音频调优的全方位指南。涵盖软硬开关机选择、电源管理、DAC校准、EQ调音等关键步骤,帮助开发者高效完成配置并避免常见问题。特别适合需要精确控制音频设备和电源管理的中科蓝讯芯片开发者。

weixin_33670786的博客 309

简单初识 Material Point Method(MPM)

简单初识 Material Point Method(MPM):先介绍了Lagrangian和Eulerian,并简单介绍了MPM Method

qq_45776432的博客 7367

socket 发送接收16进制数据

背景:做了个智能柜管理系统,需要和智能柜对接。交互使用的是socket。 转换逻辑: 发送规则:数据(1)---->16进制(0x01)---->高4位(0x00)、低四位(0x01)---->10进制(0、1)---->ansi码(48,49)---->16进制(0x30,0x31)---->发送 ansi如图 发送接收数据:start为码头,en...

一剑轻语 1万+

ORACLE 12C RAC 启动报错,错误代码 ORA-27300,ORA-27301,ORA-27302

非一体机,12.2 无任何补丁,2套X86服务器,1节点集群异常(数据库正常,还有会话),2节点正常工作,负载不高,硬件、空间均未检查到异常,多路径存在掉线的情况,但通过Mulitpath -ll 看又是正常的,2根私有网络,其中一根不同,sysctl中配置的稀疏模式。5、再次加成crs alert ohas等集群日志,以及根据现象和错误再次到后台sr中查找可用信息,发现有一个类似问题,12.2 RAC 无任何补丁,报同样错误,解决方案为重启两套服务器。查询MOS文档以及后台文档,排除上面指出的问题。

weixin_42344665的博客 1464

Java中通过TCP协议发送和接收数据-Socket编程

TCP TCP协议是面向连接、保证高可靠性(数据无丢失、数据无失序、数据无错误、数据无重复到达)传输层协议。 TCP通过三次握手建立连接,通讯完成时要拆除连接,由于TCP是面向连接的所以只能用于端到端的通讯。 Socket     Socket可以说是一种针对网络的抽象,应用通过它可以来针对网络读写数据。根据TCP协议和UDP协议的不同,在网络编程方面就有面向两个协议的不同socket,一

无羁之风的专栏 3万+

【32】OpenCV——图像含义关系?RGGB , BGGR , GRBG , GBRG呢?raw8,raw10,raw12,raw14呢? YUV422; RAW16呢?YCbYCr/RG_GB;

‌如前所述,定义原始数据的位深精度。‌* ‌一种压缩色彩编码方式,通过色度抽样(亮度Y全分辨率,色度U/V半分辨率)减少数据量,常用于视频传输。‌* ‌可能指每个像素分量占16位存储(如高位填充的RAW10/12/14),或未明确量化的高精度原始数据。‌ ‌分类‌核心定义‌关联性及典型应用传感器原始色彩排列(RGGB/BGGR等)决定RAW数据的色彩分布规则RAW位深每个分量的数据精度(8/10/12/14位)影响动态范围和存储空间‌YUV422。

程序员,他们想的是什么?他们想的永远都是技术,他们崇尚的也永远都是技术。 793

南方电网专业面试题(电气类-继电保护)(目录)

南方电网专业面试题(电气类-继电保护)(目录) 这些面试题围绕继电保护的基本概念、工作原理、分类、性能要求,以及变压器、断路器、母线保护、自动重合闸等电力系统关键设备的保护机制和操作原则展开,旨在评估应聘者对电力系统保护和控制策略的深入理解和实际应用能力。

weixin_44808274的博客 2159

c# Socket发送与接收方法

/// /// socket发送字节数组 /// /// 要发送的byte[] /// 服务器IP /// 服务器端口 /// 接收的byte[] public static byte[] SendBySocket(byte[] sendData, string ip, int po

gdjlc的专栏 2万+

YOLOv12改进策略【注意力机制篇】| 2024 PPA 并行补丁感知注意模块,提高小目标关注度(二次改进A2C2f)

本文记录的是利用改进检测精度,详细说明了优化原因,注意事项等。原论文在红外小目标检测任务中,小目标在多次下采样操作中容易丢失关键信息。通过替代编码器和解码器基本组件中的传统卷积操作,更好地保留小目标的重要信息。HCF-Net: Hierarchical Context Fusion Network for Infrared Small Object Detection采用多分支特征提取策略,通过不同分支提取不同尺度和层次的特征。利用局部、全局和串行卷积分支,对输入特征张量进行处理。通过控制 patch si

Limiiiing的博客 1887

如何有效控制c++socket发送和接收数据长度

开始c++ 创建socket编程时候,总是定一个足够大的数组来接收数据,从效率上讲是不科学的,如果能控制发多少接收多少是理想状态,下面例子说明: bool CMySocket::Send(const char *pSMsg, int len) { char* sendBuff = new char[len + 4];//申请发送数组,+4是要发送长度所占的字节数 byte lenBuff[4] = { 0 };//长度数组并初始化 int2bytes(len, lenBuff, ...

zhuimr520的博客 2988

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

c#语言socket编程实例,C# SOCKET发送和接收例子详解

Socket 客户端using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Net;using System.Net.Sockets;namespace A0140_SocketClient.Sample{/// /// 这个类为一个 Socket 客户端的例子./...

weixin_42498347的博客 2077

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

通过UDP发送和接收数据包

发送端: package net.udp; import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; import java.net.SocketException; import java.n

fandoudou123的专栏 1万+

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

上一篇: 【socket编程-07】使用listen()和accept()函数
下一篇: 【socket编程-09】回声客户端的实现
魔方的块
博客等级 码龄11年 1056粉丝 119原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值