浅析:setsockopt()


1. 如果在已经处于 ESTABLISHED状态下的socket(一般由端口号和标志符区分)调用closesocket(一般不会立即关闭而经历TIME_WAIT的过程)后想继续重用该socket:
BOOL bReuseaddr=TRUE;
setsockopt(s,SOL_SOCKET ,SO_REUSEADDR,(const char*)&bReuseaddr,sizeof(BOOL));


2. 如果要已经处于连接状态的soket在调用closesocket后强制关闭,不经历TIME_WAIT的过程:
BOOL bDontLinger = FALSE;
setsockopt(s,SOL_SOCKET,SO_DONTLINGER,(const char*)&bDontLinger,sizeof(BOOL));


3.在send(),recv()过程中有时由于网络状况等原因,发收不能预期进行,而设置收发时限:
int nNetTimeout=1000;//1秒
//发送时限
setsockopt(socket,SOL_S0CKET,SO_SNDTIMEO,(char *)&nNetTimeout,sizeof(int));
//接收时限
setsockopt(socket,SOL_S0CKET,SO_RCVTIMEO,(char *)&nNetTimeout,sizeof(int));


4.在send()的时候,返回的是实际发送出去的字节(同步)或发送到socket缓冲区的字节(异步);系统默认的状态发送和接收一次为8688字节(约为8.5K);在实际的过程中发送数据和接收数据量比较大,可以设置socket缓冲区,而避免了send(),recv()不断的循环收发:
// 接收缓冲区
int nRecvBuf=32*1024;//设置为32K
setsockopt(s,SOL_SOCKET,SO_RCVBUF,(const char*)&nRecvBuf,sizeof(int));
//发送缓冲区
int nSendBuf=32*1024;//设置为32K
setsockopt(s,SOL_SOCKET,SO_SNDBUF,(const char*)&nSendBuf,sizeof(int));


5. 如果在发送数据的时,希望不经历由系统缓冲区到socket缓冲区的拷贝而影响程序的性能:
int nZero=0;
setsockopt(socket,SOL_S0CKET,SO_SNDBUF,(char *)&nZero,sizeof(nZero));


6.同上在recv()完成上述功能(默认情况是将socket缓冲区的内容拷贝到系统缓冲区):
int nZero=0;
setsockopt(socket,SOL_S0CKET,SO_RCVBUF,(char *)&nZero,sizeof(int));


7.一般在发送UDP数据报的时候,希望该socket发送的数据具有广播特性:
BOOL bBroadcast=TRUE;
setsockopt(s,SOL_SOCKET,SO_BROADCAST,(const char*)&bBroadcast,sizeof(BOOL));


8.在client连接服务器过程中,如果处于非阻塞模式下的socket在connect()的过程中可以设置connect()延时,直到accpet()被呼叫(本函数设

置只有在非阻塞的过程中有显著的作用,在阻塞的函数调用中作用不大)
BOOL bConditionalAccept=TRUE;
setsockopt(s,SOL_SOCKET,SO_CONDITIONAL_ACCEPT,(const char*)&bConditionalAccept,sizeof(BOOL));


9.如果在发送数据的过程中(send()没有完成,还有数据没发送)而调用了closesocket(),以前我们一般采取的措施是"从容关闭"shutdown(s,

SD_BOTH),但是数据是肯定丢失了,如何设置让程序满足具体应用的要求(即让没发完的数据发送出去后在关闭socket)?
struct linger {
u_short l_onoff;
u_short l_linger;
};
linger m_sLinger;
m_sLinger.l_onoff=1;//(在closesocket()调用,但是还有数据没发送完毕的时候容许逗留)
// 如果m_sLinger.l_onoff=0;则功能和2.)作用相同;
m_sLinger.l_linger=5;//(容许逗留的时间为5秒)
setsockopt(s,SOL_SOCKET,SO_LINGER,(const char*)&m_sLinger,sizeof(linger));
Note:1.在设置了逗留延时,用于一个非阻塞的socket是作用不大的,最好不用;2.如果想要程序不经历SO_LINGER需要设置SO_DONTLINGER,或

者设置l_onoff=0;


10.还一个用的比较少的是在SDI或者是Dialog的程序中,可以记录socket的调试信息:
(前不久做过这个函数的测试,调式信息可以保存,包括socket建立时候的参数,采用的
具体协议,以及出错的代码都可以记录下来)
BOOL bDebug=TRUE;
setsockopt(s,SOL_SOCKET,SO_DEBUG,(const char*)&bDebug,sizeof(BOOL));


