2012年10月20日
摘要: 服务器端的编写: 1. 使用socket函数新建一个套接字,指定其 协议族family(AF_INET)、协议类型type(SOCK_STREAM)、协议(0, 系统根据family和type指定默认值) 2. 使用bind函数将本地协议地址绑定到套接字上, 3. 使用listen函数监听客户端发来的请求 4. 使用accept函数循环接受客户端的请求 5. 使用send和recv函数发送和接收数据客户端程序的编写 : 1. 使用socket函数创建一个套接字 2. 使用connect函数连接服务器 3. 使用send和recv发送和接受数据示例如下:由于使用winsock之前... 阅读全文
posted @ 2012-10-20 20:59 sanlo 阅读(3982) 评论(0) 推荐(0) 编辑
摘要: 一、TCP的特点 1. TCP是面向连接的,两台主机想要通过TCP则必须先建立连接 2. TCP提供了可靠性(reliability)。当TCP想另一端发送数据时,它要求对端返回一个确认,如果没有收到确认,TCP就会自动重传数据并等待更长时间。 注:TCP并不保证数据一定会被对方端点接收。如果不能成功发送数据就会通知用户,它提供的是数据的可靠传输或故障的可靠通知。 提供可靠性的机制有:确认,序列号,RTT估算、超时和重传。 3. TCP提供流量控制(flow control)。TCP总是告知对端在任何时刻它一次能够从对端接收多少字节的数据,这被称为通告窗口(adertised win... 阅读全文
posted @ 2012-10-20 17:10 sanlo 阅读(287) 评论(0) 推荐(0) 编辑
  2012年10月19日
摘要: with语句在很多情况下都很有用,使用它可以大大简化代码。 例如我们想要读取一个文件:1withopen(‘test.txt’,‘r’)asf:2forlinf:3printl 当with语句执行完之后,f对象的close成员函数会被自动调用。 天下没有免费的午餐,你想使用with语句,想知道什么时候能使用它,还需要了解这样一个事实:with语句仅能工作于支持上下文管理协议(context management protocol)的对象。 常见的支持上下文管理协议的对象有:file, threading模块中的locks, conditions,semaphores等。 关于上下... 阅读全文
posted @ 2012-10-19 17:38 sanlo 阅读(283) 评论(0) 推荐(0) 编辑
  2012年10月18日
摘要: 线程局部存储区(Thread Local Storage, TLS):将数据与一个正在执行的特定函数关联起来。 线程局部存储是将现有函数变为线程安全的有用技巧。 当一个函数中访问并修改全局或静态变量,那么这个函数就是不可重入的。若使之变为可重入的函数,可以使用线程同步,也可以使用线程局部存储。线程局部存储为每一个访问此变量的线程提供一个此变量独立的副本,线程可以修改此变量,而不会影响到其他线程。 注:通过以上描述可以看出,线程局部存储不是用来共享变量的。 C标准库中的strtok就是一个典型的不可重入函数。当程序第一次调用它时,该函数会将传入的字符串地址保存在它自己的静态变量中... 阅读全文
posted @ 2012-10-18 23:12 sanlo 阅读(6280) 评论(1) 推荐(0) 编辑
  2012年9月29日
摘要: 一、SConstruct File {{{1 1. Sconstruct 文件 是scons用来控制编译的文件 2. Sconstruct 文件 是一个python脚本 3. SConstruct 文件 是一个类似于makefile一样的东西, 告诉 scons做什么,而不是严格的规定soncs做这件事的步骤二、scons选项 {{{1 -c Cleaning up After a Build -Q Making the scons output less verbose三、SConstruct 脚本的编写基础 {{{1 1. builder method {{{2 Pro... 阅读全文
posted @ 2012-09-29 18:30 sanlo 阅读(18331) 评论(0) 推荐(1) 编辑
  2012年9月14日
摘要: 很多时候我们需要计算程序的运行时间来检查程序的效率,利用boost中的 boost::timer库可以很容易完成这项任务。所需头文件: <boost/timer/timer.hpp>名字空间 : boost::timer类 :cup_timer, auto_cpu_timer先来看下cpu_timer,这个类的接口很简单:1voidcpu_timer::start()noexcept; //开始一个计时器2voidcpu_timer::stop()noexcept; //结束一个计时器3voidcpu_timer::resume()noexcept; /... 阅读全文
posted @ 2012-09-14 11:59 sanlo 阅读(3757) 评论(0) 推荐(0) 编辑
  2012年8月29日
摘要: 修改密码:passwd [username]切换到XXX用户 : su - XXX修改文件群组 :chgrp , 群组名要在/etc/group中定义修改文件拥有者:chown , 用户名要在/etc/passwd中定义修改文件权限 :chmod查看文件权限 :ls -l [filename] 阅读全文
posted @ 2012-08-29 19:20 sanlo 阅读(139) 评论(0) 推荐(0) 编辑
  2012年7月27日
摘要: 编译脚本为:bjam stage toolset=msvc link=static runtime-link=shared threading=multi variant=debug,release --build-type=complete --with-python注意这两个选项:link=static runtime-link=shared 即:生成静态链接库,而运行时库链接Crt动态库版本编译成功后生成两个静态库:libboost_python-vc90-mt-gd-1_50.lib // debug版本libboost_python-vc90-mt-1_50.lib // ... 阅读全文
posted @ 2012-07-27 10:54 sanlo 阅读(2118) 评论(0) 推荐(0) 编辑
  2012年7月6日
摘要: 今天又遇到了这个问题,就地总结下以免遗忘。 在一个编译单元(如一个.c或.cpp文件)中,静态对象的初始化顺序与该对象出现在此编译单元中的顺序相同;而清除该对象的顺序则与初始化的顺序相反。 (注:函数内部的静态对象在函数第一次被调用时初始化,且只被初始化一次。) 但是如果多个静态对象被定义在不同的编译单元中,那么它们的初始化顺序将是不确定的。示例如下:1//x.cpp2externinty;3intx=y+1;456//y.cpp7externintx;8inty=x+1;91011//main.cpp12#include<iostream>13usingnamespacestd; 阅读全文
posted @ 2012-07-06 23:50 sanlo 阅读(458) 评论(0) 推荐(0) 编辑
  2012年5月10日
摘要: 调试的时候需要打印一些调试信息,刚开始的做法如下:1#ifdef_DEBUG2//打印调试信息3#endif这样的代码写得多了,就觉得繁琐,于是我进行了改进如下:1voidDebugPrint(constchar*format,...);2#ifdef_DEBUG3#defineDEBUG_PRINTDebugPrint4#else5#defineDEBUG_PRINT6#endif这样就可以在调试模式下使用DEBUG_PRINT打印各种类型的数据。自鸣得意了一段时间,忽然想到了一个问题,在Release模式下,语句:1DEBUG_PRINT("Hello,%s",&quo 阅读全文
posted @ 2012-05-10 16:54 sanlo 阅读(3888) 评论(0) 推荐(0) 编辑