Read the b.o.t.N.A.T's sourcecode---1---b.o.t.s.e.r.v.c

下文将记录本文阅读此代码中遇到的名词解释和问题总结,其中会有对多篇他人文章的引用,致谢先。

====================================================================================

1 fork()

父进程创建一个子进程,调用fork()后就返回了,此进程继续执行;而新建的进程会copy父进程的上下文,然后继续执行。(两者之后独立)

http://blog.csdn.net/jason314/archive/2010/06/01/5640969.aspx

 

2 ssize_t

http://blog.csdn.net/winer632/archive/2009/01/08/3734503.aspx

http://hi.baidu.com/xiexin/blog/item/6df1d7ca9c590e46f21fe7f1.html

 

3 fd_set

http://blog.csdn.net/beyondjjw/archive/2007/09/06/1774873.aspx

使用select函数的过程一般是:先调用宏FD_ZERO将指定的fd_set清零,然后调用宏FD_SET将需要测试的fd加入fd_set,接着调用函数select测试fd_set中的所有fd,最后用宏FD_ISSET检查某个fd在函数select调用后,相应位是否仍然为1。 

以下是一个测试单个文件描述字可读性的例子:

     int isready(int fd)

     {

         int rc;

         fd_set fds;

         struct tim tv;    

         FD_ZERO(&fds);

         FD_SET(fd,&fds);

         tv.tv_sec = tv.tv_usec = 0;    

         rc = select(fd+1, &fds, NULL, NULL, &tv);

         if (rc < 0)   //error

         return -1;    

         return FD_ISSET(fd,&fds) ? 1 : 0;

     }

 

 

 

4 socket编程

TCP:

服务端:socket->bind->listen->accept->recv

客户端:socket->connect->send

UDP: recvfrom, sendto , 没有bind,listen

http://blog.163.com/a3563@126/blog/static/54675706200872723659838/

http://blog.csdn.net/sws9999/archive/2010/03/08/5355528.aspx

 

5  文件描述符

http://blog.csdn.net/seraphsky/archive/2007/10/30/1856191.aspx

值:

http://baike.baidu.com/view/1303430.htm

 

6 va_list va_start  va_end 宏

【1当无法列出传递函数的所有实参的类型和数目时,可用省略号指定参数表

void foo(...);
void foo(parm_list,...);2:函数参数的传递原理:函数参数是以数据结构:栈的形式存取,从右至左入栈. 3获取省略号指定的参数:在函数体中声明一个va_list,然后用va_start函数来获取参数列表中的参数,使用完毕后调用va_end()结束。4  va_start使argp指向第一个可选参数。va_arg返回参数列表中的当前参数并使argp指向参数列表中的下一个参数。va_end把argp指针清为NULL。函数体内可以多次遍历这些参数,但是都必须以va_start开始,并以va_end结尾。】

http://blog.csdn.net/ast_224/archive/2009/02/18/3906167.aspx

http://blog.csdn.net/zxianrong/archive/2009/01/04/3706405.aspx

 

http://www.lupaworld.com/thread-29876-1-1.html

 

用gcc编译c程序的时候 经常会出现
implicit declaration of function '...' 的warning

偶经过这几天的经验,发现主要有2种情况会产生这种warning

7.1  没有把函数所在的c文件生成.o目标文件
7.2  在函数所在的c文件中定义了,但是没有在与之相关联的.h文件中声明

 

8 把源文件放入eclipse-cdt中分开编译运行,服务端:运行configure(自定义)ok,客户端报错:undefined reference to 'pthread_create'

解决:

http://blog.csdn.net/llqkk/archive/2008/08/31/2854558.aspx

问题原因:
    pthread 库不是 Linux 系统默认的库,连接时需要使用静态库 libpthread.a,所以在使用pthread_create()创建线程,以及调用 pthread_atfork()函数建立fork处理程序时,需要链接该库。

问题解决:
    在编译中要加 -lpthread参数
    gcc thread.c -o thread -lpthread
    thread.c为你些的源文件,不要忘了加上头文件#include<pthread.h>

如果是在eclipse中build,也可为eclipse配置参数:

http://blog.tianya.cn/blogger/post_read.asp?BlogID=797111&PostID=23966420

http://www.linuxdiyf.com/bbs/thread-83304-1-1.html

(可悲的是,我使用以上方法都没有获得成功,只要采用9中的方法,让eclipse来运行我自己的makefile,在其中我自己加上了-pthread参数)

 

9 eclipse编译 原有eclipse的方法:

New ->
C++ Project  -> next
输入 Project name,你也可以指定在其它位置。 选择 Makefile project, Ohter toolchain,然后Next,next完成,如果有makefile文件,则会自动使用make all来build.
(自己定义make命令:Project ->Properties ->C/C++ Build  ->右边 Use default build command)

http://hi.baidu.com/yuan07804017/blog/item/f3b2a21cd8b8fac6a68669e4.html

通过以上调整,终于在eclipse中将客户端生成成功(服务端不存在pthread问题,因此没经过波折就ok了),

 

10  同时通过run as configuration启动Botserv和bot,两者链接成功,但是报错说无法打开/db/user,明天再调试。(但是直接shell下运行倒是美文题,eclipse的打开文件权限问题?)

 

11 后来发现botserv中的很多函数都是暂时没有使用的,如与用户相关的函数等,而且这些函数在bot客户端函数中也有一模一样的存在。botserver的大概了解就到这里。

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值