server/client示例日记

来源:互联网 发布:微云同步盘for mac 编辑:程序博客网 时间:2024/06/05 18:37

涉及:网络编程基本通信(socket、setsockopt使用)、异步通信机制(epoll使用)、C/C++库函数(scanf & strcmp & memset & sprintf & fflush)、多线程(pthreadpthread_attr_setdetachstate使用)、加锁(mutex)、线程同步机制(barrier齐跑、pthread_join)、多进程(fork)、父子进程通信机制(kill信号、wait)

server端命令:g++ server.cpp -o server -lpthread

client端命令:g++ client.cpp -o client

2014.4.24:

最简单的一个例子:server先listen...,然后client发起一次连接请求,server接受,之后两者建立连接。然后client向server发送数据,server接收数据并打印出来。然后client结束,server结束。

2014.4.29:

改进:

client端:发送的消息由自己手动输入,可以一直发送消息,直到输入“quit”,此时client结束,断开连接;server端:添加epoll,一直在监听listen_fd端口,如果该端口来了connect请求,就将新增的accept_fd添加到epoll;如果是accept_fd来了数据,就将accept_fd从epoll删除,然后读取数据并打印出来。

tips:

epoll的ET模式只允许soket使用O_NONBLOCK模式;与常量字符串的比较只有指针允许用==,数组不可以用==,但是两者都可以使用strcmp;recv()函数在client端结束程序关闭连接之后,返回0。

2014.4.30:

改进:

server端:1.代码整合到一个handler类;2.服务端改成多线程处理;3.svc里面加锁mutex,epoll由多线程处理。

tips:

1.pthread_create()的传递函数入口参数,注意,该参数是void* fun(void*)类型,并且不能是类的普通成员函数,要么定义是普通函数,要么定义成类的static成员函数(此时需要将类的this指针作为该函数的参数传递给它,因为静态成员函数不能访问非静态成员);

2.涉及到pthread库,g++编译时要加-lpthread;

3.pthread_attr_setdetachstate()和pthread_attr_setstacksize()的使用;

4.pthread_barrier_t的准备就绪再齐跑作用;pthread_kill与pthread_join的使用。

5.mutex的使用以及放置方法。

运行效果:




2014.5.6:

改进:

server端:1.给每个线程加个标识id;2.server收到client的请求后,将请求数据别的小写字母变为大写,然后发送回client。

client端:1.用fork变为两个进程,一个负责向server端发送请求,一个负责接收server端返回的结果。

tips

1.printf可用fflush进行冲洗;2.fork的使用;3.kill()、wait()的使用



2014.5.7:

改进:

server端:1.分离出前端server和后端server,前端server负责处理连接和读取请求(epoll->异步、多线程),后端server负责处理请求并返回结果(pthread_cond_wait任务队列->异步、多线程);2.前端server和后端server依靠一个管理类manager转接,前端收到请求后,调用manager的dispatch(),manager再调用后端server的add_into_queue(),将该请求加到后端server的task队列。后端server进行pthread_cond_wait该队列,发现非空就读取一个任务进行处理。

tips

1.queue是front()和back(),加std命名空间

2.pthread_cond_wait<=>(pthread_mutex_unlock->waiting->pthread_mutex_unlock)

3.多线程环境,在任务队列的增删操作上加锁了,就不用在svc()中加锁了。



2014.5.8:

改进:

server端:1.把原来较大的单一文件拆分成多个子文件,分成规范的.cpp和.h文件,然后编写makefile文件。


tips

1.为了防止文件被多次编译,在每个文件前面加上#ifndef #define #endif

2.为了同时生成多个可执行文件,用all





0 0
原创粉丝点击