#include "gtk/gtk.h"
gboolean draw_some( GtkWidget *widget, GdkEventExpose *event,
gpointer data )
{
gdk_draw_line( widget->window,
widget->style->fg_gc[GTK_WIDGET_STATE( widget )],
10, 10, 100, 100 );
return TRUE;
}
int main( int argc, char *argv[] )
{
GtkWidget* window;
GtkWidget* draw_area;
gtk_init( &argc, &argv );
window = gtk_window_new( GTK_WINDOW_TOPLEVEL );
gtk_widget_set_usize( window, 400, 300 );
g_signal_connect( G_OBJECT( window ), "destroy",
G_CALLBACK( gtk_main_quit ), NULL );
draw_area = gtk_drawing_area_new( );
gtk_widget_set_size_request( draw_area, 100, 100 );
g_signal_connect( G_OBJECT( draw_area ), "expose_event",
G_CALLBACK( draw_some ), NULL );
gtk_container_add( GTK_CONTAINER( window ), draw_area );
gtk_widget_show( draw_area );
gtk_widget_show( window );
gtk_main( );
return 0;
}
gboolean draw_some( GtkWidget *widget, GdkEventExpose *event,
gpointer data )
{
gdk_draw_line( widget->window,
widget->style->fg_gc[GTK_WIDGET_STATE( widget )],
10, 10, 100, 100 );
return TRUE;
}
int main( int argc, char *argv[] )
{
GtkWidget* window;
GtkWidget* draw_area;
gtk_init( &argc, &argv );
window = gtk_window_new( GTK_WINDOW_TOPLEVEL );
gtk_widget_set_usize( window, 400, 300 );
g_signal_connect( G_OBJECT( window ), "destroy",
G_CALLBACK( gtk_main_quit ), NULL );
draw_area = gtk_drawing_area_new( );
gtk_widget_set_size_request( draw_area, 100, 100 );
g_signal_connect( G_OBJECT( draw_area ), "expose_event",
G_CALLBACK( draw_some ), NULL );
gtk_container_add( GTK_CONTAINER( window ), draw_area );
gtk_widget_show( draw_area );
gtk_widget_show( window );
gtk_main( );
return 0;
}
用jsp帮助实现的,当中遇到了不少的问题,后来在ITPUB的一些朋友和自己的辛苦努力下终于完成了该程序
阅读全文

