单片机TCP/IP

WEB2.0 jackxiang 2009-10-17 13:28
1 概述 阅读全文
总体说来,TCPIP并不是一件十分神秘的事情,尤其是基于MCU的应用,不要求进行特别复杂的处理,很多情况下只需要实现最最基本的功能就行了。在实现MCU的TCPIP移植之前,必须对TCPIP有一定程度的了解,可以找一本合适的书籍来翻阅一下,《TCP/IP详解,卷1:协议》http://www.laogu.com/display.aspx?did=510是一本完整而详细的TCP/IP协议指南。描述了属于每一层的各个协议以及它们如何在不同操作系统中运行。
对于TCPIP在MCU上的应用并不要求对协议的所有部分都了解的那么清楚,重点需要了解TCPIP的各个层次的关系,链路层,有时也称作数据链路层或网络接口层,通常包括操作系统中的设备驱动程序和计算机中对应的网络接口卡。它们一起处理与电缆(或其他任何传输媒介)的物理接口细节。网络层,有时也称作互联网层,处理分组在网络中的活动,例如分组的选路。在T C P / I P协议族中,网络层协议包括I P协议(网际协议),I C M P协议(I n t e r n e t互联网控制报文协议),以及I G M P协议(I n t e r n e t组管理协议)。 运输层主要为两台主机上的应用程序提供端到端的通信。在T C P / I P协议族中,有两个互不相同的传输协议: T C P(传输控制协议)和U D P(用户数据报协议)。T C P为两台主机提供高可靠性的数据通信。它所做的工作包括把应用程序交给它的数据分成合适的小块交给下面的网络层,确认接收到的分组,设置发送最后确认分组的超时时钟等。由于运输层提供了高可靠性的端到端的通信,因此应用层可以忽略所有这些细节。而另一方面, U D P则为应用层提供一种非常简单的服务。它只是把称作数据报的分组从一台主机发送到另一台主机,但并不保证该数据报能到达另一端。任何必需的可靠性必须由应用层来提供。这两种运输层协议分别在不同的应用程序中有不同的用途。应用层负责处理特定的应用程序细节。几乎各种不同的T C P / I P实现都会提供Telnet,FTP,SMTP 简单邮件传送协议,SNMP简单网络管理协议这些通用的应用程序。
各种类型的数据报格式也是需要了解的重点,使用Sniffer软件可以十分方便的在电脑上查看各种数据报的收发状态.同时Sniffer也是以后调试TCPIP协议寨的一个很有用的工具,Sniffer的使用方式可以在www.google.com上很方便的搜索到.
TCP/IP的分层,以太网封装,IP首部,子网寻址和子网掩码,ARP地址解析协议,ICMP控制报文协议中的ECHO(Ping程序),UDP用户数据报协议,TFTP简单文件传送协议,特别是TCP传输控制协议是TCPIP在MCU上应用所必需掌握的关键知识.
在对TCPIP有了一定程度的了解之后,如何具体的实现就成了问题的关键,我在学习TCPIP的过程中前后一共使用或阅读了下面的3中TCPIP协议寨,这里有对3个协议寨的比较和下载地址.
uIP,适合8bit单片机上使用,但是结构比较复杂,不适宜进行移植,也不是一份很适合阅读的代码.下载地址http://www.sics.se/~adam/uip/
Lwip,适合16/32bit单片机上使用,是嵌入式系统开发人员最好的学习TCPIP的代码,下载地址http://www.sics.se/~adam/lwip/
zLip,南开大学电子应用实验室编写的一个协议寨,有uip和lwip的优点,推荐初学者学习http://www.laogu.com/display.aspx?did=859  
一些初学C语言的人,不知道头文件(*.h文件)原来还可以自己写的。只知道调用系统库函数时,要使用#i nclude语句将某些头文件包含进去。其实,头文件跟.C文件一样,是可以自己写的。头文件是一种文本文件,使用文本编辑器将代码编写好之后,以扩展名.h保存就行了。头文件中一般放一些重复使用的代码,例如函数声明,变量声明,常数定义,宏的定义等等。当使用#i nclude语句将头文件引用时,相当于将头文件中所有内容,复制到#i nclude处。为了避免因为重复引用而导致的编译错误,头文件常具有 #ifndef   LABEL
#define   LABEL
   //代码部分
