软件开发: 01 2010存档

使用http_load的过程中遇到了一个报错:Cannot assign requested address

网上找到了原因和解决方案 http://gcoder.blogbus.com/logs/41839731.html

但是要注意,这是客户端的问题,是客户端用光了端口号,所以要改客户端机器的配置和代码,不是改服务端的!

我在http_load.c里给socket加了一个SO_REUSEADDR,才能工作正常。为什么http_load不加上这个option呢?因为http_load测的是标准的http服务器,比如apache,这些服务端会关闭socket,而我测的是自己写的httpd,所以....看来细节很多啊。


====== 2010.08.18 ======

今天又遇到这个问题,在代码里加了SO_REUSEADDR也没用,只能采用在sysctl.conf里加:

net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1

的办法

pthread_t    pthr;

pthread_create(&pthr, NULL, thread_handler, NULL);

...

void* thread_handler(void* arg)

{

    /* do something */

    pthread_join(pthr, NULL);

}


上面的代码不好使,pthread_join不能放在pthread调用的handler内,虽然不报错,但是thread无法正常回收,如果多次创建thread,内存会越来越大(另一种形式的内存泄露)。

正确的做法是在handler外面pthread_join:


pthread_t    pthr;

pthread_create(&pthr, NULL, thread_handler, NULL);

pthread_join(pthr, NULL);

...

void* thread_handler(void* arg)

{

    /* do something */

}


如果不用pthread_join,改用pthread_detach呢?那最方便,但要注意:pthread_detach最好是放在handler里面第一句。


void* thread_handler(void* arg)

{

    pthread_detach(pthr);

    /* do something */

}


如果pthread_create后紧跟pthread_detach,有可能会出错。

小心使用grep里的星号(*)

grep "/home/.*test"

上面这句是找出所有/home目录下,以test结尾的文件

grep "/home/*test"

这句可就不是了,这句grep只匹配以下的文件名:

/hometest

/home/test

/home//test

/home///test

看明白了,星号(*)代表重复其前面的字符任意次(包括零),而“/*“当然就表示重复”/”任意次。

另外注意grep后面的正则表达式务必加上双引号,如果不加,在一些特殊场合会有完全不同的含义。

比如我当前目录下有六个文件:

testa

testb

testc

testd

tt

t

运行:

ls -l|grep t*t

它会把这五个文件都列出来吗?不,结果显示只找到了文件tt

因为上面的shell命令,grep实际上是在找以t开头且以t结尾的文件(这一规则和ls的规则一样)

要想grep把后面的”t*t”当成正则表达式,需要加上双引号:

ls -l|grep "t*t"

这下结果ok了:所有六个文件都可以被找到。

struct example
{
    ....
    int errno
};

上面的example结构使用errno做成员变量名,按理说不会和<errno.h>里的errno宏冲突,因为它在struct里,何况我根本没有包含errno.h文件
在大部分机器上,这可以编译成功。但是,在有的环境确实无法编译通过,gcc不认errno前面的“->”指针符号。
看来<errno.h>里的errno宏漏进了文件,但是怎么漏进来的?不详。
这位老兄和我遇到的问题一样: http://gcc.gnu.org/ml/gcc/2001-12/msg00766.html
但那毕竟是老gcc下的问题了,现在应该没有了。

在查到详细原因之前,还是把errno改了为妙,毕竟变量名和系统全局变量(或宏)弄成一样,是有风险的。
      法国人做的菜,我个人觉得很生、很难吃,但他们有一个习惯却是我们应该学习的:如果一个法国人在餐厅吃到了自己觉得很可口的菜,他会问服务生:
      “我能见一下为我做这份晚餐的厨师吗?”
      因为他要当面感谢这个为烹饪美食的厨师。
      食物是上帝赐予的,所以要感谢上帝;美餐是厨师制造的,所以也要感谢厨师。这是多好的习惯!法式料理全球有名,皆是此伟大习惯所赐。

      昨晚梅坚请客,看了电影《avatar》。没啥可说的,也不需我再加评论——满分。这才称得上大片。大家抓紧去电影院看,12年了,我就推荐大家去电影院看这么一部,不算过分了。
      真得好好感谢导演,James Cameron同学,他从97年拍完《泰坦尼克号》就开始构思《avatar》的剧情,2006年8月开始拍摄,三年多的辛劳,终成大作。James,可爱的老头,12年了,终于落叶归根,从商业片里沉淀而出,回到了童年,拍出了这部如所有人童年一般纯洁透明的电影。
       做为一个对音乐和声音敏感的人,我还要感谢影片的作曲,老熟人 James Horner,之所以称熟人,是因为我所喜欢的《勇敢的心》、梅坚所喜欢的《异形2》、大家所喜欢的《泰坦尼克号》(97年)、奥斯卡评委所喜欢的《美丽 心灵》,都是由他作曲配乐。而《avatar》里的配乐,更秉承了James Horner一贯的轻盈、灵快的风格。感谢James Horner为我们带来的天籁之音。
       当然,还要感谢梅坚。有人请客看电影,感觉更好。

       当我用gcc的时候,我感谢Richard Stallman,如果不是他带头做出了如此出色的编译器,带头启动了GNU,我可能还在用VC开发,VC太贵了,我买不起的。
       当我用linux的时候,我感谢Linus,感谢Alon Cox,当然,还有所有内核开发者,不是他们做出了这么出色的OS,我现在可能还在windows下开发,windows太贵了,我买不起的。
       感谢这些计算机领域的英雄,他们就是潘多拉星球上的“魅影骑士”,有他们在,我们的editor,我们的compiler,我们的OS,我们的家园,才不会被某个超级跨国软件公司所霸占、所蚕食、所掠夺。我们才能在大树下自由的开发。
       请追随这些英雄们。




《avatar》开篇曲
Gmail,Outlook都是支持html格式的邮件的,比plain txt内容更丰富。但是console下怎么发html格式的邮件呢?mail?mutt?我google了好几篇文章,都没搞定(用mutt加header发送是没用的),最后,一位仁兄给出答案:
http://www.liamdelahunty.com/tips/linux_send_html_email_from_command_line.php

很简单,在html文件(比如my.html)前面补上三行:
To: hao.bigrat@example.com
Subject: OhMyGod
Content-Type: text/html; charset="gbk"

<html>
<table>
......

然后
sendmail hao.bigrat@example.com < my.html