11.附加:往往通过setsockopt()设置了缓冲区大小,但还不能满足数据的传输需求,我的习惯是自己写个处理网络缓冲的类,动态分配内存;


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/ast_224/archive/2008/11/14/3111347.aspx
一、php获取前一天的时间

来自:http://www.maitanbang.com/blog/detal/?id=2500


二、PHP返回明天的日期

获取明天的起始时间和结束时间:

来自:https://www.codenong.com/cs106120430/

三、2010-08-06 12:00:55   用smarty只显示 2010-08-06 怎么控制呢??
在php中使用date函数来格式化时间戳,smarty中可以使用date_format来实现
具体用法:
{$timestamp|date_fomat:”%Y-%m-%d %H:%M:%S”}

注意:| 两边没有空格
输出形式:2010-07-10 16:30:25

其他用法如下:

{$smarty.now|date_format}
{$smarty.now|date_format:”%A, %B %e, %Y”}
{$smarty.now|date_format:”%H:%M:%S”}
{$yesterday|date_format}
{$yesterday|date_format:”%A, %B %e, %Y”}
{$yesterday|date_format:”%H:%M:%S”}


链接来源:http://www.yaronspace.cn/blog/index.php/archives/717


date_format[日期格式]

index.php:

$smarty = new Smarty;
$smarty->assign('yesterday', strtotime('-1 day'));
$smarty->display('index.tpl');

index.tpl:

{$smarty.now|date_format}
{$smarty.now|date_format:"%A, %B %e, %Y"}
{$smarty.now|date_format:"%H:%M:%S"}
{$yesterday|date_format}
{$yesterday|date_format:"%A, %B %e, %Y"}
{$yesterday|date_format:"%H:%M:%S"}

OUTPUT:

Feb 6, 2001
Tuesday, February 6, 2001
14:33:00
Feb 5, 2001
Monday, February 5, 2001
14:33:00

来源:http://hi.baidu.com/cubeking/blog/item/d69cccb7b5916cc237d3ca56.html
买了一本书:完全手册Linux系统下C程序开发详解 里面的网络tcp那块的节选,感觉不错,贴出来一下:
所谓服务器程序,指的是在网络通信时这个程序始终处于等待状态,可以接受用户的连接请求,并且对用户发送的信息进行处理,本节的实例是面向连接的套接字通信服务器程序。程序的重点是端口的监听和接收发送的信息。阅读全文
select()机制中提供一fd_set的数据结构,实际上是一long类型的数组,每一个数组元素都能与一打开的文件句柄(不管是socket句柄,还是其他文件或命名管道或设备句柄)建立联系,建立联系的工作由程序员完成,当调用select()时,由内核根据IO状态修改fe_set的内容,由此来通知执行了select()的进程哪一socket或文件可读。阅读全文
PWM( 脉宽调制) 在很多场合都用得上,例如LED 亮度控制,开关电源输出电圧控制等。
这里采用简单的定时器实现PWM 波输出,通过更改定时器定时参数,控制IO 口输出
波形高低电平持续时间,实现PWM 波。阅读全文
51单片机产生正弦波






ORG  00H
LJMP MAIN
ORG 0100H
MAIN:
    MOV DPTR,#sinTab
LOOP:
    CLR  A
    MOVC  A,@A+DPTR
    CJNE  A,#129,LOOP1
    AJMP   MAIN
LOOP1:
    MOV P3,A
    INC DPTR
    AJMP LOOP

sinTab:DB 128,132,137,141,146,150,154,159,163,167
       DB 171,176,180,184,188,191,195,199,203,206
       DB 210,213,216,219,222,225,228,231,233,236
       DB 238,240,242,244,246,247,249,250,251,252
       DB 253,254,254,255,255,255,255,255,254,254
       DB 253,252,251,250,249,247,246,244,242,240
       DB 238,236,233,231,228,225,222,219,216,213
       DB 210,206,203,198,195,192,188,184,180,176
       DB 172,167,163,159,155,150,146,141,137,133
       DB 128,124,119,115,111,106,102,97,93,89,85
       DB 81,77,73,69,65,61,57,54,50,47,43,40,37
       DB 34,31,28,25,23,20,18,16,14,12,10,9,7
       DB 6,5,4,3,2,2,1,1,1,1,1,2,2,3,4,5,6
       DB 7,9,10,12,14,16,18,20,23,25,28,30,33,36
       DB 40,43,46,50,53,57,60,64,68,72,76,80,84
       DB 88,93,97,101,106,110,114,119,123,128,129

