首页
AI
爬虫
嵌入式开发
C语言入门视频教程
模电数电
51/52单片机
STM32
Linux嵌入式
文学修养
生活哲理
感动和励志文字
随手乱写
IT计算机
QT学习之路
网站搭建
微信开发
数据库设计
Java
计算机知识
Web程序设计
编程语言
NCRE全国计算机等级考试
关于我们
广告招租
表白网页制作
搜索
登录
搜索
RainFly
明确一个目标,这很重要!
累计撰写
196
篇文章
累计收到
4777
条评论
首页
栏目
首页
AI
爬虫
嵌入式开发
C语言入门视频教程
模电数电
51/52单片机
STM32
Linux嵌入式
文学修养
生活哲理
感动和励志文字
随手乱写
IT计算机
QT学习之路
网站搭建
微信开发
数据库设计
Java
计算机知识
Web程序设计
编程语言
NCRE全国计算机等级考试
关于我们
广告招租
表白网页制作
会声会影X9
会声会影X9
会声会影X9
推荐
谈谈mysql和oracle的使用感受 -- 差异
最新文章
2017-3-31
国内域名供应商将更改至实名认证
国内域名注册商阿里云发布通知称,将对所有域名全面展开域名实名认证工作,如果在5月份还未完成域名实名认证工作,将强制暂停解析域名,使域名无法正常访问,待实名认证通过后方可恢复正常使用。 自2016年8月开始,阿里云所有新注册的网站域名都需要实名认证,完成域名所有者实名认证后才能正常使用,否则域名就会被注册局锁定。此次则涉及到老域名的实名认证,所有2016年前注册或转入的老域名也被要求实名认证。 通知原文如下: 尊敬的用户,您好! 根据《中国互联网络域名管理办法》的规定,域名注册申请者应提交真实、准确、完整的域名注册信息。 按照工信部2017年全面域名实名认证的要求,目前阿里云已接到相关注册局通知,若您的域名在规定时间内未通过实名审核,注册局将暂停解析(Serverhold),无法正常访问。待实名认证通过后方可恢复正常使用。涉及的域名包括:.com/.net /.top/.xyz/.vip /.club/.shop/.wang/.ren: a)截止2017年5月15日,未完成实名认证的.top/.xyz/.vip/.club/.shop/.wang/.ren域名将被注册局暂停解析; b)截止2017年5月31日,未完成实名认证的.com/.net域名将被注册局暂停解析。 请您务必按以下要求,尽快完成以上后缀域名的实名认证,以避免由于未通过实名审核而影响您网站/邮箱或网络应用的正常使用。具体如下: 1、如果您的域名属于上述域名后缀,且目前尚未完成实名认证的,请尽快提交资料完成实名认证审核。 实名认证提交的资料包括: ① 居民身份证扫描件(个人) ②公司营业执照或组织机构代码证扫描件(企业) 2、如果您的域名属于上述域名后缀,目前显示为“已实名认证”,但属于相关注册局实名认证开始时间(详见下表)之前注册的存量历史域名,请注意相关注册局将对其实名认证资料进行核验(二次复审)。 复审结果将于2017年4月1日左右更新,若复审不通过,则需要您重新提交资料进行实名认证。 请您届时留意阿里云系统通知,登录查看复审后域名的实名认证状态,并按提示操作。 3、为了配合尽快完成实名认证审核工作, 自2017年4月30日起,如果您的域名属于上述域名后缀,仍未提交实名认证或审核失败的域名,其管理功能将受到限制,届时您将不能进行新增&修改解析、DNS修改及其他相关等操作。通过实名认证后,上述限制解除。
2017年-3月-31日
10257 阅读
4 评论
计算机知识
2017-1-3
centos 6 编译nodejs环境并部署nodejs应用
该环境安装非常简单,这里简单记录下linux(centos环境下)的源码安装,做个记录。 平台:centos 6 环境:python 2.6 环境安装包地址:http://nodejs.cn/download/ 可以这里下载源码编译。 安装步骤: 1,安装编译代码的开发工具 yum -y groupinstall "Development Tools" 2,下载安装包。 到node官网下载,这里下载源码编译最新安装包:https://nodejs.org/dist/v6.2.0/node-v6.2.0.tar.gz 进入/usr/local/src wget https://nodejs.org/dist/v6.2.0/node-v6.2.0.tar.gz tar zxvf node-v6.2.0.tar.gz cd node-v6.2.0 ./configure make make install 3,安装模块express和forever。 现在已经安装了Node.js, 准备部署应用程序, 首先要使用Node.js的模块管理器npm安装Express middleware 和forever: npm -g install express forever 4,建立超级链接。 ln -s /usr/local/bin/node /usr/bin/node ln -s /usr/local/lib/node /usr/lib/node ln -s /usr/local/bin/npm /usr/bin/npm ln -s /usr/local/bin/node-waf /usr/bin/node-waf ln -s /usr/local/bin/forever /usr/bin/forever 运行node -v可以看到版本说明没问题。 5,部署应用程序。 比如: forever start app.js & 这样扔到后台运行,端口默认1337. 查看运行当中的应用: forever list 退出应用: forever stop 0
2017年-1月-3日
11696 阅读
8 评论
Web程序设计
2016-8-25
利用Wireshark分析TCP/IP协议三次握手
关于wireshark做APP或者网站开发应该不会不熟悉,关于这类查看网络数据封包的工具有很多 Charles ,sniffer ,network monitor, Fiddler等等,当然有的需要收费,这款软件是免费使用的基于WinPcap的网络嗅探工具,当你看到真正的计算机网络协议包,会发现对此了解会网络协议层更加深刻理解。 我所使用的是经过汉化的wireshak喜欢的朋友可以在下方下载,其中包含了使用手册。 开始抓包 wireshark是捕获机器上的某一块网卡的网络包,当你的机器上有多块网卡的时候,你需要选择一个网卡。 点击Caputre->Interfaces.. 出现下面对话框,选择正确的网卡。然后点击"Start"按钮, 开始抓包 WireShark 主要分为这几个界面 1. Display Filter(显示过滤器), 用于过滤 2. Packet List Pane(封包列表), 显示捕获到的封包, 有源地址和目标地址,端口号。 颜色不同,代表 3. Packet Details Pane(封包详细信息), 显示封包中的字段 4. Dissector Pane(16进制数据) 5. Miscellanous(地址栏,杂项) 使用过滤是非常重要的, 初学者使用wireshark时,将会得到大量的冗余信息,在几千甚至几万条记录中,以至于很难找到自己需要的部分。搞得晕头转向。 过滤器会帮助我们在大量的数据中迅速找到我们需要的信息。 过滤器有两种, 一种是显示过滤器,就是主界面上那个,用来在捕获的记录中找到所需要的记录 一种是捕获过滤器,用来过滤捕获的封包,以免捕获太多的记录。 在Capture -> Capture Filters 中设置 在Filter栏上,填好Filter的表达式后,点击Save按钮, 取个名字。比如"Filter 102", Filter栏上就多了个"Filter 102" 的按钮。 表达式规则 1. 协议过滤 比如TCP,只显示TCP协议。 2. IP 过滤 比如 ip.src ==192.168.1.102 显示源地址为192.168.1.102, ip.dst==192.168.1.102, 目标地址为192.168.1.102 3. 端口过滤 tcp.port ==80, 端口为80的 tcp.srcport == 80, 只显示TCP协议的愿端口为80的。 4. Http模式过滤 http.request.method=="GET", 只显示HTTP GET方法的。 5. 逻辑运算符为 AND/ OR 常用的过滤表达式 过滤表达式 用途 http 只查看HTTP协议的记录 ip.src ==192.168.1.102 or ip.dst==192.168.1.102 源地址或者目标地址是192.168.1.102 封包列表(Packet List Pane) 封包列表的面板中显示,编号,时间戳,源地址,目标地址,协议,长度,以及封包信息。 你可以看到不同的协议用了不同的颜色显示。 你也可以修改这些显示颜色的规则, View ->Coloring Rules. 封包详细信息 (Packet Details Pane) 这个面板是我们最重要的,用来查看协议中的每一个字段。 各行信息分别为 Frame: 物理层的数据帧概况 Ethernet II: 数据链路层以太网帧头部信息 Internet Protocol Version 4: 互联网层IP包头部信息 Transmission Control Protocol: 传输层T的数据段头部信息,此处是TCP Hypertext Transfer Protocol: 应用层的信息,此处是HTTP协议 wireshark与对应的OSI七层模型 TCP包的具体内容 从下图可以看到wireshark捕获到的TCP包中的每个字段。 实例分析TCP三次握手过程 看到这, 基本上对wireshak有了初步了解, 现在我们看一个TCP三次握手的实例 三次握手过程为 这图我都看过很多遍了, 这次我们用wireshark实际分析下三次握手的过程。 打开wireshark, 打开浏览器输入 http://www.cnblogs.com/tankxiao 在wireshark中输入http过滤, 然后选中GET /tankxiao HTTP/1.1的那条记录,右键然后点击"Follow TCP Stream", 这样做的目的是为了得到与浏览器打开网站相关的数据包,将得到如下图 图中可以看到wireshark截获到了三次握手的三个数据包。第四个包才是HTTP的, 这说明HTTP的确是使用TCP建立连接的。 第一次握手数据包 客户端发送一个TCP,标志位为SYN,序列号为0, 代表客户端请求建立连接。 如下图 第二次握手的数据包 服务器发回确认包, 标志位为 SYN,ACK. 将确认序号(Acknowledgement Number)设置为客户的I S N加1以.即0+1=1, 如下图 第三次握手的数据包 客户端再次发送确认包(ACK) SYN标志位为0,ACK标志位为1.并且把服务器发来ACK的序号字段+1,放在确定字段中发送给对方.并且在数据段放写ISN的+1, 如下图: 就这样通过了TCP三次握手,建立了连接 本文转自:http://www.cnblogs.com/TankXiao/archive/2012/10/10/2711777.html Wireshark安装包+使用教程来源:百度云网盘 | 大小:22MB | 提取密码:um1w | 解压密码:www.rainfly.cn 已经过安全软件检测无毒,请您放心下载。 若链接失效可联系管理员!
2016年-8月-25日
12228 阅读
3 评论
Web程序设计
2016-8-24
ARM9与远程web服务器交互之灯控实验
摘要:网上又不少历程关于ARM平台的web实验,基本上都是在内网完成的,本地搭建好web服务器,而ARM平台的web服务器不支持内网穿透,继而无法从外网访问控制,或许你有公网IP可以进行端口映射访问,不过本次实验目的不在此,本次主要完成ARM9开发板通过HTTP协议与Apache服务器数据交互。如有错误或者建议,敬请批评指正。 实验设备: EasyARM i.mx283(周立功ARM9板子) linux2.6.35系统 ECS云服务器 具备公网IP 120.27.4.152 (ubunut14.04系统 Apache2+PHP5+MySQL) 配置方法 —>点此 交叉编译工具 arm-none-linux-gnueabi-gcc 宿主机 Ubuntu14.04 语言需求:C ,HTML,JavaScript,jquery,PHP,MySQL,shell脚本(了解) 实验原理: 通过ARM开发板不断向web服务器发送POST/GET请求,来获得服务器返回的数据,数据中携带了light0的value值,通过C对字符串分析获得服务器数据库类light0的value值,来更改P2.4引脚的电平高低,从而达到下位机控灯,至于web页面通过ajax GET方式提交至相应PHP文件,从而修改数据库类light0 的value值。完成web服务器控灯实验 开发板方面不做过多介绍,周立功官网上面提供了手册, 提一下重要操作就是关于灯控的高低点平,/sys/class/gpio/在这个类下面(GPIO驱动已经提供了,先拿来用) 我们按照手册上面所提供的数据建立好一个 68 P2.4引脚的虚拟控制文件, (linux下面一切皆为文件),生成了引脚电平控制文件 /sys/devices/virtual/gpio/gpio68/value 通过echo 1(0) > value 可以更改P2.4引脚高低电平。 C语言文件 #include<stdio.h> #include<stdlib.h> #include<string.h> #include<sys/types.h> #include<sys/socket.h> #include<arpa/inet.h> #include<string.h> #include<fcntl.h> #include<unistd.h> #define IP_ADDR "120.27.4.152" #define ARCHIVE "/data/light.php" #define PORT 80 #define DEV_PATH "/sys/devices/virtual/gpio/gpio68/value" #define HIGH "1" #define LOW "0" int main(int argc, char *argv[]){ int fd; int sockfd; int len; struct sockaddr_in address; int result; char data[1024]; memset(data, 'a', 1024); char httpstring[2048]; sprintf(httpstring,"POST /%s HTTP/1.1\r\n" "Host: %s\r\n" "Content-Length: %d\r\n" "Connection:Close\r\n\r\n" "Content-Type: Application/octet-stream\r\n\r\n" "$name=rainfly" "%s", ARCHIVE, IP_ADDR, strlen(data), data); char ch; sockfd = socket(AF_INET, SOCK_STREAM, 0); address.sin_family = AF_INET; address.sin_addr.s_addr = inet_addr(IP_ADDR); address.sin_port = htons(PORT); len = sizeof(address); result = connect(sockfd,(struct sockaddr *)&address,len); if(result == -1) { perror("oops: client"); return 1; } write(sockfd,httpstring,strlen(httpstring)); while(read(sockfd,&ch,1)) { // printf("%c", ch); } // printf("%c",ch); int a= ch-48;//ASCII change // printf("%d",a); if(a==1) { printf("open"); fd=open(DEV_PATH,O_WRONLY); if(fd<0){printf("open value fail!");} write(fd,HIGH,strlen(HIGH)); close(fd); } else{ printf("close"); fd=open(DEV_PATH,O_WRONLY); if(fd<0){printf("open value fail!");} write(fd,LOW,strlen(LOW)); close(fd); } close(sockfd); printf("\n"); return 0; } 注意: 不管data的数据内容是什么上面我发送的是1024个'a' 虽然这毫无用出,关于这个POST GET提交方式,在本次实验都是可以的携带的data数据并没有实质性作用,(PS:或许在以后的实验中,需要用到数据提交给服务器)。这里仅实现对服务器发送POST请求,然后通过服务器判断是否携带了数据参数来进行输出,或者修改数据库 核心PHP脚本。 /data/light.php <?PHP $lnk = mysql_connect("127.0.0.1:3306","root","Dyf1314520"); if (!$lnk){ die('Could not connect: ' . mysql_error()); } if(mysql_query("CREATE DATABASE smarthome",$lnk)){ mysql_select_db('smarthome', $lnk); $sql = "CREATE TABLE light ( LightName varchar(7), value int )"; mysql_query($sql,$lnk);//创建表结构 mysql_query("INSERT INTO light (LightName, value) VALUES ('light0', '1')"); //插入新表项 } mysql_select_db('smarthome', $lnk); //选中数据库 //带参数访问更改 数据库中 light0的值 if (isset($_GET['light0'])) { $light0=$_GET['light0']; mysql_query("UPDATE light SET value = ".$light0." WHERE LightName = 'light0'"); echo $light0; } else { //如果直接访问就获得数据库数据 $result = mysql_query("SELECT * FROM light WHERE LightName='light0'"); //mysql系的函数中都是逐行读取的,即第一次mysql_fetch_array得到第一行,第二次得到第二行 //实际上一个灯只需要第一行 while($row = mysql_fetch_array($result)) { echo $row['value']; } } ?> 该文件既处理Ajax提交过来的GET请求,将数据库中light0 的value值进行修改,也应答下位机POST请求,将value值通过HTTP协议发送给下位机。 home_light.php 页面AJAX提交源码 //去除str的前后空格 function trim(str){ return str.replace(/^(\s|\u00A0)+/,'').replace(/(\s|\u00A0)+$/,''); } var light0_temp=1; var light0; $(document).ready(function(){ $("#light0").click(function(){ light0_temp = ~ light0_temp; if(light0_temp!='1'){light0=0;} else {light0=1;} //js判断 var url = '/data/light.php'; // 取Form中要提交的链接 var param = {}; // 组装发送参数 param['light0'] = light0; $.get(url, param, function(dom) { dom=trim(dom); if (dom=='1') { $('#light0_img').attr("src","img/light_on.png"); } else { $('#light0_img').attr("src","img/light_off.png"); } }) ; // 发送并显示返回内容 }); }) 源码在下方下载,其余功能正在开发中..... 实验文档来源:360 | 大小:0MB | 提取密码:f579 | 解压密码:www.rainfly.cn 已经过安全软件检测无毒,请您放心下载。 若链接失效可联系管理员!
2016年-8月-24日
10269 阅读
11 评论
Linux嵌入式
2016-8-23
谷歌最新研发Project Soil芯片,可能将结束触摸屏时代
当今科技的飞速发展,许多黑科技不断涌现,或许人们已经厌倦了从手机到平板电脑等大大小小的触摸屏了。当然不可否认触摸屏给我们使用带来了便捷,但是Google依然不懈努力这追求更为科技的方式。
2016年-8月-23日
11254 阅读
4 评论
随手乱写
2016-8-19
ECS云主机Ubuntu14.04搭建Apache2+PHP5+MySQL环境
摘要:所谓好记性不如烂笔头,笔者记忆力太差,虽然对linux也很熟悉,接触了三年多了,但是总是会丢三落四,以前买过的云主机都是用Windows2008,IIS配置PHP MySQL极为方便,也尝试安装了SSL证书,折腾了HTTPS ,但即便是图形界面,步骤却忘记了,所以此次配置全程记录,留已备用。 安装步骤 1.更新软件源 apt-get update 2.安装Apache2 服务器 apt-get install apache2 校验Apache2 是否正常安装 使用apache -v 查看是否正常安装 root@iZ286x0azp7Z:~# apache2 -v Server version: Apache/2.4.7 (Ubuntu) Server built: Jul 28 2016 20:50:32 查看端口是否正常开启 root@iZ286x0azp7Z: netstat -aunpt | grep LISTEN tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 2952/apache2 tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 733/sshd 如果没用选择好配置文件 apt-get 安装 httpd.conf 默认是空没有的 root@iZ286x0azp7Z:/etc/apache2# vi /etc/apache2/apache2.conf 加上ServerName localhost:80 然后重新启动 /etc/init.d/apache2 start 在公网输入IP地址查看Apache是否显示下画面 ( 由于是apt-get的简易安装 所以web root 直接给你定在了/var/www/html/ 下面这是index.html) 3.安装PHP5 apt-get install php5 用 php5 -v 查看输出结果如下 root@iZ286x0azp7Z:~# php5 -v PHP 5.5.9-1ubuntu4.19 (cli) (built: Jul 28 2016 19:26:04) Copyright (c) 1997-2014 The PHP Group Zend Engine v2.5.0, Copyright (c) 1998-2014 Zend Technologies with Zend OPcache v7.0.3, Copyright (c) 1999-2014, by Zend Technologies sudo apt-get install php5-curl 如果函数curl_init(); 不存在 4.查看Apache是否已经加载libphp5.so模块,该模块是Apache用来指挥PHP解析器来执行PHP代码的模块 cat /etc/apache2/mods-enabled/php5.load root@iZ286x0azp7Z:~# cat /etc/apache2/mods-enabled/php5.load LoadModule php5_module /usr/lib/apache2/modules/libphp5.so 表示该模块已经加载了 5.安装MySQL数据库 由于我用的secureCRT中间会出现乱码,其实是设置问题,选项->会话选项->外观->字符编码 后面修改为UTF-8 即可 中间会弹提示输入密码,这是账号root的MySQL数据库管理员密码,输入两次即可。 apt-get install mysql-server 6.检查是否加载了mysql.so的扩展,PHP通过该扩展链接mysql执行CURD操作, root@iZ286x0azp7Z:~# cat /etc/php5/mods-available/mysql.ini cat: /etc/php5/mods-available/mysql.ini: No such file or directory 输入以上命令查看发现 No such file or directory 表示PHP默认没有安装该操作数据库的扩展,需要自行安装 7.安装操作数据库拓展(如果第六步成功可以跳过了) apt-get install php5-mysql root@iZ286x0azp7Z:~# apt-get install php5-mysql Reading package lists... Done Building dependency tree Reading state information... Done E: Unable to locate package php5-mysql 如何出现以上问题,表明需要重新更新一下源 apt-get update 在重新 apt-get install php5-mysql root@iZ286x0azp7Z:~# cat /etc/php5/mods-available/mysql.ini ; configuration for php MySQL module ; priority=20 表示mysql.so扩展已经安装成功。 8.重启mysql和Apache root@iZ286x0azp7Z:~# /etc/init.d/mysql restart root@iZ286x0azp7Z:~# /etc/init.d/apache2 restart 中间问题 当中断输入 mysql -u root -p 命令提示错误解决办法 ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES) #1.停止mysql数据库 /etc/init.d/mysql stop #2.执行如下命令 mysqld_safe --user=mysql --skip-grant-tables --skip-networking & #3.使用root登录mysql数据库 mysql -u root mysql #4.更新root密码 mysql> UPDATE user SET Password=PASSWORD('newpassword') where USER='root'; #5.刷新权限 mysql> FLUSH PRIVILEGES; #6.退出mysql mysql> quit #7.重启mysql /etc/init.d/mysql restart #8.使用root用户重新登录mysql mysql -u root -p Enter password: <输入新设的密码newpassword> MySQL数据库操作命令http://www.rainfly.cn/?post=161 9.给php安装常用扩展 apt-get install php5-gd curl libcurl3 libcurl3-dev php5-curl 10.安装完成之后,重启Apache /etc/init.d/apache2 restart 配置多虚拟主机(这里是将www/目录下放置多个web站点,占未测试 ) 1.创建虚拟目录 现在需要安装虚拟主机,我添加一台虚拟主机命名为rainfly 首先,让我们为rainfly这个站点创建一个目录: mkdir -p /var/www/rainfly/public_html 2.设置所有者和权限 上面目录现在只有root拥有权限。我们需要修改这2个目录的拥有权给普通用户,而不仅仅是root用户。 chown -R $USER:$USER /var/www/rainfly/public_html/ “$USER”变量指向了当前的登录用户。 设置读写权限给apache网页根目录(/var/www)及其子目录,这样每个人都可以从目录中读取文件。 chmod -R 755 /var/www/ 这样,我们就创建好了一些文件夹来保存网络相关数据并分配必要的权限和所属用户。 3.为虚拟主机创建示例页面 现在,我们给网站增加示例页。第一步,让我们给虚拟主机rainfly创建一个示例页。 给rainfly虚拟主机创建一个示例页, vi /var/www/rainfly/public_html/index.html 添加以下内容: <html><head><title>www.rainfly</title></head><body><h1>Welcome To rainfly website</h1></body></html> 保存并关闭文件。 4.创建虚拟主机配置文件 默认情况下,apache有一个默认的虚拟主机文件叫000-default.conf。我们将会复制000-default.conf文件内容到我们新的虚拟主机配置文件中。 cp /etc/apache2/sites-available/000-default.conf /etc/apache2/sites-available/rainfly.conf 确保虚拟主机配置文件末尾包含.conf扩展名。 现在,修改rainfly.conf 文件以符合需求。 vi /etc/apache2/sites-available/rainfly.conf 使相关的变化直接呈现在rainfly站点中(译注:以“#”开头的注释行可以忽略。)。 <VirtualHost *:80># The ServerName directive sets the request scheme, hostname and port that# the server uses to identify itself. This is used when creating# redirection URLs. In the context of virtual hosts, the ServerName# specifies what hostname must appear in the request's Host: header to# match this virtual host. For the default virtual host (this file) this# value is not decisive as it is used as a last resort host regardless.# However, you must set it for any further virtual host explicitly.#ServerName www.example.comServerAdmin webmaster@rainflyServerName rainflyServerAlias www.rainflyDocumentRoot /var/www/rainfly/public_html# Available loglevels: trace8, ..., trace1, debug, info, notice, warn,# error, crit, alert, emerg.# It is also possible to configure the loglevel for particular# modules, e.g.#LogLevel info ssl:warnErrorLog ${APACHE_LOG_DIR}/error.logCustomLog ${APACHE_LOG_DIR}/access.log combined# For most configuration files from conf-available/, which are# enabled or disabled at a global level, it is possible to# include a line for only one particular virtual host. For example the# following line enables the CGI configuration for this host only# after it has been globally disabled with "a2disconf".#Include conf-available/serve-cgi-bin.conf</VirtualHost> 修改虚拟主机文件后,禁用默认的虚拟主机配置(000.default.conf),然后启用新的虚拟主机配置,如下所示。 sudo a2dissite 000-default.conf sudo a2ensite rainfly.conf sudo a2ensite unixmen2.local.conf (已经使root用户不用sudo) 最后,重启apache服务器。 /etc/init.d/apache2 restart 就是这样。现在,我们成功地配置了apach虚拟主机在我们的Ubuntu服务器上 参考文献:http://httpd.apache.org/docs/2.4/
2016年-8月-19日
7576 阅读
1 评论
Web程序设计
2016-8-17
网络编程socket之bind函数
摘要 :在套接口中,一个套接字只是用户程序与内核交互信息的枢纽,它自身没有太多的信息,也没有网络协议地址和端口号等信息,在进行网络通信的时候,必须把一个套接字与一个地址相关联,这个过程就是地址绑定的过程。许多时候内核会我们自动绑定一个地址,然而有时用户可能需要自己来完成这个绑定的过程,以满足实际应用的需要,最典型的情况是一个服务器进程需要绑定一个众所周知的地址或端口以等待客户来连接。这个事由 bind的函数完成。 从bind函数功能我们很容易推测出这个函数的需要的参数与相应的返回值,如果此时大家已经对socket接口有点熟悉了: #include<sys/socket.h> int bind( int sockfd, struct sockaddr* addr, socklen_t addrlen) 返回:0 ──成功, - 1 ──失败 参数sockfd 指定地址与哪个套接字绑定,这是一个由之前的socket函数调用返回的套接字。调用bind的函数之后,该套接字与一个相应的地址关联,发送到这个地址的数据可以通过这个套接字来读取与使用。 参数addr 指定地址。这是一个地址结构,并且是一个已经经过填写的有效的地址结构。调用bind之后这个地址与参数sockfd指定的套接字关联,从而实现上面所说的效果。 参数addrlen 正如大多数socket接口一样,内核不关心地址结构,当它复制或传递地址给驱动的时候,它依据这个值来确定需要复制多少数据。这已经成为socket接口中最常见的参数之一了。 bind函数并不是总是需要调用的,只有用户进程想与一个具体的地址或端口相关联的时候才需要调用这个函数。如果用户进程没有这个需要,那么程序可以依赖内核的自动的选址机制来完成自动地址选择,而不需要调用bind的函数,同时也避免不必要的复杂度。在一般情况下,对于服务器进程问题需要调用 bind函数,对于客户进程则不需要调用bind函数。 bind函数 int bind(SOCKET s,const struct sockaddr FAR *name,int namelen); 当创建了一个Socket以后,套接字数据结构中有一个默认的IP地址和默认的端口号。一个服务程序必须调用bind函数来给其绑定一个IP地址和一个特定的端口号。客户程序一般不必调用bind函数来为其Socket绑定IP地址和断口号。该函数的第一个参数指定待绑定的Socket描述符;第二个参数指定一个sockaddr结构,该结构是这样定义的: struct sockaddr {u_short sa_family;char sa_data[14];}; 其中sin_family置AF_INET;sin_port指明端口号;sin_addr结构体中只有一个唯一的字段s_addr,表示IP地址,该字段是一个整数,一般用函数inet_addr()把字符串形式的IP地址转换成unsigned long型的整数值后再置给s_addr。有的服务器是多宿主机,至少有两个网卡,那么运行在这样的服务器上的服务程序在为其Socket绑定IP地址时可以把htonl(INADDR_ANY)置给s_addr,这样做的好处是不论哪个网段上的客户程序都能与该服务程序通信;如果只给运行在多宿主机上的服务程序的Socket绑定一个固定的IP地址,那么就只有与该IP地址处于同一个网段上的客户程序才能与该服务程序通信。我们用0来填充 sin_zero数组,目的是让sockaddr_in结构的大小与sockaddr结构的大小一致。下面是一个bind函数调用的例子: struct sockaddr_in saddr; saddr.sin_family = AF_INET; saddr.sin_port = htons(8888); saddr.sin_addr.s_addr = htonl(INADDR_ANY); bind(ListenSocket,(struct sockaddr *)&saddr,sizeof(saddr));
2016年-8月-17日
5160 阅读
3 评论
Linux嵌入式
2016-8-16
通过PHP、JavaScript、判断是否为手机浏览器
总结一下,做个笔记。判断访问浏览器是电脑还是手机的判断方法。 一个是服务器执行语言,一个是浏览器运行语言 PHP 方法一 /** * * 根据php的$_SERVER['HTTP_USER_AGENT'] 中各种浏览器访问时所包含各个浏览器特定的字符串来判断是属于PC还是移动端 * @author discuz3x * @lastmodify 2014-04-09 * @return BOOL */ function checkmobile() { global $_G; $mobile = array(); //各个触控浏览器中$_SERVER['HTTP_USER_AGENT']所包含的字符串数组 static $touchbrowser_list =array('iphone', 'android', 'phone', 'mobile', 'wap', 'netfront', 'java', 'opera mobi', 'opera mini', 'ucweb', 'windows ce', 'symbian', 'series', 'webos', 'sony', 'blackberry', 'dopod', 'nokia', 'samsung', 'palmsource', 'xda', 'pieplus', 'meizu', 'midp', 'cldc', 'motorola', 'foma', 'docomo', 'up.browser', 'up.link', 'blazer', 'helio', 'hosin', 'huawei', 'novarra', 'coolpad', 'webos', 'techfaith', 'palmsource', 'alcatel', 'amoi', 'ktouch', 'nexian', 'ericsson', 'philips', 'sagem', 'wellcom', 'bunjalloo', 'maui', 'smartphone', 'iemobile', 'spice', 'bird', 'zte-', 'longcos', 'pantech', 'gionee', 'portalmmm', 'jig browser', 'hiptop', 'benq', 'haier', '^lct', '320x320', '240x320', '176x220'); //window手机浏览器数组【猜的】 static $mobilebrowser_list =array('windows phone'); //wap浏览器中$_SERVER['HTTP_USER_AGENT']所包含的字符串数组 static $wmlbrowser_list = array('cect', 'compal', 'ctl', 'lg', 'nec', 'tcl', 'alcatel', 'ericsson', 'bird', 'daxian', 'dbtel', 'eastcom', 'pantech', 'dopod', 'philips', 'haier', 'konka', 'kejian', 'lenovo', 'benq', 'mot', 'soutec', 'nokia', 'sagem', 'sgh', 'sed', 'capitel', 'panasonic', 'sonyericsson', 'sharp', 'amoi', 'panda', 'zte'); $pad_list = array('pad', 'gt-p1000'); $useragent = strtolower($_SERVER['HTTP_USER_AGENT']); if(dstrpos($useragent, $pad_list)) { return false; } if(($v = dstrpos($useragent, $mobilebrowser_list, true))){ $_G['mobile'] = $v; return '1'; } if(($v = dstrpos($useragent, $touchbrowser_list, true))){ $_G['mobile'] = $v; return '2'; } if(($v = dstrpos($useragent, $wmlbrowser_list))) { $_G['mobile'] = $v; return '3'; //wml版 } $brower = array('mozilla', 'chrome', 'safari', 'opera', 'm3gate', 'winwap', 'openwave', 'myop'); if(dstrpos($useragent, $brower)) return false; $_G['mobile'] = 'unknown'; //对于未知类型的浏览器,通过$_GET['mobile']参数来决定是否是手机浏览器 if(isset($_G['mobiletpl'][$_GET['mobile']])) { return true; } else { return false; } } /** * 判断$arr中元素字符串是否有出现在$string中 * @param $string $_SERVER['HTTP_USER_AGENT'] * @param $arr 各中浏览器$_SERVER['HTTP_USER_AGENT']中必定会包含的字符串 * @param $returnvalue 返回浏览器名称还是返回布尔值,true为返回浏览器名称,false为返回布尔值【默认】 * @author discuz3x * @lastmodify 2014-04-09 */ function dstrpos($string, $arr, $returnvalue = false) { if(empty($string)) return false; foreach((array)$arr as $v) { if(strpos($string, $v) !== false) { $return = $returnvalue ? $v : true; return $return; } } return false; } 方法二 <?php function isMobile() { // 如果有HTTP_X_WAP_PROFILE则一定是移动设备 if (isset ($_SERVER['HTTP_X_WAP_PROFILE'])) { return true; } // 如果via信息含有wap则一定是移动设备,部分服务商会屏蔽该信息 if (isset ($_SERVER['HTTP_VIA'])) { // 找不到为flase,否则为true return stristr($_SERVER['HTTP_VIA'], "wap") ? true : false; } // 脑残法,判断手机发送的客户端标志,兼容性有待提高 if (isset ($_SERVER['HTTP_USER_AGENT'])) { $clientkeywords = array ('nokia', 'sony', 'ericsson', 'mot', 'samsung', 'htc', 'sgh', 'lg', 'sharp', 'sie-', 'philips', 'panasonic', 'alcatel', 'lenovo', 'iphone', 'ipod', 'blackberry', 'meizu', 'android', 'netfront', 'symbian', 'ucweb', 'windowsce', 'palm', 'operamini', 'operamobi', 'openwave', 'nexusone', 'cldc', 'midp', 'wap', 'mobile' ); // 从HTTP_USER_AGENT中查找手机浏览器的关键字 if (preg_match("/(" . implode('|', $clientkeywords) . ")/i", strtolower($_SERVER['HTTP_USER_AGENT']))) { return true; } } // 协议法,因为有可能不准确,放到最后判断 if (isset ($_SERVER['HTTP_ACCEPT'])) { // 如果只支持wml并且不支持html那一定是移动设备 // 如果支持wml和html但是wml在html之前则是移动设备 if ((strpos($_SERVER['HTTP_ACCEPT'], 'vnd.wap.wml') !== false) && (strpos($_SERVER['HTTP_ACCEPT'], 'text/html') === false || (strpos($_SERVER['HTTP_ACCEPT'], 'vnd.wap.wml') < strpos($_SERVER['HTTP_ACCEPT'], 'text/html')))) { return true; } } return false; } ?> JavaScript if (navigator['userAgent']['match'](/(iPhone|iPod|Android|ios|Nokia|Black Berry|MIDP|Phone)/i)) { //是手机浏览器 } else{ //是电脑浏览器 }
2016年-8月-16日
10567 阅读
2 评论
Web程序设计
2016-8-15
HTTP协议原理结构分析
1.协议特点 a.C/S模式 b.客户端向服务器发出Request 只需传送请求方法和路径, 通信速度快 方法: GET 通过请求URI得到资源 浏览器向服务器一般请求 POST,用于添加新的内容 发送form表单 PUT 用于修改某个内容 DELETE, 删除某个内容 CONNECT, 用于代理进行传输,如使用SSL OPTIONS 询问可以执行哪些方法 PATCH, 部分文档更改 PROPFIND 查看属性 PROPPATCH 设置属性 MKCOL 创建集合(文件夹) COPY 拷贝 MOVE 移动 LOCK 加锁 UNLOCK 解锁 TRACE 用于远程诊断服务器 HEAD 类似于GET, 但是不返回body信息,用于检查对象是否存在,以及得到对象的元数据 c. 传输类型很灵活:只需要给它加上Content-Type MIME类型值即可 d.发送完请求报文,立即和服务器断开连接(PS:虽然TCP的80端口可以建立多个Socket连接但是如果连接过多服务器响应其他请求放慢),服务器所需要完成的是将端口接受请求放入等待队列,根据算法进行选择相应的连接请求进行处理。 节省了客户端进行等待的时间 e.发送完数据包之后,如果服务器不Response,需要将所有的数据包重新发送。 2.文件格式 Request: 请求报文格式 请求报文可以用Google浏览器进行查看其发送 发送的报文实例 POST报文头如下: POST /sn/index.php HTTP/1.1 Accept: */* Accept-Language: zh-cn host: localhost Content-Type: application/x-www-form-urlencoded Content-Length: 12 Connection:close sn=123&n=asa 在http头后边有一空行,空行后边接着发送post数据,长度通过Content-Length: 12 指出,此post数据中包含两项 sn=123 n=asa 其中:Content-Type: application/x-www-form-urlencoded 指定POST数据的编码类型 Content-Length: 12 POST数据的长度 GET: GET报问头如下: GET /sn/index.php?sn=123&n=asa HTTP/1.1 Accept: */* Accept-Language: zh-cn host: localhost Content-Type: application/x-www-form-urlencoded Content-Length: 12 Connection:close Response :响应报文格式 相应阶段报文,给一个API 调试工具 使用GET请求获得数据 http://apistore.baidu.com/astore/toolshttpproxy 我给http:www.baidu.com服务器发送了一个GET请求下面是相应回复的报文 Response Header HTTP/1.1 200 OK Date: Tue, 16 Aug 2016 01:58:22 GMT Content-Type: text/html; charset=utf-8 Transfer-Encoding: chunked Connection: Keep-Alive Vary: Accept-Encoding Set-Cookie: BAIDUID=E6BADB45ADCAFAF36BAE6C63E46613C9:FG=1; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com Set-Cookie: BIDUPSID=E6BADB45ADCAFAF36BAE6C63E46613C9; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com Set-Cookie: PSTM=1471312702; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com Set-Cookie: BDSVRTM=0; path=/ Set-Cookie: BD_HOME=0; path=/ Set-Cookie: H_PS_PSSID=1465_18241_17949_18560_17001_11693_20848_20856_20837_20771_20719; path=/; domain=.baidu.com P3P: CP=" OTI DSP COR IVA OUR IND COM " Cache-Control: private Cxy_all: baidu+955142e509dca9cdda759e1be73fb859 Expires: Tue, 16 Aug 2016 01:57:59 GMT X-Powered-By: HPHP Server: BWS/1.1 X-UA-Compatible: IE=Edge,chrome=1 BDPAGETYPE: 1 BDQID: 0xc83e2bbf001302cc BDUSERID: 0 Content-Encoding: gzip 这里可以看到对应上面图二的结果 版本信息:HTTP/1.1 HTTP 1.1中的五类状态码: 100-199 用于指定客户端应相应的某些动作。 200-299 用于表示请求成功。 300-399 用于已经移动的文件并且常被包含在定位头信息中指定新的地址信息。 400-499 用于指出客户端的错误。 500-599 用于支持服务器错误。 OK:就是OK 剩余的都是头部行,携带了一些关于发送时间 格式 编码之类的信息 Content-Encoding: gzip 此处是指服务器将Response文件进行GZIP压缩, 当客户端接收后根据Content-Encoding: gzip执行解压缩 (这种方法会降低服务器宽带压力,但是增加了服务器压力,加快网页打开速度) 对文件部分解码的到了Response Body, 就是HTML信息。 在HTTP协议是建立在TCP/IP传输控制协议基础上的,所以所有的文件必须是客户端和服务器TCP三次握手已经建立连接,后面我还会继续了解剖学习 , 还会用C语言实现 HTTP FTP等应用层协议!
2016年-8月-15日
6040 阅读
1 评论
Linux嵌入式
2016-8-12
分享CSS常用图标库
图标在web前端设计和app开发中作为可视化一个重要元素,部分网站为了使图片性质标志很难自适应,而且重复项目重复量多,现在提供两个常用的纯CSS图标库,只需要引用一样样式文本,就可以在任意轻松使用 1.Font Awesome一个支持可缩放的矢量图标 官网详情:http://fontawesome.dashgame.com/ 该字库含有585个图标基本上都能满足需要。 head 部位加上应用css样式路径, <link href="//netdna.bootstrapcdn.com/font-awesome/4.5.0/css/font-awesome.min.css" rel="stylesheet"> Font Awesome是为使用内联元素而设计的。我们通常更喜欢使用 <i> ,因为它更简洁。 但实际上使用 <span> 所以在需要插入的图标的地方加上 <i class="fa fa-camera-retro"></i> fa-camera-retro 使用i标签很简洁明了。由于是文本类型的图标,所以修改了容器文字样式图标也会随之变化的。所以修改图标样式你可以直接用容器来修改,也可以使用官网提供的一些class来,调整大小颜色阴影。需要可以去看看。 2.icono 官网详情:http://saeedalipoor.github.io/icono/ 同上面的图标使用方法一样,仅仅只需要一个标签就可以实现纯css3的图标 使用方法: head嵌入 <link rel="stylesheet" href="icono.min.css"> 需要使用的地方直接插入标签即可 <i class="icono-mail"></i> <div class="icono-mail"></div> <span class="icono-mail"></span> <whatever class="icono-mail"></whatever>
2016年-8月-12日
15414 阅读
4 评论
Web程序设计
2016-8-11
网盘分享密码破解器
网上有部分资源提供了链接但是分享码没有,或者通过某些渠道的找到了分享链接,但是苦于没有分享秘密,而无法获取资源,近期在为此问题上,做了一番寻找,提供了一个暴力破解四位分享码的程序。占没有测试先拿出来 对应网盘分享的Url地址,设置好跑字典频率,就开始耐心等待完成吧!
此处内容已隐藏
2016年-8月-11日
55519 阅读
262 评论
软件分享
3
4
5
6
7