前言:日期在数据库处理中都是非常麻烦的事情。这里给出mysql中对日期函数的处理及应用

-- 作者:未知
-- 发布日期: 2005-05-27

对于每个类型拥有的值范围以及并且指定日期何时间值的有效格式的描述见7.3.6 日期和时间类型。  

这里是一个使用日期函数的例子。下面的查询选择了所有记录,其date_col的值是在最后30天以内:  

mysql> SELECT something FROM table  
WHERE TO_DAYS(NOW()) - TO_DAYS(date_col) <= 30;  

DAYOFWEEK(date)  
返回日期date的星期索引(1=星期天,2=星期一, ……7=星期六)。这些索引值对应于ODBC标准。  
mysql> select DAYOFWEEK('1998-02-03');  
-> 3  

WEEKDAY(date)  
返回date的星期索引(0=星期一,1=星期二, ……6= 星期天)。  
mysql> select WEEKDAY('1997-10-04 22:23:00');  
-> 5  
mysql> select WEEKDAY('1997-11-05');  
-> 2  

DAYOFMONTH(date)  
返回date的月份中日期,在1到31范围内。  
mysql> select DAYOFMONTH('1998-02-03');  
-> 3  

DAYOFYEAR(date)  
返回date在一年中的日数, 在1到366范围内。  
mysql> select DAYOFYEAR('1998-02-03');  
-> 34  

MONTH(date)  
返回date的月份,范围1到12。  
mysql> select MONTH('1998-02-03');  
-> 2  

DAYNAME(date)  
返回date的星期名字。  
mysql> select DAYNAME("1998-02-05");  
-> 'Thursday'  

MONTHNAME(date)  
返回date的月份名字。  
mysql> select MONTHNAME("1998-02-05");  
-> 'February'  

QUARTER(date)  
返回date一年中的季度,范围1到4。  
mysql> select QUARTER('98-04-01');  
-> 2  

WEEK(date)  
   
WEEK(date,first)  
对于星期天是一周的第一天的地方,有一个单个参数,返回date的周数,范围在0到52。2个参数形式WEEK()允许
你指定星期是否开始于星期天或星期一。如果第二个参数是0,星期从星期天开始,如果第二个参数是1,
从星期一开始。  
mysql> select WEEK('1998-02-20');  
-> 7  
mysql> select WEEK('1998-02-20',0);  
-> 7  
mysql> select WEEK('1998-02-20',1);  
-> 8  

YEAR(date)  
返回date的年份,范围在1000到9999。  
mysql> select YEAR('98-02-03');  
-> 1998  

HOUR(time)  
返回time的小时,范围是0到23。  
mysql> select HOUR('10:05:03');  
-> 10  

MINUTE(time)  
返回time的分钟,范围是0到59。  
mysql> select MINUTE('98-02-03 10:05:03');  
-> 5  

SECOND(time)  
回来time的秒数,范围是0到59。  
mysql> select SECOND('10:05:03');  
-> 3  

PERIOD_ADD(P,N)  
增加N个月到阶段P(以格式YYMM或YYYYMM)。以格式YYYYMM返回值。注意阶段参数P不是日期值。  
mysql> select PERIOD_ADD(9801,2);  
-> 199803  

PERIOD_DIFF(P1,P2)  
返回在时期P1和P2之间月数,P1和P2应该以格式YYMM或YYYYMM。注意,时期参数P1和P2不是日期值。  
mysql> select PERIOD_DIFF(9802,199703);  
-> 11  

DATE_ADD(date,INTERVAL expr type)  
   
DATE_SUB(date,INTERVAL expr type)  
   
ADDDATE(date,INTERVAL expr type)  
   
SUBDATE(date,INTERVAL expr type)  
这些功能执行日期运算。对于MySQL 3.22,他们是新的。ADDDATE()和SUBDATE()是DATE_ADD()和DATE_SUB()的同义词。
在MySQL 3.23中,你可以使用+和-而不是DATE_ADD()和DATE_SUB()。(见例子)date是一个指定开始日期的
DATETIME或DATE值,expr是指定加到开始日期或从开始日期减去的间隔值一个表达式,expr是一个字符串;它可以以
一个“-”开始表示负间隔。type是一个关键词,指明表达式应该如何被解释。EXTRACT(type FROM date)函数从日期
中返回“type”间隔。下表显示了type和expr参数怎样被关联: type值 含义 期望的expr格式  
SECOND 秒 SECONDS  
MINUTE 分钟 MINUTES  
HOUR 时间 HOURS  
DAY 天 DAYS  
MONTH 月 MONTHS  
YEAR 年 YEARS  
MINUTE_SECOND 分钟和秒 "MINUTES:SECONDS"  
HOUR_MINUTE 小时和分钟 "HOURS:MINUTES"  
DAY_HOUR 天和小时 "DAYS HOURS"  
YEAR_MONTH 年和月 "YEARS-MONTHS"  
HOUR_SECOND 小时, 分钟, "HOURS:MINUTES:SECONDS"  
DAY_MINUTE 天, 小时, 分钟 "DAYS HOURS:MINUTES"  
DAY_SECOND 天, 小时, 分钟, 秒 "DAYS HOURS:MINUTES:SECONDS"  

MySQL在expr格式中允许任何标点分隔符。表示显示的是建议的分隔符。如果date参数是一个DATE值并且你的计算仅仅
包含YEAR、MONTH和DAY部分(即,没有时间部分),结果是一个DATE值。否则结果是一个DATETIME值。  

mysql> SELECT "1997-12-31 23:59:59" + INTERVAL 1 SECOND;  
-> 1998-01-01 00:00:00  
mysql> SELECT INTERVAL 1 DAY + "1997-12-31";  
-> 1998-01-01  
mysql> SELECT "1998-01-01" - INTERVAL 1 SECOND;  
-> 1997-12-31 23:59:59  
mysql> SELECT DATE_ADD("1997-12-31 23:59:59",  
INTERVAL 1 SECOND);  
-> 1998-01-01 00:00:00  
mysql> SELECT DATE_ADD("1997-12-31 23:59:59",  
INTERVAL 1 DAY);  
-> 1998-01-01 23:59:59  
mysql> SELECT DATE_ADD("1997-12-31 23:59:59",  
INTERVAL "1:1" MINUTE_SECOND);  
-> 1998-01-01 00:01:00  
mysql> SELECT DATE_SUB("1998-01-01 00:00:00",  
INTERVAL "1 1:1:1" DAY_SECOND);  
-> 1997-12-30 22:58:59  
mysql> SELECT DATE_ADD("1998-01-01 00:00:00",  
INTERVAL "-1 10" DAY_HOUR);  
-> 1997-12-30 14:00:00  
mysql> SELECT DATE_SUB("1998-01-02", INTERVAL 31 DAY);  
-> 1997-12-02  
mysql> SELECT EXTRACT(YEAR FROM "1999-07-02");  
-> 1999  
mysql> SELECT EXTRACT(YEAR_MONTH FROM "1999-07-02 01:02:03");  
-> 199907  
mysql> SELECT EXTRACT(DAY_MINUTE FROM "1999-07-02 01:02:03");  
-> 20102  