找了段韩国人写的PHP,哈哈
<?php
##  시스템 정보 출력 ########################################
##
##  작성자    : 김칠봉[닉:산이] <san2(at)linuxchannel.net>
##  스크립트 명 : PHP를 이용한 시스템 정보를 출력하는 스크립트
##
#############################################################
##
## 주)
## 사용상 부주의로 인한 피해는
## 본 작성성자에게 어떠한 보증이나 책임이 없습니다.
##
##############################################################

##############################################################
##
## speed up `for()'
##  1) not good : for($i=0; $i<count($tmp=@file('file')); $i++)
##  2) good : $tmp=@file('file'); for($i=0; $i<count($tmp); $i++)
##
##############################################################

class sysinfo_common
{
  ## 파일 크기 출력 함수
  ## $bfsize 변수는 bytes 단위의 크기임
  ##
  function file_hsize($bfsize, $sub=0)
  {
    $BYTES = number_format($bfsize).' Bytes';

    if($bfsize < 1024) return $BYTES;
    else if($bfsize < 1048576) $bfsize = number_format(round($bfsize/1024)).' KB';
    else if($bfsize < 1073741827) $bfsize = number_format(round($bfsize/1048576)).' MB';
    else $bfsize = number_format($bfsize/1073741827,1).' GB';

    if($sub) $bfsize .= "($BYTES)";

    return $bfsize;
  }


  function get_title()
  {
    global $_SERVER, $_ENV; // for PHP/4.0.x

    if(!$hostname[0] = $_ENV["HOSTNAME"])
    { $hostname = @file('/proc/sys/kernel/hostname'); }

    return $_SERVER['HTTP_HOST'].' ('.$hostname[0].')';
  }


  function get_mem()
  {
    if(!$mem = @file('/proc/meminfo')) return;

    $get = array();

    if(preg_match('/^Mem:/',$mem[1])) // Linux/2.2.x/2.4.x
    {
        list($null,$get['total'],$get['used'],$get['free'],$get['shared'],$get['buffered'],$get['cached'])
        = preg_split('/\s+/',$mem[1]);
        list($null,$get['swaptotal'],$get['swapused'],$get['swapfree']) = preg_split('/\s+/',$mem[2]);
    } else // Linux/2.6.0-test
    {
        $map = array('MemTotal:'=>'total','MemFree:'=>'free','Buffers:'=>'buffered',
            'Cached:'=>'cached','SwapTotal:'=>'swaptotal','SwapFree:'=>'swapfree',
            'kB'=>1024,'B'=>1,'mB'=>1048576,'MB'=>1048576);
        $mem = preg_grep('/^(?:MemTotal|MemFree|Buffers|Cached|SwapTotal|SwapFree):/',$mem);

        foreach($mem AS $v)
        {
            $n = preg_split('/\s+/',$v);
            $mkey = $map[$n[0]];
            $multipli = $map[$n[2]];
            $get[$mkey] = $n[1] * $multipli;
        }
        $get['used'] = $get['total'] - $get['free'];
    }

    $get['freepercent'] = @round(($get['free']/$get['total'])*100); // 여유 메모리 퍼센트
    $get['usedpercent'] = 100 - $get['freepercent']; // 사용한 메모리 퍼센트

    // 2001.03.18일 추가(실제 사용량 계산)
    $get['totalfree'] = $get['free'] + $get['buffered'] + $get['cached']; // 실제 남은 메모리
    $get['totalused'] = $get['total'] - $get['totalfree']; // 실제로 사용한 메모리
    $get['totalfreepercent'] = @round(($get['totalfree']/$get['total'])*100); // 실제 남은 메모리 퍼센트
    $get['totalusedpercent'] = 100 - $get['totalfreepercent'];  // 실제 사용한 메모리 퍼센트

    //2001.02.26일 추가
    $get['bufferedpercent'] = @round(($get['buffered']/$get['total'])*100); // 버퍼메모리 퍼센트
    $get['cachedpercent'] = @round(($get['cached']/$get['total'])*100); // 캐쉬메모리 퍼센트

    $get['swapfreepercent'] = @round(($get['swapfree']/$get['swaptotal'])*100); // 스왑 여유 공간 퍼센트
    $get['swapusedpercent'] = 100 - $get['swapfreepercent']; // 사용한 스왑 퍼센트

    // 보정
    foreach(array('total','free','used','buffered','cached','totalfree','totalused',
        'swaptotal','swapfree','swapused') AS $k)
    {
        $get[$k] = $this->file_hsize($get[$k]);
    }

    return $get;
  }