#endif
的格式。其中,LABEL为一个唯一的标号,命名规则跟变量的命名规则一样。常根据它所在的头文件名来命名,例如,如果头文件的文件名叫做hardware.h,
那么可以这样使用:
#ifndef   __HARDWARE_H__
#define   __HARDWARE_H__
//代码部分
#endif
这样写的意思就是,如果没有定义__HARDWARE_H__,则定义__HARDWARE_H__,并编译下面的代码部分,直到遇到#endif。这样,当重复引用时,由于__HARDWARE_H__已经被定义,则下面的代码部分就不会被编译了,这样就避免了重复定义。
另外一个地方就是使用include时,使用引号与尖括号的意思是不一样的。使用引号(“”)时,首先搜索工程文件所在目录,然后再搜索编译器头文件所在目录。而使用尖括号(<>)时,刚好是相反的搜索顺序。假设我们有两个文件名一样的头文件hardware.h,但内容却是不一样的。一个保存在编译器指定的头文件目录下,我们把它叫做文件I;另一个则保存在当前工程的目录下,我们把它叫做文件II。如果我们使用的是#i nclude ,则我们引用到的是文件I。如果我们使用的是#i nclude “hardware.h”,则我们引用的将是文件II。笔者以前就遇到过一个同事问,为什么他修改了那个头文件里面的内容,好象跟没有修改一样?就是因为他有两个一样的头文件(就像我们刚描述的那样),他是使用#i nclude引用的,而他修改时,却是当前工程所在的目录下的那个文件。
字符处理函数
本类别函数用于对单个字符进行处理,包括字符的类别测试和字符的大小写转换 阅读全文
 现在的工作主要是操作MySQL数据库,由于企业短信的特殊性,使得数据库记录非常庞大,因此提MySQL 数据库性能就非常重要了,下面这篇文章写的非常不错,特地转过来学习学习。

  本文探讨了提高MySQL 数据库性能的思路,并从8个方面给出了具体的解决方法。
阅读全文
如何实时查看mysql当前连接数?

1、查看当前所有连接的详细资料:
./mysqladmin -uadmin -p -h10.140.1.1 processlist


2、只查看当前连接数(Threads就是连接数.):
./mysqladmin  -uadmin -p -h10.140.1.1 status


、查看当前所有连接的详细资料:
mysqladmin -uroot -proot processlist
D:\MySQL\bin>mysqladmin -uroot -proot processlist
+-----+------+----------------+---------+---------+------+-------+------------------+
| Id | User | Host | db | Command | Time | State | Info |
+-----+------+----------------+---------+---------+------+-------+------------------+
| 591 | root | localhost:3544 | bbs | Sleep | 25 | | |
| 701 | root | localhost:3761 | | uery | 0 | | show processlist |
+-----+------+----------------+---------+---------+------+-------+------------------+
2、只查看当前连接数(Threads就是连接数.):
mysqladmin -uroot -proot status
D:\MySQL\bin>mysqladmin -uroot -proot status
Uptime: 2102 Threads: 3 Questions: 15531 Slow queries: 0 Opens: 0 Flush tab
les: 1 Open tables: 61 Queries per second avg: 7.389
3、修改mysql最大连接数:
打开my.ini,修改max_connections=100(默认为100)。


今天有一台mysql服务器突然连接数暴增,并且等待进程全部被锁...因为问题解决不当,导致被骂...OTL

总结:以后要快速定位错误,布置解决方案

登录到mysql客户端后,使用status命令也能获得thread连接数以及当前连接的id

或者用

show full processlist

看一下所有连接进程,注意查看进程等待时间以及所处状态 是否locked

如果进程过多,就把进程打印下来,然后查看

mysql -e 'show full processlist;' > 111

查找非locked的进程,一般就是当前执行中卡死,导致后面的进程排队的原因。

另外,修改mysql最大连接数的方法:

编辑MySQL(和PHP搭配之最佳组合)配置文件 
my.cnf 或者是 my.ini