如果你指定太短的间隔值(不包括type关键词期望的间隔部分),MySQL假设你省掉了间隔值的最左面部分。例如,
如果你指定一个type是DAY_SECOND,值expr被希望有天、小时、分钟和秒部分。如果你象"1:10"这样指定值,
MySQL假设日子和小时部分是丢失的并且值代表分钟和秒。换句话说,"1:10" DAY_SECOND以它等价于"1:10" MINUTE_SECOND
的方式解释,这对那MySQL解释TIME值表示经过的时间而非作为一天的时间的方式有二义性。如果你使用确实不正确的日期,
结果是NULL。如果你增加MONTH、YEAR_MONTH或YEAR并且结果日期大于新月份的最大值天数,日子在新月用最大的天调整。  

mysql> select DATE_ADD('1998-01-30', Interval 1 month);  
-> 1998-02-28  

注意,从前面的例子中词INTERVAL和type关键词不是区分大小写的。  
TO_DAYS(date)  
给出一个日期date,返回一个天数(从0年的天数)。  
mysql> select TO_DAYS(950501);  
-> 728779  
mysql> select TO_DAYS('1997-10-07');  
-> 729669  

TO_DAYS()不打算用于使用格列高里历(1582)出现前的值。  

FROM_DAYS(N)  
给出一个天数N,返回一个DATE值。  
mysql> select FROM_DAYS(729669);  
-> '1997-10-07'  

TO_DAYS()不打算用于使用格列高里历(1582)出现前的值。  

DATE_FORMAT(date,format)  
根据format字符串格式化date值。下列修饰符可以被用在format字符串中: %M 月名字(January……December)  
%W 星期名字(Sunday……Saturday)  
%D 有英语前缀的月份的日期(1st, 2nd, 3rd, 等等。)  
%Y 年, 数字, 4 位  
%y 年, 数字, 2 位  
%a 缩写的星期名字(Sun……Sat)  
%d 月份中的天数, 数字(00……31)  
%e 月份中的天数, 数字(0……31)  
%m 月, 数字(01……12)  
%c 月, 数字(1……12)  
%b 缩写的月份名字(Jan……Dec)  
%j 一年中的天数(001……366)  
%H 小时(00……23)  
%k 小时(0……23)  
%h 小时(01……12)  
%I 小时(01……12)  
%l 小时(1……12)  
%i 分钟, 数字(00……59)  
%r 时间,12 小时(hh:mm:ss  AP M)  
%T 时间,24 小时(hh:mm:ss)  
%S 秒(00……59)  
%s 秒(00……59)  
%p AM或PM  
%w 一个星期中的天数(0=Sunday ……6=Saturday )  
%U 星期(0……52), 这里星期天是星期的第一天  
%u 星期(0……52), 这里星期一是星期的第一天  
%% 一个文字“%”。  

所有的其他字符不做解释被复制到结果中。  

mysql> select DATE_FORMAT('1997-10-04 22:23:00', '%W %M %Y');  
-> 'Saturday October 1997'  
mysql> select DATE_FORMAT('1997-10-04 22:23:00', '%H:%i:%s');  
-> '22:23:00'  
mysql> select DATE_FORMAT('1997-10-04 22:23:00',  
'%D %y %a %d %m %b %j');  
-> '4th 97 Sat 04 10 Oct 277'  
mysql> select DATE_FORMAT('1997-10-04 22:23:00',  
'%H %k %I %r %T %S %w');  
-> '22 22 10 10:23:00 PM 22:23:00 00 6'  
MySQL3.23中,在格式修饰符字符前需要%。在MySQL更早的版本中,%是可选的。  

TIME_FORMAT(time,format)  
这象上面的DATE_FORMAT()函数一样使用,但是format字符串只能包含处理小时、分钟和秒的那些格式修饰符。
其他修饰符产生一个NULL值或0。  
CURDATE()  
   
CURRENT_DATE  
以'YYYY-MM-DD'或YYYYMMDD格式返回今天日期值,取决于函数是在一个字符串还是数字上下文被使用。  
mysql> select CURDATE();  
-> '1997-12-15'  
mysql> select CURDATE() + 0;  
-> 19971215  

CURTIME()  
   
CURRENT_TIME  
以'HH:MM:SS'或HHMMSS格式返回当前时间值,取决于函数是在一个字符串还是在数字的上下文被使用。  
mysql> select CURTIME();  
-> '23:50:26'  
mysql> select CURTIME() + 0;  
-> 235026  

NOW()  
   
SYSDATE()  
   
CURRENT_TIMESTAMP  
以'YYYY-MM-DD HH:MM:SS'或YYYYMMDDHHMMSS格式返回当前的日期和时间,取决于函数是在一个字符串还是在数字的
上下文被使用。  
mysql> select NOW();  
-> '1997-12-15 23:50:26'  
mysql> select NOW() + 0;  
-> 19971215235026  

UNIX_TIMESTAMP()  
   
UNIX_TIMESTAMP(date)  
如果没有参数调用,返回一个Unix时间戳记(从'1970-01-01 00:00:00'GMT开始的秒数)。如果UNIX_TIMESTAMP()用一
个date参数被调用,它返回从'1970-01-01 00:00:00' GMT开始的秒数值。date可以是一个DATE字符串、一个DATETIME
字符串、一个TIMESTAMP或以YYMMDD或YYYYMMDD格式的本地时间的一个数字。  
mysql> select UNIX_TIMESTAMP();  
-> 882226357  
mysql> select UNIX_TIMESTAMP('1997-10-04 22:23:00');  
-> 875996580  

当UNIX_TIMESTAMP被用于一个TIMESTAMP列,函数将直接接受值,没有隐含的“string-to-unix-timestamp”变换。  

FROM_UNIXTIME(unix_timestamp)  
以'YYYY-MM-DD HH:MM:SS'或YYYYMMDDHHMMSS格式返回unix_timestamp参数所表示的值,取决于函数是在一个字符串
还是或数字上下文中被使用。  
mysql> select FROM_UNIXTIME(875996580);  
-> '1997-10-04 22:23:00'  
mysql> select FROM_UNIXTIME(875996580) + 0;  
-> 19971004222300  

FROM_UNIXTIME(unix_timestamp,format)  
返回表示 Unix 时间标记的一个字符串,根据format字符串格式化。format可以包含与DATE_FORMAT()函数列出的条
目同样的修饰符。  
mysql> select FROM_UNIXTIME(UNIX_TIMESTAMP(),  
'%Y %D %M %h:%i:%s %x');  
-> '1997 23rd December 03:43:30 x'  