  function get_part()
  {
    ## 각 파티션(FS)와 마운트 포인트 계산
    ##
    $mounts = @file('/proc/mounts');

    for($i=0; $i<count($mounts); $i++)
    {
        if(preg_match('/ext[23]|vfat|ntfs|reiserfs|xfs|jfs/',$mounts[$i]))
        {
            list($p['dev'][],$p['mount'][],$p['efs'][])
            = preg_split('/\s+/', $mounts[$i]);
        }
    }

    $num = count($p['dev']);

    ## 각 파티션 사용량 계산
    ##
    @exec('/bin/df -k 2>/dev/null',$df); // KB 단위로 출력, $df는 배열

    if($df)
    {
        unset($p['dev']); // change partition name
        for($i=1; $i<count($df); $i++)
        {
            if(preg_match(';^/dev/;',$df[$i]))
            {
                list($p['dev'][],$size,$used,$avail,$percent)
                = preg_split('/\s+/',$df[$i]);

                ## 각 파티션 used %
                ##
                $percent = (int)$percent;
                $p['percent'][] = $percent;
                $p['percent_avail'][] = 100 - $percent;

                ## 각 파티션 크기
                ##
                $size = $size * 1024; // for PHP/4.3.2 bug ?
                $p['size']['sum'] += $size; // Byte 단위로 환산
                $p['size'][] = $this->file_hsize($size);

                ## 각 파티션 사용한 용량
                ##
                $used = $used * 1024; // for PHP/4.3.2 bug ?
                $p['used']['sum'] += $used;
                $p['used'][] = $this->file_hsize($used);

                ## 각 파티션 여유 용량
                ##
                $avail = $avail * 1024; // for PHP/4.3.2 bug ?
                $p['avail']['sum'] += $avail;
                $p['avail'][] = $this->file_hsize($avail);
            }
        }

        $p['fix'] = '* 합계가 정확하게 맞지 않은 이유는 약 '.
            $this->file_hsize($p['size']['sum'] - $p['used']['sum'] - $p['avail']['sum']).
            '(각 파티션 합) 정도를 시스템이 미리 확보했기 때문입니다.';

        $p['percent']['total'] = @round($p['used']['sum']*100/$p['size']['sum']);
        $p['percent_avail']['total'] = 100 - $p['percent']['total'];
        $p['size']['sum'] = $this->file_hsize($p['size']['sum']);
        $p['used']['sum'] = $this->file_hsize($p['used']['sum']);
        $p['avail']['sum'] = $this->file_hsize($p['avail']['sum']);

        ## last check partitions number
        ##
        $cnt = count($p['dev']);

        /*** good idea, but unnecessary
        ## check chroot enviroments
        ##
        if($num > $cnt)
        { for($i=$cnt; $i<$num; $i++) $p['size'][$i] = 'NA'; }
        ***/
    }

    ## change partitions number
    ##
    $p['dev']['num'] = $cnt ? $cnt : $num;

    return $p;
  }