现在大家使用开发工具有点盲目,什么都用,本来选择多是好事,但如果进行专业开发,选错开发工具将造成很大的影响,甚至是致命的。
几年来我一直做嵌入式Linux,也写过很多的程序,从系统配置程序,编辑器,拔号程序到监控系统到电子邮件到浏览器(这两个主要是改人家的)。马马虎虎还可以说是一个经验丰富的程序员,对中国的Linux行业也比较熟悉。我一直用这些开发工具。基本上没有什么解决不了的问题(就客户或开发需求而言)。我向来很讲究社会主义精神的,自己有所得就拿出来给大家分享,如果有用大家就参考参考,没用就批评或说出自己的看法。
我的经验归纳起来很简单,就是做开发最好还是用redhat(开发英文应用)或turbolinux系统(开发中文应用)+GTK/GNOME+glade+anjuta+sourcenavigator。语言方面当然是使用C/C++了,写应用主要是C,做图形系统底层时(如windows manager, X系统) 则主要是C++。
至于QT/KDE/Designer的组合我不是很推荐。我研究了不少时间,总觉得写不出好的东西来,甚至做了一个embedded qt 的中文输入也没用上。所以我也不是很支持用KDE进行开发,我想这与我个人喜好没有很大的关系。
Kyrix本应该是不错的东西,但要这么贵我觉得就不用去考虑它了。
其它的新鲜东西就不用谈了,大偏或太先进的东西只能拿去研究或做技术筹备,等成熟了我们再上。
回复:
能详细谈谈不使用qt的理由么?为什么写不出好东西?
总觉得GTK很土,glade功能也不够强大。qt的类库使用起来还是很舒服的,特别是对xml, regexp的支持很不错,有时候即使不写GUI也想用qt。觉得qt不爽的是它的性能和许可证,但GTK是从根上就烂了,控件很土,接口累赘,比 motif好不到哪里(对于同样的程序,qt的代码量一般是gtk的一半),那个GTK的祖宗gimp是窗口污染的典型例子。
回复:
这样说未免太偏激了
gimp窗口太多,但是anjuta就很整洁, 关键是你怎么用,
QT也不错,但是我会选择gtk2的。
回复:
还是喜欢使用GTK+。QT没有使用过,不过觉得GTK+写程序还是很简单。不过可以GTK+控件不是很多。如果有一天可以多到和Delphi那么多就好了。还有GLIB也非常不错。许多自己以前要写的数据结构现在都有了,省了不少的事情,而且GLIB不依赖图形环境,不写GUI,只用GLIB也不错
回复:
我不敢打赌你用了GTK就会放弃QT了。
回复:
我个人觉得用什么都一个样,关键是你能不能开发出好东东来,如果只是吹象的话,那谁都会。
如果真让我在GTK+, QT和Klyix三者间选择一种的话,我首先排除Klyix,它好用,但不自由,也不能用于开发底层的东西,我想真正的Linux高手是不甘心于开发一些中看不中用的小东西,这才是Linux真正的魅力。
接下来,我再排除QT,同样是因为它不是真正的Free,因为我要自由,谁不给自由我就轰谁!
回复:
gtk 和 qt 都得会才好,
我本来是学 QT的
但是我想写一个 xmms 的 plugin。
还得学 GTK 才行呀。
回复:
gtk的程序又小又快,占内存又少,界面不但支持漂亮的theme,还能把整个界面做成一张图片一样。代码虽多,但用熟了易记且可大量复制。 而且它是完全的free,想把它怎么改怎么卖都成。
至于qt, 程序代码是很少,但占的内存大,qt库本身也比gtk库大得多,要是做嵌入式应用就远不如gtk了。
qt的界面才土,就像win95一样,支持的theme也不漂亮,GNOME就比KDE漂亮多了。
qt写的商用程序有版权问题,特别是qt/e的贵,钱都给trolltech赚了....
几年来我一直做嵌入式Linux,也写过很多的程序,从系统配置程序,编辑器,拔号程序到监控系统到电子邮件到浏览器(这两个主要是改人家的)。马马虎虎还可以说是一个经验丰富的程序员,对中国的Linux行业也比较熟悉。我一直用这些开发工具。基本上没有什么解决不了的问题(就客户或开发需求而言)。我向来很讲究社会主义精神的,自己有所得就拿出来给大家分享,如果有用大家就参考参考,没用就批评或说出自己的看法。
我的经验归纳起来很简单,就是做开发最好还是用redhat(开发英文应用)或turbolinux系统(开发中文应用)+GTK/GNOME+glade+anjuta+sourcenavigator。语言方面当然是使用C/C++了,写应用主要是C,做图形系统底层时(如windows manager, X系统) 则主要是C++。
至于QT/KDE/Designer的组合我不是很推荐。我研究了不少时间,总觉得写不出好的东西来,甚至做了一个embedded qt 的中文输入也没用上。所以我也不是很支持用KDE进行开发,我想这与我个人喜好没有很大的关系。
Kyrix本应该是不错的东西,但要这么贵我觉得就不用去考虑它了。
其它的新鲜东西就不用谈了,大偏或太先进的东西只能拿去研究或做技术筹备,等成熟了我们再上。
回复:
能详细谈谈不使用qt的理由么?为什么写不出好东西?
总觉得GTK很土,glade功能也不够强大。qt的类库使用起来还是很舒服的,特别是对xml, regexp的支持很不错,有时候即使不写GUI也想用qt。觉得qt不爽的是它的性能和许可证,但GTK是从根上就烂了,控件很土,接口累赘,比 motif好不到哪里(对于同样的程序,qt的代码量一般是gtk的一半),那个GTK的祖宗gimp是窗口污染的典型例子。
回复:
这样说未免太偏激了
gimp窗口太多,但是anjuta就很整洁, 关键是你怎么用,
QT也不错,但是我会选择gtk2的。
回复:
还是喜欢使用GTK+。QT没有使用过,不过觉得GTK+写程序还是很简单。不过可以GTK+控件不是很多。如果有一天可以多到和Delphi那么多就好了。还有GLIB也非常不错。许多自己以前要写的数据结构现在都有了,省了不少的事情,而且GLIB不依赖图形环境,不写GUI,只用GLIB也不错
回复:
我不敢打赌你用了GTK就会放弃QT了。
回复:
我个人觉得用什么都一个样,关键是你能不能开发出好东东来,如果只是吹象的话,那谁都会。
如果真让我在GTK+, QT和Klyix三者间选择一种的话,我首先排除Klyix,它好用,但不自由,也不能用于开发底层的东西,我想真正的Linux高手是不甘心于开发一些中看不中用的小东西,这才是Linux真正的魅力。
接下来,我再排除QT,同样是因为它不是真正的Free,因为我要自由,谁不给自由我就轰谁!
回复:
gtk 和 qt 都得会才好,
我本来是学 QT的
但是我想写一个 xmms 的 plugin。
还得学 GTK 才行呀。
回复:
gtk的程序又小又快,占内存又少,界面不但支持漂亮的theme,还能把整个界面做成一张图片一样。代码虽多,但用熟了易记且可大量复制。 而且它是完全的free,想把它怎么改怎么卖都成。
至于qt, 程序代码是很少,但占的内存大,qt库本身也比gtk库大得多,要是做嵌入式应用就远不如gtk了。
qt的界面才土,就像win95一样,支持的theme也不漂亮,GNOME就比KDE漂亮多了。
qt写的商用程序有版权问题,特别是qt/e的贵,钱都给trolltech赚了....
http://www.sunnyu.com/?p=93
给fast-cgi方式的php做一个检查脚本
使用fast-cgi方式的php在使用,有时候由于编写的代码问题,使处理代码的php-cgi进程的运行占用很多时间,在将所有活动的 php-cgi 进程都占用后,web服务器对php的请求就失去响应了。
通过命令查看服务器上一共开了多少的 php-cgi 进程
1.
使用如下命令查看已经有多少个php-cgi进程用来处理tcp请求
1.
当被使用的php进程接近所开启的php进程数时,可以考虑将被耗用的php进程释放一下,以防止网站访问的阻塞。
按照以上思路编写了一个检查脚本。
1.
其中 /root/tools/resetphp.sh 为编写的php重启脚本。
脚本可以放到 crontab 中,做自动定时检查处理。
给fast-cgi方式的php做一个检查脚本
使用fast-cgi方式的php在使用,有时候由于编写的代码问题,使处理代码的php-cgi进程的运行占用很多时间,在将所有活动的 php-cgi 进程都占用后,web服务器对php的请求就失去响应了。
通过命令查看服务器上一共开了多少的 php-cgi 进程
1.
ps -fe |grep "php" | grep -v "grep" | wc -l
使用如下命令查看已经有多少个php-cgi进程用来处理tcp请求
1.
netstat -anop | grep "php" | grep -v "grep" | wc -l
当被使用的php进程接近所开启的php进程数时,可以考虑将被耗用的php进程释放一下,以防止网站访问的阻塞。
按照以上思路编写了一个检查脚本。
1.
#
#!/bin/sh
#
echo "begin check"
#define default check delta num
defdeltacount=10
phpcount=`ps -fe |grep "php" | grep -v "grep" | wc -l`
netstatcount=`sudo netstat -anop | grep "php" | grep -v "grep" | wc -l`
echo " php process count is $phpcount
netstat process count is $netstatcount"
deltacount=`expr $phpcount - $netstatcount`
if [ -n "$1" ]; then
defdeltacount=$1
fi
echo "deltacount is $deltacount, defdeltacount is $defdeltacount"
if [ $deltacount -lt $defdeltacount ]; then
echo " need reset"
sudo /root/tools/resetphp.sh
else
echo " not need reset"
fi
echo "check end"
#!/bin/sh
#
echo "begin check"
#define default check delta num
defdeltacount=10
phpcount=`ps -fe |grep "php" | grep -v "grep" | wc -l`
netstatcount=`sudo netstat -anop | grep "php" | grep -v "grep" | wc -l`
echo " php process count is $phpcount
netstat process count is $netstatcount"
deltacount=`expr $phpcount - $netstatcount`
if [ -n "$1" ]; then
defdeltacount=$1
fi
echo "deltacount is $deltacount, defdeltacount is $defdeltacount"
if [ $deltacount -lt $defdeltacount ]; then
echo " need reset"
sudo /root/tools/resetphp.sh
else
echo " not need reset"
fi
echo "check end"
其中 /root/tools/resetphp.sh 为编写的php重启脚本。
脚本可以放到 crontab 中,做自动定时检查处理。
php中mysql_pconnect()的实现方式:
阅读全文