SEC_TO_TIME(seconds)  
返回seconds参数,变换成小时、分钟和秒,值以'HH:MM:SS'或HHMMSS格式化,取决于函数是在一个字符串还是在数字
上下文中被使用。  
mysql> select SEC_TO_TIME(2378);  
-> '00:39:38'  
mysql> select SEC_TO_TIME(2378) + 0;  
-> 3938  

TIME_TO_SEC(time)  
返回time参数,转换成秒。  
mysql> select TIME_TO_SEC('22:23:00');  
-> 80580  
mysql> select TIME_TO_SEC('00:39:38');  
-> 2378

如果你指定太短的间隔值(不包括type关键词期望的间隔部分),MySQL假设你省掉了间隔值的最左面部分。例如,
如果你指定一个type是DAY_SECOND,值expr被希望有天、小时、分钟和秒部分。如果你象"1:10"这样指定值,
MySQL假设日子和小时部分是丢失的并且值代表分钟和秒。换句话说,"1:10" DAY_SECOND以它等价于"1:10" MINUTE_SECOND
的方式解释,这对那MySQL解释TIME值表示经过的时间而非作为一天的时间的方式有二义性。如果你使用确实不正确的日期,
结果是NULL。如果你增加MONTH、YEAR_MONTH或YEAR并且结果日期大于新月份的最大值天数,日子在新月用最大的天调整。

mysql> select DATE_ADD('1998-01-30', Interval 1 month);
-> 1998-02-28

注意,从前面的例子中词INTERVAL和type关键词不是区分大小写的。
TO_DAYS(date)
给出一个日期date,返回一个天数(从0年的天数)。
mysql> select TO_DAYS(950501);
-> 728779
mysql> select TO_DAYS('1997-10-07');
-> 729669

TO_DAYS()不打算用于使用格列高里历(1582)出现前的值。

FROM_DAYS(N)
给出一个天数N,返回一个DATE值。
mysql> select FROM_DAYS(729669);
-> '1997-10-07'

TO_DAYS()不打算用于使用格列高里历(1582)出现前的值。

DATE_FORMAT(date,format)
根据format字符串格式化date值。下列修饰符可以被用在format字符串中: %M 月名字(January……December)
%W 星期名字(Sunday……Saturday)
%D 有英语前缀的月份的日期(1st, 2nd, 3rd, 等等。)
%Y 年, 数字, 4 位
%y 年, 数字, 2 位
%a 缩写的星期名字(Sun……Sat)
%d 月份中的天数, 数字(00……31)
%e 月份中的天数, 数字(0……31)
%m 月, 数字(01……12)
%c 月, 数字(1……12)
%b 缩写的月份名字(Jan……Dec)
%j 一年中的天数(001……366)
%H 小时(00……23)
%k 小时(0……23)
%h 小时(01……12)
%I 小时(01……12)
%l 小时(1……12)
%i 分钟, 数字(00……59)
%r 时间,12 小时(hh:mm:ss [AP]M)
%T 时间,24 小时(hh:mm:ss)
%S 秒(00……59)
%s 秒(00……59)
%p AM或PM
%w 一个星期中的天数(0=Sunday ……6=Saturday )
%U 星期(0……52), 这里星期天是星期的第一天
%u 星期(0……52), 这里星期一是星期的第一天
%% 一个文字“%”。

所有的其他字符不做解释被复制到结果中。

mysql> select DATE_FORMAT('1997-10-04 22:23:00', '%W %M %Y');
-> 'Saturday October 1997'
mysql> select DATE_FORMAT('1997-10-04 22:23:00', '%H:%i:%s');
-> '22:23:00'
mysql> select DATE_FORMAT('1997-10-04 22:23:00',
'%D %y %a %d %m %b %j');
-> '4th 97 Sat 04 10 Oct 277'
mysql> select DATE_FORMAT('1997-10-04 22:23:00',
'%H %k %I %r %T %S %w');
-> '22 22 10 10:23:00 PM 22:23:00 00 6'
MySQL3.23中,在格式修饰符字符前需要%。在MySQL更早的版本中,%是可选的。

TIME_FORMAT(time,format)
这象上面的DATE_FORMAT()函数一样使用,但是format字符串只能包含处理小时、分钟和秒的那些格式修饰符。
其他修饰符产生一个NULL值或0。
CURDATE()
 
CURRENT_DATE
以'YYYY-MM-DD'或YYYYMMDD格式返回今天日期值,取决于函数是在一个字符串还是数字上下文被使用。
mysql> select CURDATE();
-> '1997-12-15'
mysql> select CURDATE() + 0;
-> 19971215

CURTIME()
 
CURRENT_TIME
以'HH:MM:SS'或HHMMSS格式返回当前时间值,取决于函数是在一个字符串还是在数字的上下文被使用。
mysql> select CURTIME();
-> '23:50:26'
mysql> select CURTIME() + 0;
-> 235026

NOW()
 
SYSDATE()
 
CURRENT_TIMESTAMP
以'YYYY-MM-DD HH:MM:SS'或YYYYMMDDHHMMSS格式返回当前的日期和时间,取决于函数是在一个字符串还是在数字的
上下文被使用。
mysql> select NOW();
-> '1997-12-15 23:50:26'
mysql> select NOW() + 0;
-> 19971215235026

UNIX_TIMESTAMP()
 
UNIX_TIMESTAMP(date)
如果没有参数调用,返回一个Unix时间戳记(从'1970-01-01 00:00:00'GMT开始的秒数)。如果UNIX_TIMESTAMP()用一
个date参数被调用,它返回从'1970-01-01 00:00:00' GMT开始的秒数值。date可以是一个DATE字符串、一个DATETIME
字符串、一个TIMESTAMP或以YYMMDD或YYYYMMDD格式的本地时间的一个数字。
mysql> select UNIX_TIMESTAMP();
-> 882226357
mysql> select UNIX_TIMESTAMP('1997-10-04 22:23:00');
-> 875996580

当UNIX_TIMESTAMP被用于一个TIMESTAMP列,函数将直接接受值,没有隐含的“string-to-unix-timestamp”变换。

FROM_UNIXTIME(unix_timestamp)
以'YYYY-MM-DD HH:MM:SS'或YYYYMMDDHHMMSS格式返回unix_timestamp参数所表示的值,取决于函数是在一个字符串
还是或数字上下文中被使用。
mysql> select FROM_UNIXTIME(875996580);
-> '1997-10-04 22:23:00'
mysql> select FROM_UNIXTIME(875996580) + 0;
-> 19971004222300

FROM_UNIXTIME(unix_timestamp,format)
返回表示 Unix 时间标记的一个字符串,根据format字符串格式化。format可以包含与DATE_FORMAT()函数列出的条
目同样的修饰符。
mysql> select FROM_UNIXTIME(UNIX_TIMESTAMP(),
'%Y %D %M %h:%i:%s %x');
-> '1997 23rd December 03:43:30 x'