  ## support S/390, 2002.10.23
  ##
  function get_proc_part()
  {
    if(!$part = @file('/proc/partitions')) return;

    ## disk block table
    ## /usr/src/linux/Documentations/devices.txt
    ## major => 'type','name','minor'
    ##
    $ddtable = array(
    3 => array('eide','E-IDE',64),        // First MFM, RLL and IDE hard disk/CD-ROM interface
    8 => array('scsi','SCSI',16),        // SCSI disk devices
    9 => array('raid','RAID',1),        // Metadisk (RAID) devices
    13=> array('ide','XT-IDE',64),        // 8-bit MFM/RLL/IDE controller
    14=> array('bios','BIOS',64),        // BIOS harddrive
    21=> array('acorn','Acorn-MFM',64),    // Acorn MFM hard drive interface
    22=> array('eide','E-IDE',64),        // Second IDE hard disk/CD-ROM interface
    28=> array('acsi','ACSI',16),        // ACSI disk (68k/Atari)
    33=> array('eide','E-IDE',64),        // Third IDE hard disk/CD-ROM interface
    34=> array('eide','E-IDE',64),        // Fourth IDE hard disk/CD-ROM interface
    36=> array('mca','MCA-ESDI',64),    // MCA ESDI hard disk
    45=> array('ide','PP-IDE',16),        // Parallel port IDE disk devices
    47=> array('atapi','PP-ATAPI',1),    // Parallel port ATAPI disk devices
    48=> array('raid','DAC960-RAID',8),    // Mylex DAC960 PCI RAID controller
    49=> array('raid','DAC960-RAID',8),    // Mylex DAC960 PCI RAID controller
    50=> array('raid','DAC960-RAID',8),    // Mylex DAC960 PCI RAID controller
    51=> array('raid','DAC960-RAID',8),    // Mylex DAC960 PCI RAID controller
    52=> array('raid','DAC960-RAID',8),    // Mylex DAC960 PCI RAID controller
    53=> array('raid','DAC960-RAID',8),    // Mylex DAC960 PCI RAID controller
    54=> array('raid','DAC960-RAID',8),    // Mylex DAC960 PCI RAID controller
    55=> array('raid','DAC960-RAID',8),    // Mylex DAC960 PCI RAID controller
    56=> array('eide','E-IDE',64),        // Fifth IDE hard disk/CD-ROM interface
    57=> array('eide','E-IDE',64),        // Sixth IDE hard disk/CD-ROM interface
    65=> array('scsi','SCSI',16),        // SCSI disk devices
    66=> array('scsi','SCSI',16),        // SCSI disk devices
    67=> array('scsi','SCSI',16),        // SCSI disk devices
    68=> array('scsi','SCSI',16),        // SCSI disk devices
    69=> array('scsi','SCSI',16),        // SCSI disk devices
    70=> array('scsi','SCSI',16),        // SCSI disk devices
    71=> array('scsi','SCSI',16),        // SCSI disk devices
    72=> array('compaq','Compaq',16),    // Compaq Intelligent Drive Array
    73=> array('compaq','Compaq',16),    // Compaq Intelligent Drive Array
    74=> array('compaq','Compaq',16),    // Compaq Intelligent Drive Array
    75=> array('compaq','Compaq',16),    // Compaq Intelligent Drive Array
    76=> array('compaq','Compaq',16),    // Compaq Intelligent Drive Array
    77=> array('compaq','Compaq',16),    // Compaq Intelligent Drive Array
    78=> array('compaq','Compaq',16),    // Compaq Intelligent Drive Array
    79=> array('compaq','Compaq',16),    // Compaq Intelligent Drive Array
    80=> array('i2o','I2O',16),        // I2O hard disk
    81=> array('i2o','I2O',16),        // I2O hard disk
    82=> array('i2o','I2O',16),        // I2O hard disk
    83=> array('i2o','I2O',16),        // I2O hard disk
    85=> array('i2o','I2O',16),        // I2O hard disk
    86=> array('i2o','I2O',16),        // I2O hard disk
    87=> array('i2o','I2O',16),        // I2O hard disk
    88=> array('eide','E-IDE',64),        // Seventh IDE hard disk/CD-ROM interface
    89=> array('eide','E-IDE',64),        // Eighth IDE hard disk/CD-ROM interface
    90=> array('eide','E-IDE',64),        // Ninth IDE hard disk/CD-ROM interface
    91=> array('eide','E-IDE',64),        // Tenth IDE hard disk/CD-ROM interface
    92=> array('ppdd','PPDD',1),        // PPDD encrypted disk driver
    94=> array('ibm','IBM-S/390-DASD',4),    // IBM S/390 DASD block storage
    95=> array('ibm','IBM-S/390-VM/ESA',1),    // IBM S/390 VM/ESA minidisk
    101=>array('raid','AMI-HD-RAID',16),    // AMI HyperDisk RAID controller
    104=>array('compaq','Compaq',16),    // Compaq Intelligent Drive Array
    105=>array('compaq','Compaq',16),    // Compaq Intelligent Drive Array
    106=>array('compaq','Compaq',16),    // Compaq Intelligent Drive Array
    107=>array('compaq','Compaq',16),    // Compaq Intelligent Drive Array
    108=>array('compaq','Compaq',16),    // Compaq Intelligent Drive Array
    109=>array('compaq','Compaq',16),    // Compaq Intelligent Drive Array
    110=>array('compaq','Compaq',16),    // Compaq Intelligent Drive Array
    111=>array('compaq','Compaq',16),    // Compaq Intelligent Drive Array
    112=>array('ibm','IBM-iSeries',8),    // IBM iSeries virtual disk
    199=>array('vm','VxVM',1)        // Veritas volume manager (VxVM) volumes
    );

    for($i=2; $i<count($part); $i++) // start check $ppart[2];
    {
        list($major,$minor,$blocks,$name) = preg_split('/\s+/',trim($part[$i]));
        if($d = $ddtable[$major])
        {
            $type = $d[0];
            if($minor % $d[2])
            {
                $ppart[$type][$key] .= $name . ' ';
                if($blocks == 1)
                {
                    $ppart[$type][$key] .= '&lt; ';
                    $check[$type][] = $key;
                }
            } else
            {
                $key = (int) ${$type}++; // it's mean that counts of the HDD number
                //$key = $major.$minor; // HDD uniq ID
                $this->dd[$type][$key] = array('name'=>$d[1],'major'=>$major,'minor'=>$minor);
            }
        }
    }
    
    if(is_array($ppart))
    {
        foreach(array_keys($ppart) AS $type)
        {
            if($check[$type])
            {
                foreach($check[$type] AS $key)
                { $ppart[$type][$key] .= '&gt;'; }
            }
            sort($ppart[$type]); // for value sort
            sort($this->dd[$type]);
        }
    }

    return $ppart;
  }


