2014年1月24日星期五

strstk_r 分隔符之坑

今天发现一个问题,用strstk_r来分割字符串,发现结果不是想象的那样。原因是分割符参数是多个字符,而strstk_r是把分割符看成一个集合,只要匹配集合里面的任何一个元素就会进行分割。用了才知道坑啊。

socket编程手记

1.同一socket连着两次connect会发生什么?
  第一次connect成功后,第二次connect会提示 EISCONN,/* Transport endpoint is already connected */,即该socket已经连接上了。

2.客户端connect成功后退出,server端收到什么
  客户端connect成功后退出,发送一个fin到server端,server端调用recv返回空数据
  linux 手册里面的:If no messages are available to be received and the peer has performed an orderly shutdown,recv() shall return 0
    客户端退出后,往server端发送了一个fin:
14:07:10.118038 IP client.49032 > server.30010: F 1:1(0) ack 1 win 64 <nop,nop,timestamp 1558633984 1558633984>
14:07:10.119100 IP server 30010 > client 49032: . ack 2 win 64 <nop,nop,timestamp 1558633985 1558633984>
   这时tcp连接处于半关闭状态.协议栈还是等待server端发出关闭信息。

   server端退出后(或者主动close),tcpdump可以看到server端的确认关闭的信息:
14:21:20.802625 IP server.30010 >client.49032: F 1:1(0) ack 2 win 64 <nop,nop,timestamp 1558846656 1558633984>
14:21:20.802628 IP client.49032 > server.30010: R 1502573033:1502573033(0) win 0

3.listen socket设置成为非阻塞,accept后的connected socket还是非阻塞吗
  int s1 = socket();s1设置成为非阻塞,在s1上面listen,有连接建立后,accept后得到的是一个新的socket(s2),这个socket默认是阻塞的。所以accept后,在s2上面recv数据是阻塞的。

2014年1月21日星期二

开发日记

这篇主要记录工作中碰到的一些问题,特别是奇怪的问题。

1.‘ucontext_t’ was not declared in this scope
先说一下开发环境:通过samba使用远程机器进行开发,代码都放在远程目录下面,然后用sourceinsight写代码。
这个问题真是神奇,原来编译得好好的代码,突然就编译不过,然后提示如上。然后我加上 #include <sys/ucontext.h> ,不行,换成#include <ucontext.h> 还是不行。然后仔细的想今天做过什么改动,终于想起来了,因为在sourceinsight里面没有include 系统头文件,所以我就拷贝一份系统头文件到工作目录,结果makefile就包含了这个目录,导致编译出错。
解决办法很简单,就是把工作目录下的系统头文件删掉就可以了。

2012年11月5日星期一

php 的system和exec

最近写的一个脚本,是fork了一个子进程来调用的,内容很简单,就是通过system调用一个exp脚本,exp脚本执行scp命令来拷贝文件。然后百思不得其解的是system调用后没有返回,在system后面的log没有,而且system直接导致我的子进程退出了。然后在开发环境模拟这个问题,死都模拟不出来。但是在线上环境就是必现,搞得我郁闷啊。而且同事用system命令就没问题。
后来偶然就把system改成了exec,没想到就ok了,可以返回了,这简直搞不懂啊。
php的手册里面也只是说明了一些用法上的不同,并没有具体说明深入的区别,这坑爹呢。感觉php做后台的程序还是有些不爽的地方,就像regtickfunctions那个函数一样。

2012年8月25日星期六

php安装pcntl

一直以为是要象安装libevent库一样来安装pcntl,但是今天在虚拟机上php -m一看,pcntl已经安装了,估计是apt-get install php5-dev的时候就安装了。这下省事了。
其实pcntl是php的标准库,在php的源代码里面编译来安装的。而libevent是要在pecl的网站下源码编译安装的。

2012年8月24日星期五

PHP安装libevent扩展库

今天一直在看php如何使用epoll模型进行编程。因为之前是用select模型来写得服务器程序,虽然功能无碍,但是第一个版本总是不会让我满意,所以想趁着这段时间比较空闲,把服务器程序用epoll模型重新写一遍。在这之前首先要把libevent的库安装了。

  1. php的libevent扩展库依赖于原始的libevent库,必须先把libevent库安装了。先用 ls -al /usr/lib | grep libevent 或者  ls -al /usr/local/lib | grep libevent来看看linux是否已经安装了libevent库,发现没有安装。然后就去下载了libevent 2.0版本的源码,解压,进入目录,./configure,make,make install 安装完毕,用ls -al 命令查看发现安装成功。但是是安装到/usr/local/lib目录下面的,所以要用  ln -s /usr/local/lib/libevent-2.0.so /usr/lib/libevent-2.0.so
  2. http://pecl.php.net/网站把libevnt的扩展包下下来,然后解压缩,进入目录,执行phpize来生成configure文件,./configure,make,make install,安装完成。安装完成后还要在php.ini里面把 extension=libevent.so 这句话加上。结果我发现我有两个php.ini文件,一个是/etc/php5/cli/php.ini,另外一个是/etc/php5/apache2/php.ini文件,不知道写在哪个文件,我就把两个文件都加了那句话。加完还要重启一下apache才行,这点pecl网站都没写。重启的命令:/etc/init.d/apache2 restart。
    后来试了一下,貌似要加到cli目录下的php.ini文件里面才行。
  3. 验证安装:php -m查看库,可以看到libevent。


2012年8月21日星期二

简单的启动和关闭虚拟机的bat文件

为了不要每次在cmd里面输入命令,写了两个简单的bat文件来启动和关闭虚拟机。
1.启动虚拟机(startvm.bat):

@echo off
cd "c:\Program Files\Oracle\VirtualBox"
VBoxManage.exe startvm ubuntu --type headless
exit

2.关闭虚拟机(closevm.bat)

@echo off
cd "c:\Program Files\Oracle\VirtualBox"
VBoxManage.exe controlvm ubuntu poweroff
exit

机器加了2g的内存后现在是4g内存了,当然在32位系统里面只用了3g多。不过一开虚拟机后内存占用居然还是飙到了2.3个G,汗啊。不过在我的ssd加4g内存的条件下,虚拟机速度还是不错的,比以前hdd加2g内存好多了。