<?php
set_time_limit(0);
header("Connection: Keep-Alive");
header("Proxy-Connection: Keep-Alive");
for($i=0; $i<1000; $i++) {
print "fuck man!".$i."<br>";
flush();
sleep(3);
clearstatcache();
}
?>
set_time_limit(0);
header("Connection: Keep-Alive");
header("Proxy-Connection: Keep-Alive");
for($i=0; $i<1000; $i++) {
print "fuck man!".$i."<br>";
flush();
sleep(3);
clearstatcache();
}
?>
一网友和我聊天,他刚到公司不到一个月,昨天被临时抽到到一个客户那里协助做一些事情,系统是多个各自相对独立的系统,总部可以访问每个分系统,但他因为刚进这个项目,根本并不知道这些。
工作做得还算顺利,中间来了一个领导模样的人,随便看了看,问问工作的如何,他们说一些工作已经在总部做了,这面就是一些简单的事情。对方很惊讶,问总部能访问我们的数据吗? 这时候他为了证明自己熟悉互联网,熟悉架构,就说当然可以,大家都是访问一个中心服务器,总部只要有帐号和密码就能进去了。那个人又很惊讶的问,不是吧,我们的服务器可是在我们楼下的机房里啊?他们怎么能访问?这位网友当时愣住了,有些茫然和尴尬,难道猜错了。。。。
工作中,在没有搞清楚某个事情的时候,不要随便发表自己的看法,如果要回答,也是你的前辈同事负责解答,毕竟你不了解。
新到一个地方,表现一下自己是对的,但一定要量力而为。在大多数时候,多做多看,比多说要好。当大家需要你发表意见的时候,你一定要准备好;在大家讨论的时候,你也可以发表自己的意见,但当面对客户,解答客户疑问的时候,如果你不负责这一块,你还是先闭上嘴好了,除非你的同事让你来说。
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/java2000_net/archive/2009/07/30/4395217.aspx
工作做得还算顺利,中间来了一个领导模样的人,随便看了看,问问工作的如何,他们说一些工作已经在总部做了,这面就是一些简单的事情。对方很惊讶,问总部能访问我们的数据吗? 这时候他为了证明自己熟悉互联网,熟悉架构,就说当然可以,大家都是访问一个中心服务器,总部只要有帐号和密码就能进去了。那个人又很惊讶的问,不是吧,我们的服务器可是在我们楼下的机房里啊?他们怎么能访问?这位网友当时愣住了,有些茫然和尴尬,难道猜错了。。。。
工作中,在没有搞清楚某个事情的时候,不要随便发表自己的看法,如果要回答,也是你的前辈同事负责解答,毕竟你不了解。
新到一个地方,表现一下自己是对的,但一定要量力而为。在大多数时候,多做多看,比多说要好。当大家需要你发表意见的时候,你一定要准备好;在大家讨论的时候,你也可以发表自己的意见,但当面对客户,解答客户疑问的时候,如果你不负责这一块,你还是先闭上嘴好了,除非你的同事让你来说。
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/java2000_net/archive/2009/07/30/4395217.aspx
delete from user_daily where day=date(now() - interval 4 day);
SELECT date( now( ) - INTERVAL 4 DAY ) ;
SELECT date( now( ) - INTERVAL 4 DAY ) ;
安装好:Visual Studio6,除了VB VC FOXPRO,安装好后:
打开IE,工具--》Internet选项--》高级--》去掉显示友好HTTP错误信息--》显示每个脚本错误的信息打开--》禁用脚本调试-》禁用脚本调试其他给关闭掉。
然后,适当看看下文:
阅读全文
打开IE,工具--》Internet选项--》高级--》去掉显示友好HTTP错误信息--》显示每个脚本错误的信息打开--》禁用脚本调试-》禁用脚本调试其他给关闭掉。
然后,适当看看下文:

4个字符
字符串的长度:
长度的单位为字符。一个多字节字符算作一个单字符。
MySQL字符串函数:
对于一个包含五个二字节字符集, LENGTH()返回值为 10, 而CHAR_LENGTH()的返回值为5。
也就是说:
对于一个汉字和一个字母都是一个字符。遵循CHAR和VARCHAR定义规范。也与数据库本身设置的字符集有关。
mysql的char和varchar字段不区分unicode还是别的什么编码,统统按照ascii来存,所以一个汉字占用2个字节。
CHAR和VARCHAR类型类似,但它们保存和检索的方式不同。它们的最大长度和是否尾部空格被保留等方面也不同。在存储或检索过程中不进行大小写转换。
CHAR和VARCHAR类型声明的长度表示你想要保存的最大字符数。例如,CHAR(30)可以占用30个字符。
CHAR列的长度固定为创建表时声明的长度。长度可以为从0到255的任何值。当保存CHAR值时,在它们的右边填充空格以达到指定的长度。当检索到CHAR值时,尾部的空格被删除掉。在存储或检索过程中不进行大小写转换。
VARCHAR列中的值为可变长字符串。长度可以指定为0到65,535之间的值。(VARCHAR的最大有效长度由最大行大小和使用的字符集确定。整体最大长度是65,532字节)。
char是定长字符数据,所谓定长就是长度固定的,当输入的数据长度没有达到指定的长度时将自动以英文空格在其后面填充,使长度达到相应的长度。
CHAR是固定字符数量,储存时不足部分用空格补齐,搜起来比较快,占用空间相对就多
VARCHAR是不固定字符数量,占用空间小,不过需要记录字符数。
char是一种固定长度的类型,varchar则是一种可变长度的类型,它们的区别是:
char(M)类型的数据列里,每个值都占用M个字节,如果某个长度小于M,MySQL就会在它的右边用空格字符补足.(在检索操作中那些填补出来的空格字符将被去掉)在varchar(M)类型的数据列里,每个值只占用刚好够用的字节再加上一个用来记录其长度的字节(即总长度为L+1字节).
使用的一般规则:
1. 经常变化的字段用char
2. 知道固定长度的用char
3. 尽量用varchar
4. 超过255字节的只能用varchar或者text
5. 能用varchar的地方不用text
阅读全文
字符串的长度:
长度的单位为字符。一个多字节字符算作一个单字符。
MySQL字符串函数:
对于一个包含五个二字节字符集, LENGTH()返回值为 10, 而CHAR_LENGTH()的返回值为5。
也就是说:
对于一个汉字和一个字母都是一个字符。遵循CHAR和VARCHAR定义规范。也与数据库本身设置的字符集有关。
mysql的char和varchar字段不区分unicode还是别的什么编码,统统按照ascii来存,所以一个汉字占用2个字节。
CHAR和VARCHAR类型类似,但它们保存和检索的方式不同。它们的最大长度和是否尾部空格被保留等方面也不同。在存储或检索过程中不进行大小写转换。
CHAR和VARCHAR类型声明的长度表示你想要保存的最大字符数。例如,CHAR(30)可以占用30个字符。
CHAR列的长度固定为创建表时声明的长度。长度可以为从0到255的任何值。当保存CHAR值时,在它们的右边填充空格以达到指定的长度。当检索到CHAR值时,尾部的空格被删除掉。在存储或检索过程中不进行大小写转换。
VARCHAR列中的值为可变长字符串。长度可以指定为0到65,535之间的值。(VARCHAR的最大有效长度由最大行大小和使用的字符集确定。整体最大长度是65,532字节)。
char是定长字符数据,所谓定长就是长度固定的,当输入的数据长度没有达到指定的长度时将自动以英文空格在其后面填充,使长度达到相应的长度。
CHAR是固定字符数量,储存时不足部分用空格补齐,搜起来比较快,占用空间相对就多
VARCHAR是不固定字符数量,占用空间小,不过需要记录字符数。
char是一种固定长度的类型,varchar则是一种可变长度的类型,它们的区别是:
char(M)类型的数据列里,每个值都占用M个字节,如果某个长度小于M,MySQL就会在它的右边用空格字符补足.(在检索操作中那些填补出来的空格字符将被去掉)在varchar(M)类型的数据列里,每个值只占用刚好够用的字节再加上一个用来记录其长度的字节(即总长度为L+1字节).
使用的一般规则:
1. 经常变化的字段用char
2. 知道固定长度的用char
3. 尽量用varchar
4. 超过255字节的只能用varchar或者text
5. 能用varchar的地方不用text