  function get_swpart()
  {
    if(!$swaps = @file('/proc/swaps')) return;

    for($i=1; $i<count($swaps); $i++)
    { $sw .= preg_replace(';^/dev/([^ ]+).+\n*$;','\\1',$swaps[$i]) . ','; }

    return preg_replace('/,$/','',$sw);
  }


  ## same as $utils->get_file($file)
  ##
  function get_release($file)
  {
    if(!file_exists($file)) return;

    if(function_exists(dio_open))
    {
        if($fp = @dio_open($file,O_RDONLY))
        {
            $contents = dio_read($fp,filesize($file));
            dio_close($fp);
        }
        return $contents;
    }

    if($fp = @fopen($file,'r'))
    {
        $contents = fread($fp,filesize($file));
        fclose($fp);
    }

    return $contents;
  }


  function get_os()
  {
    global $ARCH;

    $ostype = PHP_OS;
    if(!$ARCH['r'] && (!$ARCH['r'] = $this->dmesg['kernel']))
    {
        unset($ostype);
        if(!$kernel = @file('/proc/sys/kernel/osrelease'))
        {
            if($kernel = @file('/proc/version'))
            { $ARCH['r'] = preg_replace('/^([^(]+) \(.+$/','\\1',$kernel[0]); }
        }
        else $ARCH['r'] = $kernel[0];
    }

    $tmp = array('/etc/hancom-release','/etc/redhat-release','/etc/debian_release',
        '/etc/version','/etc/Version','/etc/wow-release','/etc/wowlinux-release');

    foreach($tmp AS $v) if($dist = $this->get_release($v)) break;

    if(!$dist)
    {
        if($hdle = @opendir('/etc'))
        {
            while($file = @readdir($hdle))
            {
                if(preg_match('/release|version/i',$file))
                { $dist = $this->get_release('/etc/'.$file); break; }
            }
            closedir($hdle);
        }
    }

    return "$ostype $ARCH[r] $ARCH[m]" . ($dist ? ' / '.$dist : '');
  }