在[MySQL(和PHP搭配之最佳组合)d]配置段添加:
max_connections = 1000

保存,重启MySQL(和PHP搭配之最佳组合)服务。

然后用命令:
MySQL(和PHP搭配之最佳组合)admin -uroot -p variables
输入root数据库账号的密码后可看到
| max_connections | 1000 |
据 wordpress 官方报道,WordPress 2.9 第一个 Beta 版本很有可能在今年10月底发布。如果 WordPress 2.9 测试顺利的话,会在今年11月底或12月初发布正式版本。

以下为 WordPress 官方原文报道:


We are aiming to release the first beta version of 2.9 around the end of October, once we have put the finishing touches on the new features, and then we switch to full on beta testing mode and your help and feedback will be very much appreciated. During the beta program will push out new builds for automated upgrades regularly and once we feel that a suitable level of stability has been achieves we will release a release candidate, and we hope to be able to make the final release 2.9 build available in either late November or early December.

据园子初步了解,此次 WordPress 2.9 会带来以下新功能:

1.加入新的图像编辑器

在 WordPress 2.9 版本中,会在后台加入简单的图像编辑功能,你可以通过简单的操作来对图像进行修改。

2.评论垃圾回收站功能

在 WordPress 2.9 里,你可以将一些无用的评论删除,这些被删除的评论可以暂时保存在回收站中,直到过期才会彻底删除,你可以通过 wp_config.php 文件设置过期期限。

3.新增 excerpt 过滤器功能

WordPress 2.9 版本新增加了两个过滤器来调整 excerpt(the_excerpt())摘要部分,通过修改返回值的方式达到调整摘要字符串长度和more链接的文字,你只需在 function.php 文件中添加一些代码即可。

最后园子提供 WordPress 2.9 最新测试版本供大家下载试用,请点此下载 WordPress 2.9 Beta 。

需要提醒你的是,这个版本只是测试版本,仅供测试使用。
   target=new Date(2009,9,17,14,00,00);
   today=new Date();

JavaScript里面的Date对象时间日期都是从0开始的。
就像Java/C++里面的数组坐标一样。
分别用0,1.....11来对应实际月份的一月,二月......十二月。
五月31号可以用以下表达式来表达:
var date = new Date(2008,5-1,31);

以后多注意这个问题就行了。
采用 secondary index 查询仍然是要比用 primary key 查询来的快很多
innodb 的 clustered index 是把 primary key 以及 row data 保存在一起的,而 secondary index 则是单独存放,然后有个指针指向 primary key。因此,需要进行 count(*) 统计表记录总数时,利用 secondary index 扫描起来,显然更快。

SELECT COUNT(id) FROM table;