SEC_TO_TIME(seconds)
返回seconds参数,变换成小时、分钟和秒,值以'HH:MM:SS'或HHMMSS格式化,取决于函数是在一个字符串还是在数字
上下文中被使用。
mysql> select SEC_TO_TIME(2378);
-> '00:39:38'
mysql> select SEC_TO_TIME(2378) + 0;
-> 3938

TIME_TO_SEC(time)
返回time参数,转换成秒。
mysql> select TIME_TO_SEC('22:23:00');
-> 80580
mysql> select TIME_TO_SEC('00:39:38');
-> 2378

END

沉重的话题: 一个毕业后进微软的同志,上月死了,睡一觉就起不来了,医生说是猝死,
推测是过劳,只不过25岁的黄金年龄。


晚上9-11点为免疫系统(淋巴)排毒时间,此段时间应安静或听音乐
晚间11-凌晨1点,肝的排毒,需在熟睡中进行。
凌晨1-3点,胆的排毒,亦同。
凌晨3-5点,肺的排毒。此即为何咳嗽的人在这段时间咳得最剧烈,因排毒动作已走到肺;
不应用止咳药,以免抑制废积物的排除。
凌晨5-7点,大肠的排毒,应上厕所排便。
凌晨7-9点,小肠大量吸收营养的时段,应吃早餐。


疗病者最好早吃,在6点半前,养生者在7点半前,
不吃早餐者应改变习惯,即使拖到9、10点吃都比不吃好。
半夜至凌晨4点为脊椎造血时段,必须熟睡,不宜熬夜。
        经常听到很多女孩子有手提,不知道是听音乐感受不好还是听惯了,我觉得很差的音质,她们觉得很好听。可能是我觉得听不动吧,我建议用beoplayer:


丹麦的一家全球顶级数字产品设备提供商开发的媒体播放器,它美奂美仑并且独特高贵的产品设计理念,一直受到了很多地球人的追捧以及崇拜,并且号称在音质上是比foobar还好,感兴趣的朋友可以下载来玩玩


还有就是SRS:
(Sound Retrieval System)是由SRS研究所开发的、最具代表性的3D立体声技术。该技术的核心是可以利用2...是美国SRS实验室的最新音响科技专利,SRS的主功方向是双声道环绕,SRS( )是它的注册标志。 SRS技术的发明人是阿诺德


都有破解版本,个人觉得一般的声卡加上sony的耳塞或者好点的漫步者音响感觉很爽的。。。呵呵
费用项目
金额(元)
费用项目
金额(元)
费用项目
金额(元)
 
月租费

通话费
国内漫游基本费

 
 

 
15.00

 
增值服务费

数据业务费
MMS通信费

 
 

 
0.30

 
代收费

其它

优惠项目

 
 

 

 

费用合计146.67 
1.  设置CVS环境
  setenv CVSROOT :ext:你的CVS用户名@10.88.15.205:/cvsroot/mailrept

2.  从CVS中检出源代码,操作命令如下:

  针对RC1版本:
  cvs co -r RELENG_ENTPLATFORM_1_2_RC1 src/entplatform

  针对RC2版本:
  cvs co -r RELENG_ENTPLATFORM_1_2_RC2 src/entplatform

检出最新代码:
1步骤后:
运行:

cvs co src/entplatform src/entplatform


OK!
         归根揭底没有很好的用一些原则,加上方法。。。。贯切。。。
 图像:
   

   
 

病人:医生,我折腾了许久,无法理解函数指针。
中医:能意识到自己不理解,不错。那么你说说你目前的理解。函数指针是什么?
病人:函数指针是指向函数的指针。

中医:那么函数是什么?
病人:函数就是函数。
中医:不是指向函数的指针?
病人:自然不是。

中医:那函数怎么可以赋值给函数指针?难道int可以赋值给int* ?
病人:这个。。。。。。

中医:逻辑不通了吧?
病人:是啊,怎么回事哩?

中医:这个问题先搁置一下,我问你,什么是指针?
病人:是放地址的变量。
中医:函数指针里面放的什么?
病人:函数入口地址。
中医:那么函数指针就是放函数入口地址的变量?
病人:  (小心地)我同意。
中医:函数是放函数入口地址的常量。
病人:哇!这样一来就好解释了!函数赋值给函数指针就像把常量赋值给同类型变量!

中医:还有问题吗?
病人:有,"函数是放函数入口地址的常量。"这句话不通啊。
函数是放自己入口地址的东西?
中医:孺字可教。这里"函数入口地址"是一个词,不能拆。真正的函数,无非是一块代码,
C/C++中没有描述"一块代码"的东西,
只有描述"一块代码"的入口地址的东西,函数及函数指针。
病人:我懂了,"函数指针是指向函数(1)的指针"和"函数(2)不是指向函数(3)的指针"的矛盾,
出自"函数(1)"的是你刚才说的"真正的函数",
函数(2)(3)指的C/C++语法意义上的"函数",两码事!

中医:嗯,有道理。那么还有问题吗?    
病人:"函数指针是指向函数的指针。"这句话固然误导人,不过C/C++的语法,也起到了推波助澜的作用。

//////////////////////////////////
#include
typedef int (*FN_HAHA)();
int real_haha()
{
return printf("haha\n");
}

void main(int argc, char* argv[])
{
FN_HAHA haha=real_haha;
real_haha();
(*haha)();
}
//////////////////////////////////

既然  haha 和 real_haha是一个层次上的东西,
那么调用的时候为什么 一个 "real_haha();",
一个(*haha)()哩?很明显是在搞分化,搞脑子。

医生:连C/C++语法你都敢批评,强的!
   正如你所说,这不是好的语法,所以现在的编译器,比如VC和gcc,
   都允许用 haha();来代替传统的(*haha)();你44就知道了。
     至于书上都写(*haha)();我只能说,
      这个问题我自己也被书害了很久,最后扔了书自己想通的。
病人:我的病好了,我回去也把书扔了。
 如果你要选择成为有钱人,就要从观念、思维方式到行为方式,朝有钱人

靠近。经常与成功人士打打交道,领悟别人成功的经验和要点。要根据自己的资

源、优劣势等,找准自己在社会上的位置:适合做什么?由此选择行业、职业。

但无论如何创业精神是最主要的,即敢想、敢干、勤奋、吃苦耐劳,锐意进取,而不是安于现状,小富即安..


                 舍得付出,敢于拼搏,能勇往直前,遇到困难不妥协,认准目标,不言

放弃,同时注意节俭,不铺张浪费。反观那些每天工作八小时,有“打工心态”

的人,一辈子不会成为有钱人人,只能沦落为“穷人”。

                     要永远为自己工作,做自己的主人,要知道“天道酬勤”的道理。只有那

