基于libevent 1.3e, 利用了libevent里面现成的http库
编译方法,先安装libevent,然后
    cc -o httpd httpd.c -L/usr/local/lib/ -Wall -O2 -I/usr/local/include -ggdb -levent
可以作为一个商业运行环境的基础,真正的业务系统里面,comet server也很简单,比这个程序复杂不了什么,它只处理comet,只是一个通道,复杂的东西放到其他地方。
打算作为下图中的一个模块
点击在新窗口中浏览此图片阅读全文
项羽彭城破诸侯:三万对五十六万。
  
  韩信破赵之战:一万二千对二十万。
  
 刘秀昆阳之战:三千对四十二万。
  
 张辽合淝大战:八百对十万。
  
 淝水之战:八万对一百一十二万。
  ……阅读全文
php -i|grep sock
mysqli.default_socket => /var/run/myslqd/mysqld.sock => /var/run/myslqd/mysqld.sock
pdo_mysql.default_socket => /var/run/myslqd/mysqld.sock => /var/run/myslqd/mysqld.sock

cat /usr/local/php/etc/php.ini |grep mysqld.sock
pdo_mysql.default_socket=/var/run/myslqd/mysqld.sock
mysqli.default_socket = /var/run/myslqd/mysqld.sock

背景:(1)偶尔会出现mysql的server和mysql的client默认的socke文件不在一个地方,我们用mysql时会出现一个找不到mysql.sock的情况。
(2)因非正常关机出现:/tmp/mysql.sock 不见了,找不到了,如何连接上去的问题?(其他机器通过tcp可以的)
先放个命令在mysql运行机上链接的方法:

原因一:
linux系统一次不正常关机后,连接mysql的时候系统提示不能通过/tmp/mysql.sock文件进行连接,或者非正确关闭时,导致mysql.sock文件再次丢失,当你在次启动时出现如下错误,connect mysqld faild ,/tmp/mysql.sock can't find
mysql.sock的丢失主要是因为更改了机器名,在没有正确关闭mysqld的情况下,去执行mysqld_safe,这样他就删除已经运行的mysql.sock了。正常情况下,mysqld_safe 应该告诉我们是已经有Mysqld运行了,而上边并没有这样提示,主要是更改机器名导致mysqld_safe判断是否已经运行,去找的是newhostname.pid文件,但已经运行的mysqld生成的是oldhostname.pid, 肯定找不到newhostname.pid,所以mysqld_safe收拾一下(清理了mysql.sock),然后去重启,但是ibdata需要lock,它lock不了,还是起不了,但是老的mysql.sock就消失。
原因二:
连接localhost通常通过一个Unix域套接字文件进行,一般是/tmp/mysql.sock。如果套接字文件被删除了,本地客户就不能连接。这可能发生在你的系统运行一个cron任务删除了/tmp下的临时文件。
如果你因为丢失套接字文件而不能连接,你可以简单地通过重启服务器重新创建得到它。因为服务器在启动时重新创建它。

解决办法,实时上,在/etc/init.d 下有个连接启动脚本 mysqld ,我们启动时可以直接用它 service mysqld start |stop
来自:http://blog.csdn.net/imzoer/article/details/8444400
实践情况如下:
[root@localhost init.d]# mysqladmin -u root -hlocalhost -p shutdown
Enter password:
mysqladmin: connect to server at 'localhost' failed
error: 'Can't connect to local MySQL server through socket '/tmp/mysqld.sock' (2)'
Check that mysqld is running and that the socket: '/tmp/mysqld.sock' exists!
直接干死了:
pkill -9 mysql
重启:
/usr/local/mysql/bin/mysqld --basedir=/usr/local/mysql --datadir=/data/db/mysql --plugin-dir=/usr/local/mysql/lib/plugin --user=mysql --log-error=/data/db/mysql/localhost.err --open-files-limit=65535 --pid-file=/usr/local/mysql/xd_xiyou_db_7.pid --socket=/tmp/mysqld.sock --port=3306

————————————————上面这种太粗暴,实践操作Ok如下:—————————————————————————
[root@localhost init.d]# service mysql stop
Shutting down MySQL.....                                   [  OK  ]
[root@localhost init.d]# service mysql start
Starting MySQL...                                          [  OK  ]

启动原理:
/etc/init.d/mysql
里写明了basedir及datadir,这块datadir很重要,启动时起了很大的作用,在安装时就定下来不改动最好了:

——————————————————————————————————————————————————————————
出现以下的信息:
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)
如果还不行.就先
#ps -aux|grep mysql
找mysql的进程里的那个socket位置,如:

方法一:
mysql --port=3306 -uroot -p123qwe*** -S /var/lib/mysql/mysql.sock
方法二:
mysql --socket=/var/lib/mysql/mysql.sock --port=3306 -uroot -p123qwe***
方法三:
ln -s /var/lib/mysql/mysql.sock /tmp/mysql.sock
阅读全文
当你有QQ消息时,QQ的小图标会晃动,我们甚至还可以设定QQ有消息时,自动弹出来!
这些在C/S模式下很容易实现!如果要在B/S模式如何来实现呢?
我们的肯定会想到在客服端调用ajax在后台不断的查询服务器.看是否有关于自己的消息.如果有则查询返回.这种做法肯定会大量的占用系统的资源!不可取!
现在DWR的反转AJAX功能.允许我们从服务器端来控制客服端.而不需要客户端来请求.服务器可以自动把消息发给指定的客户端! 点击在新窗口中浏览此图片
点击在新窗口中浏览此图片
我不能把公司的代码贴出来,所以我自己写了一个DEMO,已经实现了对指定用户发送消息的功能,并且即时显示在指定的用户界面上面.当然你可以修改这些,让它弹出来显示,或者像QQ一样在你页面的某个角落让消息的图标闪动:)
下面我做一个简单的说明:阅读全文

#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;
}
用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赚了....
http://www.sunnyu.com/?p=93
给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"


其中 /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();
}
?>
一网友和我聊天,他刚到公司不到一个月,昨天被临时抽到到一个客户那里协助做一些事情,系统是多个各自相对独立的系统,总部可以访问每个分系统,但他因为刚进这个项目,根本并不知道这些。

    工作做得还算顺利,中间来了一个领导模样的人,随便看了看,问问工作的如何,他们说一些工作已经在总部做了,这面就是一些简单的事情。对方很惊讶,问总部能访问我们的数据吗? 这时候他为了证明自己熟悉互联网,熟悉架构,就说当然可以,大家都是访问一个中心服务器,总部只要有帐号和密码就能进去了。那个人又很惊讶的问,不是吧,我们的服务器可是在我们楼下的机房里啊?他们怎么能访问?这位网友当时愣住了,有些茫然和尴尬,难道猜错了。。。。

    工作中,在没有搞清楚某个事情的时候,不要随便发表自己的看法,如果要回答,也是你的前辈同事负责解答,毕竟你不了解。

    新到一个地方,表现一下自己是对的,但一定要量力而为。在大多数时候,多做多看,比多说要好。当大家需要你发表意见的时候,你一定要准备好;在大家讨论的时候,你也可以发表自己的意见,但当面对客户,解答客户疑问的时候,如果你不负责这一块,你还是先闭上嘴好了,除非你的同事让你来说。




本文来自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 ) ;
安装好:Visual Studio6,除了VB VC FOXPRO,安装好后:
打开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
阅读全文
vi /etc/rc.d/init.d/iptables
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的结果演示:
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

阅读全文
分页: 242/339 第一页 上页 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 下页 最后页 [ 显示模式: 摘要 | 列表 ]