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就包含了这个目录,导致编译出错。
解决办法很简单,就是把工作目录下的系统头文件删掉就可以了。