些敢于拼搏、锐意进取、思路清晰、舍得付出的人才会有丰厚的回报


 1、做你真正感兴趣的事——你会花很多时间在上面,因此你一定要感兴趣才行,如果不是这样的话,你不愿意把时间花在上面,就得不到成功。

   2、自己当老板。为别人打工,你绝不会变成巨富,老板一心一意地缩减开支,他的目标不是使他的职员变成有钱人。

   3、提供一种有实效的服务,或一种实际的产品。你要以写作、绘画或作曲变成百万富翁的机会可以说是无限小,而你要在营造业、房地产、制造业发大财的机会比较大。记住,出版商赚的钱比作家多得多。

   4、如果你坚持要用自己的灵感来创业?最好选择娱乐业,在这方面,发财的速度相当快,流行歌曲和电视最理想。

   5、不论你是演员或商人,尽量增加你的观众。在小咖啡馆唱歌的人,所赚的钱一定比不上替大唱片公司灌唱片的人,地方性的商人,不会比全国性的商人赚的钱多。

   6、找出一种需要,然后满足它。社会越变越复杂,人们所需要的产品和服务越来越多,最先发现这些需求而且满足他们的人,是改进现有产品和服务的人,也是最先成为富翁的人。

   7、不要不敢采用不同的方式——新的方法和新产品,会造成新的财富。但必须确定你的新方法比旧方法更理想,你的新方法必须增进产品外观、效率、品质、方便或者降低成本。

   8、如果你受过专业教育,或者有特殊才能,充分利用它。如果你烧得一手好菜,而却要去当泥水匠,那就太笨了。

   9、在你着手任何事情之前,仔细地对周围的情形研究一番。政府机关和公共图书馆,可以提供不少资料,先做研究,可以节省你不少时间和金钱。

   10、不要一直都想着发大财,不如你想想如何改进你的事业,您应该常常问自己的是:“我如何改良我的事业?”如何使事业进行顺利,财富就会跟着而来。

   11、可能的话,进行一种家庭事业,这种方法可以减少费用,增进士气,利润的分配很简单,利润能够得到充分的利用,整个事业控制也较容易。

   12、尽可能减少你的费用,但不能牺牲你的品质,否则的话,你等于是在慢性自杀,赚钱的机会不会大。

   13、跟同行的朋友维持友谊——他们可能对你很有帮助。

   14、把尽量多的时间花在事业上。一天12小时、一星期6天是最低要求,一天14小时到18小时很平常,一星期工作7天最好了。你必须先牺牲家庭和社会上的娱乐,直到你事业站稳为止。也只有到那时候,你才能把责任分给别人。

   15、不要不敢自己下决心。听听别人的赞美和批评,但你自己要下决心。

   16、不要不敢说实话。拐弯抹角,只会浪费时间,心里想什么就说什么,而且要尽可能地直截了当地、明确地说出来。

   17、不要不敢承认自己的错误。犯了错误并不是一种罪行,犯错不改才是罪过。

   18、不要因为失败就裹足不前。失败是难免的,也是有价值的,从失败中,你会学到正确的方法论。

   19、不要在不可行的观念上打转。一发现某种方法行不通,立即把它放弃。世界上有无数的方法,把时间浪费在那些不可行的方法上是无可弥补的损失。

   20、不要冒你承担不起的风险。如果你损失10万元,若损失得起的话,就可以继续下去,但如果你赔不起5万元,而一旦失败的话,你就完蛋了。

   21、一再投资,不要让你的利润空闲着,你的利润要继续投资下去,最好投资别的事业或你控制的事业上,那样,才能钱滚钱,替你增加好几倍的财富。

   22、请一位高明的律师——他会替你节约更多的金钱和时间,比起你所给予的将要多的多。

   23、请一位精明的会计师。最初的时候,你自己记账,但除非你本身是个会计师,你还是请一位精明的会计师,可能决定你的成功和失败——他是值得你花钱的。

   24、请专家替你报税。一位机灵的税务专家,可又替你免很多的税。

   25、好好维持你的健康和你的平静心灵——否则的话,拥有再多的钱也没有什么意思。
echo 'alias vi /usr/local/bin/vim' > ~/.cshrc
or
echo 'alias vi=/usr/local/bin/vim' > ~/.bashrc
代码:
注意函数原型及其返回数值:

char* get_Cookie(const char* name)
{
       char* cookie=0;
       char* p=0;
       int   len=0;
       p = getenv("HTTP_COOKIE") ;

       if(!p)
       {
    return 0;
       }

       len = strlen(name);
       cookie = (char*)malloc(len+2) ;
       sprintf(cookie,"%s=",name);
       len++;

       if (p = strstr(p,cookie))
       {
               p=p+len ;
               char* p2;
               int     len2=0;
               if(p2=strstr(p,";"))len2=p2-p;
               else len2=strlen(p);
               if(len2>len) {
                       free(cookie);
                       cookie=(char*)malloc(len2+1);
               }
               memcpy(cookie,p,len2);
               *(cookie+len2)=0;
       }
       else
       {
               free(cookie);
               cookie=0;
       }

       return cookie;
}

返回的是char* 指针:

我们main函数:

#include <iostream>
int main(){
       printf( "Set-Cookie: curentouturl=kkk...; path=/\n");
       printf("Content-type:text/html\n\n");
       //out_url.Format("%s", get_Cookie("curentouturl"));
       char *tmp;
       tmp =(char*)malloc(1024);
       printf("%s",get_Cookie(tmp));



return 0;

}





海阔天空

银色经典 jackx 2007-11-27 12:47
Windows Media Player文件

我曾怀疑我 走在沙漠中
从不结果 无论种什么梦
才张开翅膀 风却便沉默
习惯伤痛能不能 算收获
庆幸的是我 一直没回头
终于发现 真的是有绿洲
每把汗流了 生命变的厚重
走出沮丧才看见 新宇宙
海阔天空 在勇敢以后
要拿执着 将命运的锁打破
冷漠的人
谢谢你们曾经看轻我
让我不低头 更精采的活

凌晨的窗口 失眠整夜以后
看着黎明 从云里抬起了头
日落是沉潜 日出是成熟
只要是光一定会 灿烂的
海阔天空 在勇敢以后
要拿执着 将命运的锁打破
冷漠的人
谢谢你们曾经看轻我
让我不低头 更精采的活

海阔天空 狂风暴雨以后
转过头 对旧心酸一笑而过
最懂我的人
谢谢一路默默的陪着我
让我拥有好故事可以说
看未来 一步步来了

   每个人都不是孤立存在的,所有的人都有或多或少的关系,这些关系交织在一起,形成一张很大的关系网,整个社会就是这样的一个网络。对你来说,这张网以你为中心,伸展到所有你曾接触过的人,和所有你可能去的地方。

   可以说,这张网是你自己亲手织就的,每一个你所结交的新朋友,每一次和朋友的相聚,都是在编 织与他人或疏或密的情感纽带,都是在扩展这张网。它在一定程度上决定了你未来的道路是平坦还是曲折,是有所谓的“贵人相助”,还是要自己苦苦奋斗。也许在平日的行动中,很难感觉到这张网的存在,但是每到关键时刻,它总会不失时机地显示自己的力量,或者令你大功告成,或者令你壮志难酬。


