server/client示例日记
来源:互联网 发布:微云同步盘for mac 编辑:程序博客网 时间:2024/06/05 18:37
涉及:网络编程基本通信(socket、setsockopt使用)、异步通信机制(epoll使用)、C/C++库函数(scanf & strcmp & memset & sprintf & fflush)、多线程(pthread、pthread_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
- server/client示例日记
- Indy Client / Server 程序示例
- linux 下的UDP client/server 示例
- http client和server 通信示例
- php使用websocket示例 client 和 server
- Android跨进程通信-AIDL详解示例(client+server)
- Java Socket Server-client端多线程处理代码示例
- 7.Java NIO系列教程之Server/Client完整示例
- Client-Server C程序示例C (使用 Sockets 和 TCP)
- netbeans创建webservice服务端server|webservice客户端client示例
- Client/Server
- server&&client
- client server
- CAS client配置示例
- openx XMLRPC client示例
- Linux UDP Server and Client Sample.Linux 下 UDP 服务和客户端程序示例
- java Tcp Client server
- Server Client Sockets
- 脚本自动登陆shell脚本(简洁版)
- Win7下Apahce 2.2 + php5.4的curl打开方式
- JavaScript - 轮播广告实例
- java double不使用科学计数法
- objective-c 算数函数
- server/client示例日记
- Android程序:使用ViewFlipper实现屏幕切换动画及手势滑动切换功能
- C编译器剖析_6.3.1 汇编代码生成_由中间指令产生汇编代码的主要流程
- 【2】springmvc 入门
- Iphone被刷机后用电信卡提示未激活,移动联通卡可以正常使用
- wifidog safe.c&.h分析
- spring quartz定时任务配置【基础篇】
- Children’s Queue - HDU 1297 简单DP
- 今天注册了博客,记录学习的点滴。