vi /etc/rc.d/init.d/iptables
1-1024, 3306, 36000, 56000, 這些都是高危端口, 不能隨便開的
1-1024, 3306, 36000, 56000, 這些都是高危端口, 不能隨便開的
http://www.ibm.com/developerworks/cn/web/wa-lo-comet/
背景:其实服务端用epoll进行Post及其Get解析的依据,Post先:\r\n\r\n后面的数据长度由Content-Length指定:Content-Length: 26\r\n
\r\n
HTML Form URL Encoded: application/x-www-form-urlencoded
name=1234567&button=Submit
....Post数据内容段....
上面是Post,讲下get更简单,其实就是\r\n\r\n结尾即算完成了(Get没有Post的数据后面为空),此时服务端可以关闭了。
Connection: keep-alive\r\n
\r\n
———————————————————————————————————————————————————————————
function httpRequestGET($url){
$url2 = parse_url($url);
$url2["path"] = ($url2["path"] == "" ? "/" : $url2["path"]);
$url2["port"] = ($url2["port"] == "" ? 80 : $url2["port"]);
$host_ip = @gethostbyname($url2["host"]);
$fsock_timeout=20;
if(($fsock = fsockopen($host_ip, 80, $errno, $errstr, $fsock_timeout)) < 0){
return false;
}
$request = $url2["path"] . ($url2["query"] != "" ? "?" . $url2["query"] : "") . ($url2["fragment"] != "" ? "#" . $url2["fragment"] : "");
$in = "GET " . $request . " HTTP/1.0\r\n";
$in .= "Accept: */*\r\n";
$in .= "User-Agent: Payb-Agent\r\n";
$in .= "Host: " . $url2["host"] . "\r\n";
$in .= "Connection: Close\r\n\r\n";
if(!@fwrite($fsock, $in, strlen($in))){
fclose($fsock);
return false;
}
unset($in);
$out = "";
while($buff = @fgets($fsock, 2048)){
$out .= $buff;
}
fclose($fsock);
$pos = strpos($out, "\r\n\r\n");
$head = substr($out, 0, $pos); //http head
$status = substr($head, 0, strpos($head, "\r\n")); //http status line
$body = substr($out, $pos + 4, strlen($out) - ($pos + 4));//page body
if(preg_match("/^HTTP\/\d\.\d\s([\d]+)\s.*$/", $status, $matches)){
if(intval($matches[1]) / 100 == 2){
return $body;
}else{
return false;
}
}else{
return false;
}
}
function httpRequestPOST($url,$post_data){
$url2 = parse_url($url);
$url2["path"] = ($url2["path"] == "" ? "/" : $url2["path"]);
$url2["port"] = ($url2["port"] == "" ? 80 : $url2["port"]);
$host_ip = @gethostbyname($url2["host"]);
$fsock_timeout=20;//秒
if(($fsock = fsockopen($host_ip, 80, $errno, $errstr, $fsock_timeout)) < 0){
return false;
}
$request = $url2["path"] . ($url2["query"] != "" ? "?" . $url2["query"] : "") . ($url2["fragment"] != "" ? "#" . $url2["fragment"] : "");
$needChar = false;
foreach($post_data as $key => $val) {
$post_data2 .= ($needChar ? "&" : "") . urlencode($key) . "=" . urlencode($val);
$needChar = true;
}
$in = "POST " . $request . " HTTP/1.0\r\n";
$in .= "Accept: */*\r\n";
$in .= "Host: " . $url2["host"] . "\r\n";
$in .= "User-Agent: Lowell-Agent\r\n";
$in .= "Content-type: application/x-www-form-urlencoded\r\n";
$in .= "Content-Length: " . strlen($post_data2) . "\r\n";
$in .= "Connection: Close\r\n\r\n";
$in .= $post_data2 . "\r\n\r\n";
unset($post_data2);
if(!@fwrite($fsock, $in, strlen($in))){
fclose($fsock);
return false;
}
unset($in);
$out = "";
while($buff = fgets($fsock, 2048)){
$out .= $buff;
}
fclose($fsock);
$pos = strpos($out, "\r\n\r\n");
$head = substr($out, 0, $pos); //http head
$status = substr($head, 0, strpos($head, "\r\n")); //http status line
$body = substr($out, $pos + 4, strlen($out) - ($pos + 4));//page body
if(preg_match("/^HTTP\/\d\.\d\s([\d]+)\s.*$/", $status, $matches)){
if(intval($matches[1]) / 100 == 2){
return $body;
}else{
return false;
}
}else{
return false;
}
}
函数调用:
$post_data = array("name"=>"xd","sex"=>"man");
httpRequestPOST("http://localhost/post.php",$post_data);
socket写的顺序:
POST /post.php HTTP/1.0
Accept: */*
Host: localhost
User-Agent: Lowell-Agent
Content-type: application/x-www-form-urlencoded
Content-Length: 15
Connection: Close
name=xd&sex=man
普通POST的结果演示:
阅读全文
\r\n
HTML Form URL Encoded: application/x-www-form-urlencoded
name=1234567&button=Submit
....Post数据内容段....
上面是Post,讲下get更简单,其实就是\r\n\r\n结尾即算完成了(Get没有Post的数据后面为空),此时服务端可以关闭了。
Connection: keep-alive\r\n
\r\n
———————————————————————————————————————————————————————————
function httpRequestGET($url){
$url2 = parse_url($url);
$url2["path"] = ($url2["path"] == "" ? "/" : $url2["path"]);
$url2["port"] = ($url2["port"] == "" ? 80 : $url2["port"]);
$host_ip = @gethostbyname($url2["host"]);
$fsock_timeout=20;
if(($fsock = fsockopen($host_ip, 80, $errno, $errstr, $fsock_timeout)) < 0){
return false;
}
$request = $url2["path"] . ($url2["query"] != "" ? "?" . $url2["query"] : "") . ($url2["fragment"] != "" ? "#" . $url2["fragment"] : "");
$in = "GET " . $request . " HTTP/1.0\r\n";
$in .= "Accept: */*\r\n";
$in .= "User-Agent: Payb-Agent\r\n";
$in .= "Host: " . $url2["host"] . "\r\n";
$in .= "Connection: Close\r\n\r\n";
if(!@fwrite($fsock, $in, strlen($in))){
fclose($fsock);
return false;
}
unset($in);
$out = "";
while($buff = @fgets($fsock, 2048)){
$out .= $buff;
}
fclose($fsock);
$pos = strpos($out, "\r\n\r\n");
$head = substr($out, 0, $pos); //http head
$status = substr($head, 0, strpos($head, "\r\n")); //http status line
$body = substr($out, $pos + 4, strlen($out) - ($pos + 4));//page body
if(preg_match("/^HTTP\/\d\.\d\s([\d]+)\s.*$/", $status, $matches)){
if(intval($matches[1]) / 100 == 2){
return $body;
}else{
return false;
}
}else{
return false;
}
}
function httpRequestPOST($url,$post_data){
$url2 = parse_url($url);
$url2["path"] = ($url2["path"] == "" ? "/" : $url2["path"]);
$url2["port"] = ($url2["port"] == "" ? 80 : $url2["port"]);
$host_ip = @gethostbyname($url2["host"]);
$fsock_timeout=20;//秒
if(($fsock = fsockopen($host_ip, 80, $errno, $errstr, $fsock_timeout)) < 0){
return false;
}
$request = $url2["path"] . ($url2["query"] != "" ? "?" . $url2["query"] : "") . ($url2["fragment"] != "" ? "#" . $url2["fragment"] : "");
$needChar = false;
foreach($post_data as $key => $val) {
$post_data2 .= ($needChar ? "&" : "") . urlencode($key) . "=" . urlencode($val);
$needChar = true;
}
$in = "POST " . $request . " HTTP/1.0\r\n";
$in .= "Accept: */*\r\n";
$in .= "Host: " . $url2["host"] . "\r\n";
$in .= "User-Agent: Lowell-Agent\r\n";
$in .= "Content-type: application/x-www-form-urlencoded\r\n";
$in .= "Content-Length: " . strlen($post_data2) . "\r\n";
$in .= "Connection: Close\r\n\r\n";
$in .= $post_data2 . "\r\n\r\n";
unset($post_data2);
if(!@fwrite($fsock, $in, strlen($in))){
fclose($fsock);
return false;
}
unset($in);
$out = "";
while($buff = fgets($fsock, 2048)){
$out .= $buff;
}
fclose($fsock);
$pos = strpos($out, "\r\n\r\n");
$head = substr($out, 0, $pos); //http head
$status = substr($head, 0, strpos($head, "\r\n")); //http status line
$body = substr($out, $pos + 4, strlen($out) - ($pos + 4));//page body
if(preg_match("/^HTTP\/\d\.\d\s([\d]+)\s.*$/", $status, $matches)){
if(intval($matches[1]) / 100 == 2){
return $body;
}else{
return false;
}
}else{
return false;
}
}
函数调用:
$post_data = array("name"=>"xd","sex"=>"man");
httpRequestPOST("http://localhost/post.php",$post_data);
socket写的顺序:
POST /post.php HTTP/1.0
Accept: */*
Host: localhost
User-Agent: Lowell-Agent
Content-type: application/x-www-form-urlencoded
Content-Length: 15
Connection: Close
name=xd&sex=man
普通POST的结果演示:
POST/?username=111&password=222HTTP/1.1
Host:127.0.0.1:8000
User-Agent:Mozilla/5.0(Windows;U;WindowsNT5.2;zh-CN;rv:1.9.0.1)Gecko/2008070208Firefox/3.0.1
Accept:text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language:zh-cn,zh;q=0.5
Accept-Encoding:gzip,deflate
Accept-Charset:gb2312,utf-8;q=0.7,*;q=0.7
Keep-Alive:300
Connection:keep-alive
Referer:http://127.0.0.1:8000/?username=111&password=222
Content-Type:application/x-www-form-urlencoded
Content-Length:25
username=111&password=222
Host:127.0.0.1:8000
User-Agent:Mozilla/5.0(Windows;U;WindowsNT5.2;zh-CN;rv:1.9.0.1)Gecko/2008070208Firefox/3.0.1
Accept:text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language:zh-cn,zh;q=0.5
Accept-Encoding:gzip,deflate
Accept-Charset:gb2312,utf-8;q=0.7,*;q=0.7
Keep-Alive:300
Connection:keep-alive
Referer:http://127.0.0.1:8000/?username=111&password=222
Content-Type:application/x-www-form-urlencoded
Content-Length:25
username=111&password=222

原文:
Q2:
main()
{
char *src="hello,world";
char *dest = NULL;
int len=strlen(src);
dest = (char*)malloc(len);
char *d = dest;
char *s = src[len];//它出题意图是指向最后,然后再减减到开始处,但是C语言是不能这样直接指向的,必须这样: s = src+len-1; 而且两边的类型也不等,一边是指针,一边是一个数值,写对: char *s = &src[len];
while(len-- != 0)
{
d++ = s--;
printf("%s",dest);
}
}
改错:{
char *src="hello,world";
char *dest = NULL;
int len=strlen(src);
dest = (char*)malloc(len);
char *d = dest;
char *s = src[len];//它出题意图是指向最后,然后再减减到开始处,但是C语言是不能这样直接指向的,必须这样: s = src+len-1; 而且两边的类型也不等,一边是指针,一边是一个数值,写对: char *s = &src[len];
while(len-- != 0)
{
d++ = s--;
printf("%s",dest);
}
}
#include <stdio.h>
#include <string.h>
int main()
{
char *src="hello,world";
char *dest = NULL;
int len=strlen(src);
printf("src =[%s]\n", src);
dest = (char*)malloc(len+1);
char *d = dest;
char *s = NULL;
int i =0;
s = src+len-1;
//s = &src[len]-1; //这个操作就是对内存指针很了解的情况下进行的:取到地址,然后减少一个char类型地址的偏移量。
//s = &src[len-1]; //直接取到不是\0的前一个字符地址。
while (len-- != 0)
{
*d++ = *s--;
}
*d = 0;
printf("dest=[%s]\n",dest);
return 0;
}
#include <string.h>
int main()
{
char *src="hello,world";
char *dest = NULL;
int len=strlen(src);
printf("src =[%s]\n", src);
dest = (char*)malloc(len+1);
char *d = dest;
char *s = NULL;
int i =0;
s = src+len-1;
//s = &src[len]-1; //这个操作就是对内存指针很了解的情况下进行的:取到地址,然后减少一个char类型地址的偏移量。
//s = &src[len-1]; //直接取到不是\0的前一个字符地址。
while (len-- != 0)
{
*d++ = *s--;
}
*d = 0;
printf("dest=[%s]\n",dest);
return 0;
}
Q2:
char str[] = "I love sina china";
char *p;
p=str;
printf("%c",*p);//是把这个地址的内容给取出来,传的是一个地址指向的内容!
printf("%s",p+2);//把这个首地址的内容取出来,然后加二个地址偏移,然后打印出这个地址以及后面的内容,这儿传入的是一个地址!
char *p;
p=str;
printf("%c",*p);//是把这个地址的内容给取出来,传的是一个地址指向的内容!
printf("%s",p+2);//把这个首地址的内容取出来,然后加二个地址偏移,然后打印出这个地址以及后面的内容,这儿传入的是一个地址!
/data/www/XXXX/bak/20220926
drw-rw-rw- 2 www www 512 Sep 26 23:17 20220926. # 666
PHP以www用户运行时无法读取止在日期目录里面的文件内空,经
chmod -R 755 /data/www/XXXX/bak/20220926 后:
drwxr-xr-x 2 www www 512 Sep 26 23:17 20220926. #755
可以读取了,于是用:
u - 表示用户 (user) g - 表示用户组 (group) o - 表示其它 (others) a - 表示所有 (all)
chmod u+x,g-x,o-x 20220926
====================================
-r-xr-xr-x 1 root root 1177 07-31 01:13 mysql.conf
想修改为和下面一样:
-rw-r--r-- 1 root root 2533 07-30 18:23 ngixd.conf
-rw-r--r-- 1 root root 984 07-30 18:24 ngixd_fcgi.conf
-rw-r--r-- 1 root root 101 07-30 18:28 ngixd_service_autorun.conf
-rw-r--r-- 1 root root 5834 07-30 18:15 ngix_php_config.conf
chmod 644 mysql.conf
即可:
--- --- --- 左到右对应:
u g o :用户,组,其它!
R w X :读 ,写,执行!
4 2 1 : 4 , 2 , 1 !
进一步细说下关于u,g,o,a的情况:
who 用户类型 意义
u User 文件的所有者
g Group 与文件相关联的组
o Other 所有其他用户
a All 相当与ugo,所有用户
operator 运算符意义
+ 为指定的用户类型添加权限
- 为指定的用户类型删除权限
= 设定或重置指定用户类型的权限
实践示例,777修改为755(根据:W=4,R=2,X=1,相当于去掉写权限:7-2=5,相当于:755,chmod -R 755 xdxp.cn):
drwxrwxrwx. 13 766 www 4096 7月 26 00:18 xdxp.cn
chmod -R g-w xdxp.cn
chmod -R o-w xdxp.cn
变为:
drwxr-xr-x. 13 766 www 4096 7月 26 00:18 xdxp.cn
--wxrw--wt 1 www www 4492291 Jun 6 17:40 fd80a538-ce8c-11e2-b12d-001e0bdc11a2.mp4
t 代表 restricted deletion flag or sticky bit ,限制删除标记或者粘滞位,
u 代表 the user who owns it
chmod +t
代表sticky binary (也作text bit),这个东西有两种意义:
1. 对于二进制文件,表示当该程序退出后,文字段(text segment)依然驻留内存,以缩减下次启动的时间,
2. 对于目录,该目录中的所有文件只有文件的所有者可以删除,其它人即使有对该文件的所有操作权限也无法删除(为所欲为的超级用户除外)。
来源:
http://www.cnblogs.com/healthy-tree/archive/2011/11/08/2240509.html
Nginx 以www运行nginx的upload上传组件放到一个挂载的磁盘后是这个权限:
估计和这个:upload_store_access user:r; 有关,如下:
-r----x--t 1 www www 815235 Jun 7 10:15 /upload/video/user/abc.mp4
[root@test user]# ls -lart ~+/138e38be-cf18-11e2-b12d-001e0bdc11a2.mp4
-rwxrwxrwx 1 www www 815235 Jun 7 10:15 /upload/video/user/abc.mp4
drw-rw-rw- 2 www www 512 Sep 26 23:17 20220926. # 666
PHP以www用户运行时无法读取止在日期目录里面的文件内空,经
chmod -R 755 /data/www/XXXX/bak/20220926 后:
drwxr-xr-x 2 www www 512 Sep 26 23:17 20220926. #755
可以读取了,于是用:
u - 表示用户 (user) g - 表示用户组 (group) o - 表示其它 (others) a - 表示所有 (all)
chmod u+x,g-x,o-x 20220926
====================================
-r-xr-xr-x 1 root root 1177 07-31 01:13 mysql.conf
想修改为和下面一样:
-rw-r--r-- 1 root root 2533 07-30 18:23 ngixd.conf
-rw-r--r-- 1 root root 984 07-30 18:24 ngixd_fcgi.conf
-rw-r--r-- 1 root root 101 07-30 18:28 ngixd_service_autorun.conf
-rw-r--r-- 1 root root 5834 07-30 18:15 ngix_php_config.conf
chmod 644 mysql.conf
即可:
--- --- --- 左到右对应:
u g o :用户,组,其它!
R w X :读 ,写,执行!
4 2 1 : 4 , 2 , 1 !
进一步细说下关于u,g,o,a的情况:
who 用户类型 意义
u User 文件的所有者
g Group 与文件相关联的组
o Other 所有其他用户
a All 相当与ugo,所有用户
operator 运算符意义
+ 为指定的用户类型添加权限
- 为指定的用户类型删除权限
= 设定或重置指定用户类型的权限
实践示例,777修改为755(根据:W=4,R=2,X=1,相当于去掉写权限:7-2=5,相当于:755,chmod -R 755 xdxp.cn):
drwxrwxrwx. 13 766 www 4096 7月 26 00:18 xdxp.cn
chmod -R g-w xdxp.cn
chmod -R o-w xdxp.cn
变为:
drwxr-xr-x. 13 766 www 4096 7月 26 00:18 xdxp.cn
--wxrw--wt 1 www www 4492291 Jun 6 17:40 fd80a538-ce8c-11e2-b12d-001e0bdc11a2.mp4
t 代表 restricted deletion flag or sticky bit ,限制删除标记或者粘滞位,
u 代表 the user who owns it
chmod +t
代表sticky binary (也作text bit),这个东西有两种意义:
1. 对于二进制文件,表示当该程序退出后,文字段(text segment)依然驻留内存,以缩减下次启动的时间,
2. 对于目录,该目录中的所有文件只有文件的所有者可以删除,其它人即使有对该文件的所有操作权限也无法删除(为所欲为的超级用户除外)。
来源:
http://www.cnblogs.com/healthy-tree/archive/2011/11/08/2240509.html
Nginx 以www运行nginx的upload上传组件放到一个挂载的磁盘后是这个权限:
估计和这个:upload_store_access user:r; 有关,如下:
-r----x--t 1 www www 815235 Jun 7 10:15 /upload/video/user/abc.mp4
[root@test user]# ls -lart ~+/138e38be-cf18-11e2-b12d-001e0bdc11a2.mp4
-rwxrwxrwx 1 www www 815235 Jun 7 10:15 /upload/video/user/abc.mp4