你想回顾过去在人际关系方面的得失吗?你了解自己编成的关系网对你是有利还是妨碍吗?下面的题会帮你测试一下。

   请选择最适合自己情形的答案。

   1、你出门旅行时, A、通常很容易就交到朋友;B、喜欢一个人消磨时间;C、希望结交朋友,但难以做到。

   2、你与朋友的友谊能保持多久?

   A、大多是日久天长式;

   B、有长有短,志趣相投者通常较长久;C、弃旧交新是常有的事。

   3、你的朋友,首先应具备哪种品质?

   A、能使人快乐轻松;

   B、诚实可靠、值得信赖;

   C、对我有兴趣、关注我。

   4、与朋友们相处,你通常的情形是

   A、倾向于赞扬他们的优点;

   B、以诚为原则,有错我就指出来;

   C、我的信条是不胡乱吹捧,也不苛刻指责。

   5、走入一个陌生的环境,对那些陌生人,你A、常能很快记住他们的名字与某些特点;B、想记住这些信息,但失败时居多C、不去注意这些东西。

   6、对人来说,结交人的主要目的是

   A、使自己愉快;

   B、希望被人喜欢;

   C、想让他们帮我解决问题。

   7、结交一位朋友你通常是

   A、由熟人朋友的介绍开始;

   B、通过各种场合的接触;

   C、经过时间、困难的考验而交定。

   计分表 1、A1、B3、C5;2、A1、B3、C5;3、A1、B3、C5;4、A1、B5、C3; 5、A1、B3、C5;6、A1、B3、C5;7、A5、B1、C3。

   将各题的得分加在一起为总分。?

   7-16为A类,17-26为B类,27-35为C类。

   A类:结网能手。你凡事处理得当,合情合理,很有艺术。无论你走到哪里,笑脸和友谊总是围绕着你,你很受朋友的欢迎,他们也愿意帮助你,别人都认为你是很有办
今天的优秀组织已经不再是等级森严、分工明确、秩序井然,一种可变的、有机的和充满活力的架构正在渐成气候。这种新的架构能够快速响应组织不断变化的需求,成功编织他们的关系网络。在打造关系网的过程中,已经认识的人很重要,他们都有自己的熟人,而他们所熟识的人又有自己的熟人。

  成功建立关系网的关键是和适当的人建立稳固的关系。良好的人际关系能拓宽你生活视野,让你了解周围所发生的一切,并提高你倾听和交流的能力。

  强力10人内部圈

  当你意识到职业关系的重要性,并开始选择可以助你一臂之力的人时,你可能不得不卸掉一些关系网中的额外包袱,其中或许包括那些相识已久但对你的职业生涯无所裨益的人。维持对你益处不大的老关系只会意味着时间的浪费。

  良好、稳固、有力的人际关系的核心必须由10个左右你能靠得住的人组成。这首选的10个人可以包括你的朋友、家庭成员和那些在你职业生涯中彼此联系紧密的人,他们构成你的影响力内部圈,因为他们能让你发挥所长,而且彼此都希望对方成功。

  当双方建立了稳固关系时,彼此会激发出强大能量。他们会激发对方的创造力,使彼此的灵感达到至美境界。为什么将你的影响力内部圈人数限定为10个人呢?因为强有力的关系需要你一个月至少维护1次,所以10个人或许已经用尽你所有的时间。

  另外,应该至少挑选15个人作为你“强力10人内部圈”的后备力量,并经常与他们保持联系。如果你的一位主要关系退休或移民国外,最好的替补就是你的后备军。只要你能每月定期和他们联系,无论是通过电话、传真、聚会、电子邮件或信件,这个团体的人数都可以超过15人。 最初接触的15秒   
  在试图与你建立关系时,人们总会问你是做什么的,如果回答平淡如水,比如只是一句“我是一名经理”,你就失去了一个与对方交流的机会。比较得体的回答是:“我在某某公司负责一个小组的管理工作,主要为我们的管理软件开发监视软件。我也喜欢骑马,常常打网球,也热爱读书。”在不到15秒的时间里,你不仅使你的回答增添了色彩,也为对方提供了几个话题,说不定其中就有让对方感兴趣的。当他这样回答:“哦,你打网球?我也喜欢”时,你们就开始打造关系了。

  建造关系网络必须遵守的规则,不是“别人能为我做什么?”,而是“我能为别人做什么?”在回答别人的问题时,不妨再接着问一下,“我能为你做些什么?” 保持联络   保持联络是成功建立关系网络的另一关键。《纽约时报》记者问美国前总统克林顿是如何保持自己的政治关系网的,克林顿回答:“每天晚上睡觉前,我会在一张卡片上列出我当天联系过的每一个人,注明重要细节、时间、会晤地点和其他一些相关信息,然后添加到秘书为我建立的关系网数据库中。这些年来朋友们帮了我不少。”

  要与关系网络中的每个人保持积极联系,惟一的方式就是创造性地运用你的日程表。记下那些对你的关系特别重要的日子,比如生日或周年庆祝等。打电话给他们,至少给他们寄张贺卡让他们知道你心中想着他们。

  观察他们在组织中的变化也同样重要。当你的关系网成员升职或调到新的组织去时,要及时祝贺他们。同时,也让他们知道你个人的情况。去度假之前,打电话问问他们有什么需要。当他们落入低谷时,打电话给他们鼓劲。不论你关系网中谁遇到麻烦时,立即与他通话,并主动提供帮助,这是表现支持的最好方式。

  珍惜商务旅行的机会。如果你旅行的地点正好邻近你的某位关系成员,不要忘记提议和他共进午餐或晚餐。

  3个月调整一次

  至少每三个月变动一下你的关系网。要多提类似“为什么要保留这个关系?”的问题。如果你不定期更新或增加新人,你的关系网络就会陈旧。

  为你的关系网络和组织提供信息。时刻关注对网络成员有用的信息,应定期将你收到的信息与他们分享。优秀的关系网络是双向的,如果你仅仅是个接受者,无论什么网络都会疏远你。搭建关系网络时,要做得好像你的职业生涯和个人生活都离不开它似的,其实,事实上也的确如此
介绍
  当你进入 UNIX 的神秘世界后,立刻会发现越来越多的东西难以理解。对于大多数人来说,BSD socket 的概念就是其中一个。这是一个很短的教程来解释他们是什么、他们如何工作并给出一些简单的代码来解释如何使用他们。