  function get_netstat()
  {
    if(!$netstat = @file('/proc/net/dev')) return;

    for($i=2; $i<count($netstat); $i++)
    {
        ## ':'과 공백문자를 나누어 배열형태로 만듬
        ## R : 받는 패킷
        ## T : 보낸 패킷

        $j = $i - 2;
        $tmp = explode(':',$netstat[$i]);
        $stat['iface'][$j] = trim($tmp[0]);

        if(preg_match('/^bond/',$stat['iface'][$j])) $bonding++;
        else if(preg_match('/^eth/',$stat['iface'][$j])) $ethernet++;

        list($bytes['R'],$stat['R_packets'][$j],$stat['R_errs'][$j],$stat['R_drop'][$j],
            $null,$null,$null,$null,$bytes['T'],$stat['T_packets'][$j],
            $stat['T_errs'][$j],$stat['T_drop'][$j],$stat['T_colls'][$j]
        ) = preg_split('/\s+/',trim($tmp[1]));

        $stat['R_size'][$j] = $this->file_hsize($bytes['R']);
        $stat['T_size'][$j] = $this->file_hsize($bytes['T']);

        // 충돌률 계산
        if($stat['T_packets'][$j] > 0)
        {
            if((int)$stat['T_colls'][$j]*100/$stat['T_packets'][$j] >= 5)
            {
                $stat['T_colls'][$j] = '<FONT COLOR="FF0000">'.$stat['T_colls'][$j].'</FONT>';
                $chk .= $stat['iface'][$j] . '&nbsp;';
            }
        }
    }

    if($bonding && $ethernet >= 2)
    {
        //$ethernet = $j - $bonding;
        $stat['fix'] = "현재 이 시스템은 ${ethernet}개의 ".
            TAG_A("<font color='#0000FF'>Ethernet Channel에 대해서 ${bonding}개의 ".
            '가상 bonding 장치</font>',
            'http://www.linuxchannel.net/docs/ethernet-channel-bonding.txt',
            '_blank','About the ethernet channel bonding').
            '가 설정되어 있음.<BR>&nbsp;&nbsp;';
    }

    $stat['fix'] = "* $stat[fix] TX의 Colls 항목은 collisions을 의미.";
    if($chk)
    { $stat['fix'] .= "<BR>&nbsp;&nbsp; <FONT COLOR='#FF0000'>$chk</FONT>검점 필요(충돌률 5%이상) !!!"; }

    return $stat;
  }
} // end of class

?>
前一阵一直在做单片机的程序,由于串口不够,需要用IO口来模拟出一个串口。经过若干曲折并参考了一些现有的资料,基本上完成了。现在将完整的测试程序,以及其中一些需要总结的部分贴出来。阅读全文
     假设要发送一组数据   Send[10]
一般采用查询发送(循环发送)方式:
unsigned char Send[10];                  //发送量
unsigned char i;                               //循环量
for(i=0;i<10;i++)
{
       SBUF= Send[i];                      //发送
       while(TI==0);                         //等待发送完成
       TI=0;                                      //清标志
}

采用中断发送方式:
unsigned char Send[10];                 //发送量
unsigned char num;                         //发送数据量
unsigned char *p;                           //发送用指针

//发送时:
num=10;                                        //定义发送数据量
p=&Send ;                                    //取首地址
SBUF=*p;                                    //发送第一个数据,启动发送中断
//中断代码:
void ComInt() interrupt 4
{
       if(RI)  RI=0;                          //接收中断略;
      
       if(TI)                                     //发送中断处理
       {
              TI=0;                             //清标志
              num--;                            //计数减1
              p++;                               //指针加1
              if(num >0) SBUF=*p;     //数据继续发送至全部发完
       }
}

中断发送优点:省去循环等待时间,以上面例子为例,9600bps时查询发送约占用单片机10ms多,而中断发送只占单片机几十微秒(单片机速度越快,占用时间越少)。
中断发送缺点:代码稍复杂,发送过程不易控制。
来源:http://mazhijing.blog.51cto.com/215535/197250
Ralph Ellison's Invisible Man

阅读全文
    在使用php原生api连接mysql数据库的时候往往需要建立与本地mysql的多个连接,这个时候,mysql会为你多次连接返回同样的文件描述符。这本来是php对mysql连接的一种优化,对于同一台机器的不同数据库操作,提供统一的连接,避免大量的新连接,影响通讯效率。但如果不注意控制会出现问题。
