什么情况下socket可读取

采用Java阻塞IO对已经到达的socket流实现非阻塞完整读取(一个简单的java http server实现) 最近写服务器时想到一个问题:用Java Bio(即Socket)写服务器,怎么一次性完整读取已经到达的Socket流。 对这个需求有很多角度的设定,也有很多解法。我们来一一具化这个需求: (1) 解法:依赖http协议的content-length。 分析:很直观的想法,可以根据http请求头给定一个固定长度的字节或字符缓存,从中获取content-length,就知道往后要在从流 阅读详情

参考 《UNIX 网络编程卷1》中的《第6章 I/O复用》

 

一、 满足下列四个条件中的任何一个时,一个套接字准备好读。

该套接字接收缓冲区中的数据字节数大于等于套接字接收缓存区低水位。对于TCP和UDP套接字而言,缓冲区低水位的值默认为1。那就意味着,默认情况下,只要缓冲区中有数据,那就是可读的。我们可以通过使用SO_RCVLOWAT套接字选项(参见setsockopt函数)来设置该套接字的低水位大小。此种描述符就绪(可读)的情况下,当我们使用read/recv等对该套接字执行读操作的时候,套接字不会阻塞,而是成功返回一个大于0的值(即可读数据的大小)。

该连接的读半部关闭(也就是接收了FIN的TCP连接)。对这样的套接字的读操作,将不会阻塞,而是返回0(也就是EOF)。

该套接字是一个listen的监听套接字,并且目前已经完成的连接数不为0。对这样的套接字进行accept操作通常不会阻塞。

有一个错误套接字待处理。对这样的套接字的读操作将不阻塞并返回-1(也就是返回了一个错误),同时把errno设置成确切的错误条件。这些待处理错误(pending error)也可以通过指定SO_ERROR套接字选项调用getsockopt获取并清除。

 

二、满足下列四个条件中的任何一个时,一个套接字准备好写。

该套接字发送缓冲区中的可用空间字节数大于等于套接字发送缓存区低水位标记时,并且该套接字已经成功连接(UDP套接字不需要连接)。对于TCP和UDP而言,这个低水位的值默认为2048,而套接字默认的发送缓冲区大小是8k,这就意味着一般一个套接字连接成功后,就是处于可写状态的。我们可以通过SO_SNDLOWAT套接字选项(参见setsockopt函数)来设置这个低水位。此种情况下,我们设置该套接字为非阻塞,对该套接字进行写操作(如write,send等),将不阻塞,并返回一个正值(例如由传输层接受的字节数,即发送的数据大小)。

该连接的写半部关闭(主动发送FIN包的TCP连接)。对这样的套接字的写操作将会产生SIGPIPE信号。所以我们的网络程序基本都要自定义处理SIGPIPE信号。因为SIGPIPE信号的默认处理方式是程序退出。

使用非阻塞的connect套接字已建立连接,或者connect已经以失败告终。即connect有结果了。

有一个错误的套接字待处理。对这样的套接字的写操作将不阻塞并返回-1(也就是返回了一个错误),同时把errno设置成确切的错误条件。这些待处理的错误也可以通过指定SO_ERROR套接字选项调用getsockopt获取并清除。

 
原文链接
原文:https://blog.youkuaiyun.com/libaineu2004/article/details/85764355 
 

Flutter 直接调用so动态库,或调用C/C++源文件内函数 我把 .so 文件尝试放过好几个目录/lib/,最终都会报这个错误,现在才知道库文件需要放在你根本想象不到的地方!!!尝试了一些方法还是不行后我放弃了 ffi,想着用 Flutter 的 MethodChannel 桥接 android/ios 原生,再让原生去调 native 层。一顿操作把Android端的搞定了,当然中间涉及到 Kotlin和C++ 层的数据类型映射的痛苦,而且业务函数也不像一个 helloworld 那么简单,别提有多痛苦了。 阅读详情

相关推荐

AMSR-2数据下载实战:从JAXA到LPRM的算法选择与效率优化

本文详细介绍了AMSR-2数据的下载实战,重点对比了JAXA与LPRM算法的差异及适用场景,并提供了高效下载方案和网络优化策略。通过实际案例和代码示例,帮助用户快速获取和处理AMSR-2数据,提升研究效率。

rl6adventurer的博客 691

socket可读可写就绪条件