这是原文http://bugs.mysql.com/bug.php?id=19271
我提问:
如果在前端加memcache,直接存count总数[增加,删除等做加减,曾经大家有没有人采用过这种方案加速count(*)的?呵呵
回答:
count存在memcache,会涉及一个准确性的问题。有可能会在memcache中丢失。 如果丢失的情况还是要跑数据库的!

Secondary Index就和普通的B-Tree索引差不多了,只不过在Secondary Index的所有Leaf Nodes上面同时包含了所指向数据记录的主键信息,而不是直接指向数据记录的位置信息。



http://www.ourmysql.com/archives/284
以下是通过shell命令(find . -type f | xargs cat | grep URL= | cat)获得的URL地址:

URL=http://doubao.javaeye.com/blog/212519
URL=http://hi.baidu.com/zeorliu/blog/item/fe3f13d73bfb87d7a144df8e.html
URL=http://mryufeng.javaeye.com/blog/105090
URL=http://www.baidu.com/baidu?word=LVS&tn=ylmf_2_dg&ie=utf-8
URL=http://www.linux-l7sw.org/
URL=http://www.haproxy.org/
URL=http://huangxx.javaeye.com/blog/179088
URL=http://cn.haproxy.org/
URL=http://baike.baidu.com/view/645050.htm
URL=http://blog.ohyeap.cn/?p=11
URL=http://lse.sourceforge.net/io/aio.html
URL=http://www.linuxvirtualserver.org/whatis.html
URL=http://pl.atyp.us/content/tech/servers.html
URL=http://www.audiomulch.com/~rossb/code/lockfree/
URL=http://www.kegel.com/c10k.html
URL=http://www.javaeye.com/topic/443080?page=1
URL=http://www.javaeye.com/topic/443080?page=2
URL=http://www.javaeye.com/topic/443080?page=3
URL=http://bulk.fefe.de/scalability/


    通常情况下,我们利用浏览器来上传文件的时候,常常会限制文件的大小,例如上传图片,自定义头像这些东东,如果让文件数据上传到服务器端,再来判断文件的大小提示用户文件过大,这里会有一些网络的延迟,更重要的是浪费了带宽,今天在研究这个问题的时候,找到了在本地利用javascript来判断文件大小,从而带来了很好的客户端体验,又节约了相当大的带宽,以下是代码片段:
   HTML表单代码片段:

  代码
<form id="uploadfile" name="uploadfile" class="" target="upload" action="http://web.qq.com/cgi-bin/cface_upload" method="POST" enctype="multipart/form-data">
    <input id="custom_face" name="custom_face" type="file">
    <input name="f" type="hidden" value="fallback">
    <input name="go" type="button" value="Upload File" onclick="Upload();">
</form>

  javascript代码片段:

  function Upload()
{
    var form=document.getElementById("uploadfile");
    var face=document.getElementById("custom_face");
    //ReadFFFile(face);
    var fileSize=GetFileSize(face);
    if(fileSize>1024*1024)
    {
        alert("文件不能大于1M");
    }
    else
    {
        form.submit();
    };
};
function GetFileSize(fileObj)  
{  
   var image=new Image();
    var filePath=fileObj.value;
   image.dynsrc=filePath;
   var fileSize=image.fileSize||0;
    if(fileSize==0)
    {
        fileSize=fileObj.files[0].fileSize;
    };
    return fileSize;
};

这里对IE6和Firefox3分别用了image标签的synsrc属性和files数组,从而解决了浏览器获取待上传文件大小的这个问题。在firefox3中,files这个数组的项还有另外一个方法getAsBinary方法,可以获取该文件的二进制流,这样可以对文件进行Hash计算,在一起需要上传需要Hash作为文件名的场合下也是非常有用的,IE6下需要用到ActiveX控件ADO(浏览器自带)也能获取二进制流,不过这里可能会被浏览器的安全设置截获到而无法正常使用。
在ARM Linux上使用Apache+PHP
我相信这篇文章同样是国内很难搜到的一个HOWTO(呵呵,截至到我写出来之前),我的最初目的是在ARM上使用PHP,尝试了Busybox的httpd,以及boa都没有办法很方便的和PHP接口,因此我狠下心来,编译了Apache。在ARM上使用PHP,好处仅仅是脚本比cgi好写一些,付出的代价是速度和蜗牛一样慢,不要指望很多人同时访问可以响应得过来。
另外说件事,BLOG上的文章多了,经常发现有人转载,但是有的人却不注出处……难道要我吧我的名字和邮件地址写到文章的每一个部分吗?也许国人就是这样缺乏某种精神,在我看到的转载我文章的BLOG中,基本都是网上各种ARM Linux文章的集合,不可否认他们搜集的很好,但是看了这么多文章,连一点心得体会都没有么,写点原创的东西就这么难么?不管怎样,我还是坚持EE小站的风格——原创性。下面开始正题,本文分为三大部分,apache、php和配置。阅读全文
定义和用法

NOW() 函数返回当前的日期和时间。
语法

NOW()

实例
例子 1

下面是 SELECT 语句:

SELECT NOW(),CURDATE(),CURTIME()

结果类似:
NOW()   CURDATE()   CURTIME()
2008-12-29 16:25:46   2008-12-29   16:25:46

$sql="select count(*) from Tbl_CCshow where  FQQ='$qq' and FCode=3 and left(FTime,7)=left(now(),7)";
分页: 206/272 第一页 上页 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 下页 最后页 [ 显示模式: 摘要 | 列表 ]