问题:
如果在程序开始部分,对同一台机器的数据库建立了多个连接,例如使用mysql_connect 函数连接了本地数据库a与b,返回的都是资源描述符9(mysql_connect 的返回值)此后并没有任何查询操作,mysql会对这种sleep连接进行断开(可以设置wait_timeout来控制断开的等待时间),这个时候,对资源描述符9的连接已经断开,当你再要查询的时候,mysql会返回gone away的错误,errno代码为2600,此时你需要重新连接mysql,为了让php真正重新连接,而不是返回已经存在的断开的9号描述符,需要先调用mysql_close函数,结束已经断开的9号连接,然后再次调用mysql_connect进行连接。
此时问题出现了,调用mysql_close,打印mysql_close信息,返回的是true,说明关成功。再次mysql_connect后系统返回的仍旧是刚才断开的9号描述符,查询还会显示mysql gone away。正常情况下当调用mysql_close后,再次连接,系统会分配一个新的资源符。说明由于开始的时候多次连接返回相同的描述符对mysql_close调用产生了影响,没有真正断开资源描述符为9的连接。

原理猜想:
程序开始部分多次连接,php返回相同的资源描述符,同时维护一个描述符的引用计数,由于连接两次,引用计数为2,当调用mysql_close的时候,第一次调用会对引用计数-1,这个时候系统知道还有一个连接使用该资源描述符,所以不会真正断开连接,虽然这个连接由于超时了,已经不能使用。只有再次调用mysql_close的时候,引用计数再次-1,这次引用计数为0,mysql_close函数才会真正断开连接,再次使用mysql_connect函数的时候才会建立新的连接。

解决方法:
在调用mysql_connect时候给定最后一个参数 $new_link 为true,这样对相同参数调用返回不同的描述符,再次查询时候,如果发现gone away,调用mysql_close即可关闭这个连接,然后新建连接即可。
猜想:
在使用mysqli的时候好像没有出现过这种问题,因为在连接时候直接选择了不同的数据库,无需再单独选择数据库,这个时候系统返回的描述符可能因为连接的库不同直接就返回不同描述符,不会出现上面这种现象。这个待证实。


来源:http://hi.baidu.com/johntech/blog/item/d7d9390a8e232add63d986ed.html
一)一定要有True,及FILE_APPEND:

二)生成Curl Post格式的接口调试:

三)生成db的update加where的日志(Key作为数据库的字段,值为值,where也一样):

一行完成Curl的POST输出:
view plainprint?
echo "curl -d\"".http_build_query($data)."\" ".$url;  

最近写一个infobright导入脚本的时候,需要判断文件超过一定大小2G时候,再建立一个文件,但在获取文件大小信息的时候,本来已经调用file_put_contents写入文件,但通过filesize获取文件大小的时候,大小还是没写入前的大小,后来发现原来php为了提高函数效率,会缓存之前文件信息,需调用 clearstatcache();来清除缓存,清除缓存后,再使用filesize函数获取的文件大小就正确了~~,正确调用过程如下:

file_put_contents($this->current_file, $data,FILE_APPEND);
clearstatcache();
if(filesize($this->current_file) > self::$file_max_size)
{
......
}

来源:http://hi.baidu.com/johntech/blog/item/50b23aebe3afb533b90e2d04.html
unbuntu虽然很好,但用来开发并不是很好,很多东西库都比较新,在上面开发的东西兼容性和可移植性差,所以最终还是选择了centos5.4.
阅读全文



大家都知道,PHP中有个函数叫json_encode,可以对变量进行 JSON 编码。

使用这个函数就可以把AJAX请求的返回值给转换成JSON格式,方便处理啊。

可是这个返回值并不是真正意义上的Javascript的JSON对象。

从面向对象的角度来讲,一切皆是对象,呵呵。

所以,忘了从哪里扒下来的这个函数,分享出来方便大家使用。

最主要的是给自己加个念想。呵。毕竟曾经学习过。


function evalJson( jsonText )
{/*{{{*/
    var jsonObject;
    switch(typeof jsonText ){
    case 'string':
        try{
            jsonObject = eval('('+jsonText+')');
        }
        catch(e){
            jsonObject = null;
        }
        break;
    case 'object':
    case 'number':
    case 'boolean':
    case 'function':
        jsonObject = jsonText;
    }
    return jsonObject;
}/*}}}*/



传递过去的参数jsonTest就是通过PHP,json_encode函数处理后的返回结果。

这样,我们就可以用心爱的JSON来处理AJAX返回值了。呵呵。

来源:http://www.xiaoxiaozi.com/2009/04/02/39/
外带4pin转sata电源线
分页: 152/272 第一页 上页 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 下页 最后页 [ 显示模式: 摘要 | 列表 ]