类比 (什么是 socket ?)
  socket 是进行程序间通讯(IPC)的 BSD 方法。这意味着 socket 用来让一个进程和其他的进程互通信息,就象我们用电话来和其他的人交流一样。

用电话来比喻是很恰当的,我们在后面将一直用电话这个概念来描叙 socket 。

装上你的新电话(怎样侦听?)
  一个人要能够收到别人打给他的电话,首先他要装上一门电话。同样,你必须先建立 socket 以侦听线路。这个过程包含几个步骤。首先,你要建立一个新的 socket,就象先装上电话一样。socket() 命令就完成这个工作。

因为 sockets 有几种类型,你要注明你要建立什么类型的。你要做一个选择是 socket 的地址格式。如同电话有音频和脉冲两种形式一样,socket 有两个最重要的选项是 AF_UNIX 和 IAF_INET。AF_UNIX 就象 UNIX 路径名一样识别 sockets。这种形式对于在同一台机器上的 IPC 很有用。而 AF_INET 使用象 192.9.200.10 这样被点号隔开的四个十进制数字的地址格式。除了机器地址以外,还可以利用端口号来允许每台机器上的多个 AF_INET socket。我们这里将着重于 AF_INET 方式,因为他很有用并广泛使用。

另外一个你必须提供的参数是 socket 的类型。两个重要的类型是 SOCK_STREAM 和 SOCK_DGRAM。 SOCK_STREAM 表明数据象字符流一样通过 socket 。而 SOCK_DGRAM 则表明数据将是数据报(datagrams)的形式。我们将讲解 SOCK_STREAM sockets,他很常见并易于使用。

在建立 socket 后,我们就要提供 socket 侦听的地址了。就象你还要个电话号码来接电话一样。bind() 函数来处理这件事情。

SOCK_STREAM sockets 让连接请求形成一个队列。如果你忙于处理一个连接,别的连接请求将一直等待到该连接处理完毕。listen() 函数用来设置最大不被拒绝的请求数(一般为5个)。一般最好不要使用 listen() 函数。

下面的代码说明如何利用 socket()、 bind() 和 listen() 函数建立连接并可以接受数据。


  /* code to establish a socket; originally from bzs@bu-cs.bu.edu
   */