参考《UNIX 网络编程卷1》中的《第6章 I/O复用》 一、 满足下列四个条件中的任何一个时,一个套接字准备好读。 该套接字接收缓冲区中的数据字节数大于等于套接字接收缓存区低水位。对于TCP和UDP套接字而言,缓冲区低水位的值默认为1。那就意味着,默认情况下,只要缓冲区中有数据,那就是可读的。我们可以通过使用SO_RCVLOWAT套接字选项(参见setsockopt函数...

weixin_30457551的博客 351

一分钟教会你搭建steam新游幻兽帕鲁服务器

总结: 游戏对服务器搭建要求相对较高、且对服务器网络协议有要求不能封堵UDP、多开、游戏运行久、同时在线人数多了这些会很吃内存 我自己用的64G内存多开4区测试玩家同时在线50多人的情况下内存已经跑满了、对于想用服务器搭建联机的小伙伴建议根据开区数量以及玩家人数去选择配置、当然也可以直接找我阿杰购买、我可以提供技术搭建服务。注:如果用的是本地电脑局域网搭建直接输入127.0.0.1:8211就行 如果用的是服务器搭建输入自己服务器IP+端口或解析的域名+端口进入游戏。

用最简单的方式说最重要的事!服务器、存储、云计 算、A智能的大数据产品、游戏开发技术。致力于广 大开发者、政企用户、各项机构等,构建云上世界提供全方位云计算解决方案。旨在打造差异化的开放式闭环生态系统帮助用户快速构建稳定、安全的云计算环境。 2235

socket什么情况下可读

socket什么情况下可读 1.socket接收缓冲区中已经接收的数据的字节数大于等于socket接收缓冲区低潮限度的当前值 2.连接的读一半关闭(即:接收到对方发过来的FIN的TCP连接),并且返回0; 3.socket收到了对方的connect请求已经完成的连接数为非0.这样的soocket处于可读状态; 4.异常的情况下socket的读操作将不会阻塞,并且返回一个错误(-1)。 ...

9868

生产环境下oracle19c rac恢复节点2

现状:目前节点1数据库集群服务处于正常,节点2服务器由于系统故障无法恢复,确认系统重装。目标:不影响业务的情况下,重新把节点2添加回集群中。

sqlora的专栏 867

Matlab Copula函数实战:从金融风控到数据建模的5个应用场景

本文深入探讨了Matlab Copula函数在金融风控与数据建模中的五大实战应用场景,包括投资组合风险价值计算、信用违约相关性建模、跨市场套利策略优化等。通过具体代码示例和数据分析,展示了Copula模型在捕捉复杂依赖关系方面的优势,为金融风险管理和量化分析提供实用工具。

weixin_29090677的博客 425

socket可读和可写的条件

一、下列四个条件中的任何一个满足时,socket准备好读: 1,socket接收缓冲区中已经接收的数据的字节数大于等于socket接收缓冲区低潮限度的当前值;对这样的socket的读操作不会阻塞,并返回一个大于0的值(即:准备好读入的数据的字节数).我们可以用socket选项SO_RCVLOWAT来设置此低潮限度,对于TCP和UDPsocket,其缺省值为1; 2,连接的读这一半关闭...

sanliangGoGoGo 1191

Oracle MCP Server实战:自然语言如何重塑数据库交互体验

本文深入探讨了Oracle MCP Server如何通过自然语言交互技术革新数据库操作体验。作为Oracle数据库的革命性工具,MCP Server集成了先进的Text-to-SQL技术,允许用户使用自然语言直接查询数据库,大幅降低使用门槛。文章详细介绍了从环境搭建、实战案例到企业级部署的全流程,特别强调了中文自然语言处理能力和安全最佳实践,为DBA和开发者提供了从传统SQL到智能交互的转型指南。

u9v0w的博客 284

FIONREAD 判断 socket有多少数据可读

Ioctl(sockfd, FIONREAD, &npend); /* check FIONREAD support */ 检查 sockfd 表示的文件描述符中有多少数据可以读取

weixin_40021744的博客 1629

华为ONU远程登录管理配置

华为P602E、EG8040CONU、EG8240H5、W626E等ONU、ONT默认无法配置管理IP,无法远程telnet登录管理。校园网项目中因故障诊断需要远程登录ONU可以通过OLT的远程WEB代理功能链接登录,具体配置如下:

symstandsun的博客 6109

用python画带有正负值的条形图

常见的条形图只能表现数据的大小,却不能表现值的正负关系。但是其实仅仅使用`pandas`和`matplotlib`两个包就可以实现y轴负轴的添加以及负值的显示,并且可以为正负值分别设置不同的颜色,让条形图看上去更加清晰,易于我们分析

weixin_44853840的博客 5384

一个完整的读Socket中字节的方法

如果在socket中有下面这种情况发生,就不能使用,一般的方法读取socket中的字节Socket socket=new Socket(ip,port);  socket.setSendBufferSize(1);  socket.getOutputStream().write("nihaoddddddddddddddd".getBytes());  socket.getOutputStream(

ewsl的专栏 5455

056:vue+openlayers 风场快速移动效果(图文代码)

本示例的目的是介绍演示如何在vue+openlayers中使用wind插件来实现风场快速移动的效果。

大剑师兰特的GIS世界 1582

Socket清空缓存区

情况一:知晓缓存区中数据的大小 这种情况应该就不用多说了,直接循环的把数据都读取出来就行了。 情况二:不知道缓存区中数据的大小 方案一 close一次socket,这个方案有效是有效,但这样的小问题还不至于如此大动干戈,因此不建议使用。 方案二 使用recv来读取,但是在阻塞模式下效率低下,因为在不知道数据的情况下,在最后一次读取的情况下需要等待到超时才会知道数据是否读取完毕。 方案三 使用fg...

姑苏流白 2万+

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

深度学习工具包 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")

linux下的socket的read,socket网络编程中read与recv区别

1、read 与 recv 区别read 原则:数据在不超过指定的长度的时候有多少读多少,没有数据则会一直等待。所以一般情况下:我们读取数据都需要采用循环读的方式读取数据,因为一次read 完毕不能保证读到我们需要长度的数据,read 完一次需要判断读到的数据长度再决定是否还需要再次读取。recv 原则:recv 中有一个MSG_WAITALL 的参数:recv(sockfd, buff, buf...

weixin_35148673的博客 1739

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

java socket 字节读取_java – 从socket读取所有数据

我希望同步读取所有数据,从客户端或服务器接收而不使用java中的readline()方法(如c中的readall()).我不想使用下面的代码:BufferedReader reader = new BufferedReader(new inputStreamReader(socket.getInputStream()));String line = null;while ((line = read...

weixin_34524284的博客 1441

计算机控制技术及应用

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

Socket 关于设置Socket连接超时时间

Socket 关于设置Socket连接超时时间 博客分类:  网络编程 tcpsocket崔素强jdk超时  做网络编程的人对setSoTimeout方法一定很熟悉,都知道是设置连接的超时时间! 但是我在网上找资料时发现很多人把这个超时时间理解成了链路的超时时间!我看了一下JDK 关于这个方法的说明,其实根本不是链路的超时时间!   Java代码 

Stroller 2万+

php socket框架,用PHP实现的服务端socket具体实例

实现方法如下:使用到的相关函数: socket_create、socket_set_block、socket_bind、socket_listen、socket_accept、socket_read、socket_write,这些函数具体参数说明在PHP文档上写很详细,这里就不再赘述,这里只是介绍服务端如何处理请求。具体实例://确保在连接客户端时不会超时set_time_limit(0);//设...

weixin_31678781的博客 389

Socket

做项目过程中,遇到Socket长连接,以及客户端断掉之后重连等问题。   /* * 缓存队列处理线程 * 1、建立socket长连接 * 2、消费缓存队列数据发给logAgent * 3、断点自动重连 * **/ public class DataProcessClient { private String serverIp; private int port; ...

qq_34137395的博客 201

java socket 通信中的易错点

1.当socket 关闭了或者由于网络中断和服务器端断掉了连接时。不会主动的通知服务器端 除非服务器端writer 写入数据发生异常。才会发现服务已经断掉了。 2. 但 socket 客户端 调用了socket.close()的方法。 server端 的read 始终读取到了值是-1.(除非发生网络中断的时候才会抛出异常)显示流已经读取的末尾。除非 sever端调用writer方法 发生异...

mayaJAVA123456的博客 215

socket网络编程中read与recv区别

socket网络编程中read与recv区别使用read接收文件,由于传过来的文件大小错误,结果导致程序卡死在read处,之后改用recv接收。 recv使用MSG_DONTWAIT,在发现多次接收长度小于等于0时,中断接收返回。 下面是摘抄的一段read和recv区别的介绍。1、read 与 recv 区别read 原则:数据在不超过指定的长度的时候有多少读多少,没有数据则会一直等待。所以一般情...

孤独行者的专栏 856

socket编程send()函数和recv函数

参考:https://blog.youkuaiyun.com/wangzhida2008/article/details/72901938文章整理。 intsend(SOCKETs,constcharFAR*buf,intlen,intflags); send函数是将数据拷贝到socket发送缓冲区中。 拷贝过程中存在各种情况: 假设socket发送缓冲区的长度为 sendLength; 比较拷贝数据的大小len与发送缓冲区的大小sendLength的值, ...

modi000的博客 637

Python3的tcp socket接收不定长数据包接收到的数据不全。

Python Socket API参考出处:http://blog.youkuaiyun.com/xiangpingli/article/details/47706707   使用socket.recv(pack_length)接收不定长的数据,如果数据包长度超过一定值,则接收的数据不全,同时还会多触发一次 socket.recv().   参照python3.4的文档可发现: socket.rec...

weixin_34280237的博客 2702

java socket通讯中文乱码问题

至于为什么这么写是因为网上发现有帖子说:“在服务端默认的编码情况下,JAVA的SOCKET接收需要GBK编码,而C#的接收需要UTF-8编码。可以很明显的看到,我在进行读服务器发送的信息时,我的编码集为UTF-8,直接将UTF-8改为GBK。接下来是写的操作同等原理。...

m0_67392931的博客 1545

java socket不关闭_Java:如何无例外地停止服务器(关闭Socket)?

我做了一个服务器,可以加入许多客户.但是我有一个问题.我添加了启动/停止按钮,它应该启动/停止服务器.但是代码无法按我想要的方式工作:未关闭连接,代码转到IOException“这是问题”(在ServerLogic部分中).此外,客户端仍可以与服务器联系.服务器逻辑public class ServerLogic{private static ServerSocket m_sSocket;priv...

weixin_34420979的博客 639

Reading socket is slow

Reading socket is slow Reading socket is slow - Cwhile ((return_count = socket_read(socket_number, &receive_str[i], 5120)) > 0...

136
上一篇: Python复合语句with的用法
下一篇: 伪随机数,随机数种子
lsfreeing
博客等级 码龄12年 145粉丝 147原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值