int establish(unsigned short portnum)
  { char myname[MAXHOSTNAME+1];
   int s;
   struct sockaddr_in sa;
   struct hostent *hp;

memset(&sa, 0, sizeof(struct sockaddr_in)); /* clear our address */
   gethostname(myname, MAXHOSTNAME); /* who are we? */
   hp= gethostbyname(myname); /* get our address info */
   if (hp == NULL) /* we don\t exist !? */
   return(-1);
   sa.sin_family= hp->h_addrtype; /* this is our host address */
   sa.sin_port= htons(portnum); /* this is our port number */
   if ((s= socket(AF_INET, SOCK_STREAM, 0)) /* obligatory includes */
  #include
  #include
  #include
  #include
  #include
  #include
  #include
  #include

#define PORTNUM 50000 /* random port number, we need something */

void fireman(void);
  void do_something(int);

main()
  { int s, t;

if ((s= establish(PORTNUM)) 0)
   ;
  }

/* this is the function that plays with the socket. it will be called
   * after getting a connection.
   */
  void do_something(int s)
  {
   /* do your thing with the socket here
   :
   :
   */
  }

拨号 (如何调用 socket)
  现在你应该知道如何建立 socket 来接受调用了。那么如何调用呢?和电话一样,你要先有个电话。用 socket() 函数来完成这件事情,就象建立侦听的 socket 一样。

在给 socket 地址后,你可以用 connect() 函数来连接侦听的 socket 了。下面是一段代码。


  int call_socket(char *hostname, unsigned short portnum)
  { struct sockaddr_in sa;
   struct hostent *hp;
   int a, s;

if ((hp= gethostbyname(hostname)) == NULL) { /* do we know the host\s */
   errno= ECONNREFUSED; /* address? */
   return(-1); /* no */
   }

memset(&sa,0,sizeof(sa));
   memcpy((char *)&sa.sin_addr,hp->h_addr,hp->h_length); /* set address */
   sa.sin_family= hp->h_addrtype;
   sa.sin_port= htons((u_short)portnum);

if ((s= socket(hp->h_addrtype,SOCK_STREAM,0)) 0) {
   bcount += br; /* increment byte counter */
   buf += br; /* move buffer ptr for next read */
   }
   else if (br < 0) /* signal an error to the caller */
   return(-1);
   }
   return(bcount);
  }

相同的函数也可以写数据,留给我们的读者吧。

挂起(结束)
  和你通过电话和某人交谈后一样,你要在 socket 间关闭连接。一般 close() 函数用来关闭每边的 socket 连接。如果一边的已经关闭,而另外一边却在向他写数据,则返回一个错误代码。

世界语(交流的语言很重要)
  现在你可以在机器间联络了,可是要小心你所说的话。许多机器有自己的方言,如 ASCII 和 EBCDIC。更常见的问题是字节顺序问题。除非你一直传输的都是文本,否则你一定要注意这个问题。幸运的是,人们找出了解决的办法。

在很久以前,人们争论哪种顺序更“正确”。现在必要时有相应的函数来转换。其中有 htons()、ntohs()、htonl() 和 ntohl()。在传输一个整型数据前,先转换一下。


  i= htonl(i);
  write_data(s, &i, sizeof(i));

在读数据后,再变回来。


  read_data(s, &i, sizeof(i));
  i= ntohl(i);

如果你一直坚持这个习惯,你将比别人少出错的机会。

未来在你的掌握了(下一步?)
  就用我们刚才讨论的东西,你就可以写自己的通讯程序了。和对待所有的新生事物一样, 最好还是看看别人已经做了些什么。这里有许多关于 BSD socket 的东西可以参考。

请注意,例子中没有错误检查,这在“真实”的程序中是很重要的。你应该对此充分重视。
在Linux下写了个小的socket程序,分为客户端和服务器端,服务端开一个端口(2000),做为一个daemon,等待客户的连接请求.一旦有客户连接,服务器端打印出客户端的IP地址和端口,并且向服务器端发送欢迎信息和时间.下面是服务端的代码(tcpserver.c).由于这只是个简单的程序,所以只用了单线程实现!

/**

* Tcp Server program, It is a simple example only.

* zhengsh 200520602061 2

* when client connect to server, send a welcome message and timestamp in server.

*/



#include <stdio.h>

#include <sys/socket.h>

#include <unistd.h>

#include <sys/types.h>

#include <netinet/in.h>

#include <stdlib.h>

#include <time.h>



#define SERVER_PORT 20000 // define the defualt connect port id

#define LENGTH_OF_LISTEN_QUEUE 10 //length of listen queue in server

#define BUFFER_SIZE 255

#define WELCOME_MESSAGE "welcome to connect the server. "





int main(int argc, char **argv)

{

      int servfd,clifd;

      struct sockaddr_in servaddr,cliaddr;



      if ((servfd = socket(AF_INET,SOCK_STREAM,0)) < 0)

      {

             printf("create socket error!\n");

             exit(1);

      }

      bzero(&servaddr,sizeof(servaddr));

      servaddr.sin_family = AF_INET;

      servaddr.sin_port = htons(SERVER_PORT);

      servaddr.sin_addr.s_addr = htons(INADDR_ANY);



      if (bind(servfd,(struct sockaddr*)&servaddr,sizeof(servaddr))<0)

      {

             printf("bind to port %d failure!\n",SERVER_PORT);

             exit(1);

      }



      if (listen(servfd,LENGTH_OF_LISTEN_QUEUE) < 0)

      {

             printf("call listen failure!\n");

             exit(1);

      }



      while (1)

      {//server loop will nerver exit unless any body kill the process

             char buf[BUFFER_SIZE];

             long timestamp;

             socklen_t length = sizeof(cliaddr);

             clifd = accept(servfd,(struct sockaddr*)&cliaddr,&length);

             if (clifd < 0)

             {

                    printf("error comes when call accept!\n");

                    break;

             }

             strcpy(buf,WELCOME_MESSAGE);

             //inet_ntop(INET_ADDRSTRLEN,cliaddr.sin_addr,buf,BUFFER_SIZE);

             

             printf("from client,IP:%s,Port:%d\n",inet_ntoa(cliaddr.sin_addr),ntohs(cliaddr.sin_port));

             timestamp = time(NULL);

             strcat(buf,"timestamp in server:");

             strcat(buf,ctime(&timestamp));

             send(clifd,buf,BUFFER_SIZE,0);

             close(clifd);          

             

      }//exit

      close(servfd);

      return 0;

}



客户每次用一个随机的端口连接服务器,并接收来自服务器的欢迎信息

,然后打印出来(tcpclient).运行的时候接受一个参数,也就是服务器的ip地址.


/* Tcp client program, It is a simple example only.

* zhengsh 200520602061 2

* connect to server, and echo a message from server.

*/





#include <stdio.h>

#include <sys/socket.h>

#include <unistd.h>

#include <sys/types.h>

#include <netinet/in.h>

#include <stdlib.h>



#define SERVER_PORT 20000 // define the defualt connect port id

#define CLIENT_PORT ((20001+rand())%65536) // define the defualt client port as a random port



#define BUFFER_SIZE 255

#define REUQEST_MESSAGE "welcome to connect the server.\n"



void usage(char *name)

{

      printf("usage: %s IpAddr\n",name);

}



int main(int argc, char **argv)

{    

      int servfd,clifd,length = 0;

      struct sockaddr_in servaddr,cliaddr;

      socklen_t socklen = sizeof(servaddr);

      char buf[BUFFER_SIZE];

     

      if (argc < 2)

      {

             usage(argv[0]);

             exit(1);

      }

     

      if ((clifd = socket(AF_INET,SOCK_STREAM,0)) < 0)

      {

             printf("create socket error!\n");

             exit(1);

      }

      srand(time(NULL));//initialize random generator

      bzero(&cliaddr,sizeof(cliaddr));

      cliaddr.sin_family = AF_INET;

      cliaddr.sin_port = htons(CLIENT_PORT);

      cliaddr.sin_addr.s_addr = htons(INADDR_ANY);



      bzero(&servaddr,sizeof(servaddr));

      servaddr.sin_family = AF_INET;

      inet_aton(argv[1],&servaddr.sin_addr);

      servaddr.sin_port = htons(SERVER_PORT);

      //servaddr.sin_addr.s_addr = htons(INADDR_ANY);



      if (bind(clifd,(struct sockaddr*)&cliaddr,sizeof(cliaddr))<0)

      {

             printf("bind to port %d failure!\n",CLIENT_PORT);

             exit(1);

      }



      if (connect(clifd,(struct sockaddr*)&servaddr, socklen) < 0)

      {

             printf("can't connect to %s!\n",argv[1]);

             exit(1);

      }

     

      length = recv(clifd,buf,BUFFER_SIZE,0);

      if (length < 0)

      {

             printf("error comes when recieve data from server %s!",argv[1]);

             exit(1);

      }

      printf("from server %s :\n\t%s ",argv[1],buf);



      close(clifd);

      return 0;

}


程序在Fedora core 4下通过编译,有几个warining.但是不影响.
下面我们先编写一个非常简单的套接口客户端程序client,这个程序较为简单,它演示了一个无名的套接口连接,
以及如何与一个服务器套接口连接,假设服务器套接口的名字是色server_socket.
/*
client.c
*/
#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <sys/un.h>
#include <unistd.h>
int main()
{
int sockfd;
int len;
struct sockaddr_un address;
int result;
char ch=A;   //A好像有问题,改为ch了。。。编译通过。
sockfd=socket(AF_UNIX,SOCK_STREAM,0);
/*以上建立客户端的套接口,采用AF_UNIX的unix域协议*/
address.sun_family=AF_UNIX;
strcpy(address.sun_path,"server_socket");
len=sizeof(address);
/*以上创建服务器套接口的地址,其中包括套接口类型,名称*/
result=connect(sockfd,(struct sockaddr *)&address,len);

if(result==-1){
perror("oops:client1");
exit(1);

}
/*以上我们试图与服务器套接口建立连接*/
write(sockfd,&ch,1);
read(sockfd,&ch,1);
/*如果成功,将向服务器端发送一个字符,然后读取服务器的回答*/

printf("char from server=%c\n",ch);
close(sockfd);
exit(0);
}

/*
server.c
*/
#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <sys/un.h>
#include <unistd.h>
int main()
{
int server_sockfd,client_sockfd;
int server_len,client_len;
struct sockaddr_un server_address;
struct sockaddr_un client_address;
unlink("server_socket");
/*如果存在同名的套接口,则先删除*/
server_sockfd=socket(AF_UNIX,SOCK_STREAM,0);
/*以上建立套接口,这时候无名*/
server_address.sun_family=AF_UNIX;
strcpy(server_address.sun_path,"server_socket");
server_len=sizeof(server_address);
bind(server_sockfd,(struct sockaddr *)&server_address,server_len);

listen(server_sockfd,5);
/*以上创建监听队列.等待用户的连接请求*/
while(1)
{
char ch;
printf("server waiting\n");
client_sockfd=accept(server_sockfd,(struct sockaddr *)&client_address,&client_len);
/*以上接受一个客户的请求*/
read(client_sockfd,&ch,1);
/*因为连接一旦建立,客户就会先发消息过来,所以服务器先读*/
ch++;
write(client_sockfd,&ch,1);
/*把读取的字符串做简单处理,回送*/
close(client_sockfd);
}
}

分页: 297/339 第一页 上页 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 下页 最后页 [ 显示模式: 摘要 | 列表 ]