2004年10月18日
编写Linux下的Daemon程序 作者: dagger 无崖阁 xyg.ods.org 
版本: 1.0 2003-04-08 初始版本 
一、引言 Daemon程序是一直运行的服务端程序,又称为守护进程。
本文介绍了在Linux下编写Daemon程序的步骤,并给出了例子程序。 
二、Daemon程序简介 Daemon是长时间运行的进程,通常在系统启动后就运行,
在系统关闭时才结束。一般说Daemon程序在后台运行,是因为它没有控制终端,
无法和前台的用户交互。Daemon程序一般都作为服务程序使用,等待客户端程序
与它通信。我们也把运行的Daemon程序称作守护进程。 
三、Daemon程序编写规则 
编写Daemon程序有一些基本的规则,以避免不必要的麻烦。 
1、首先是程序运行后调用fork,并让父进程退出。子进程获得一个新的进程ID,
但继承了父进程的进程组ID。 
2、调用setsid创建一个新的session,使自己成为新session和新进程组的
leader,并使进程没有控制终端(tty)。 
3、改变当前工作目录至根目录,以免影响可加载文件系统。或者也可以改变到
某些特定的目录。 
4、设置文件创建mask为0,避免创建文件时权限的影响。 
5、关闭不需要的打开文件描述符。因为Daemon程序在后台执行,不需要于终端
交互,通常就关闭STDIN、STDOUT和STDERR。其它根据实际情况处理。 
另一个问题是Daemon程序不能和终端交互,也就无法使用printf方法输出信息
了。我们可以使用syslog机制来实现信息的输出,方便程序的调试。在使用
syslog前需要首先启动syslogd程序,关于syslogd程序的使用请参考它
的man page,或相关文档,我们就不在这里讨论了。 
四、一个Daemon程序的例子 编译运行环境为Redhat Linux 8.0。 
我们新建一个daemontest.c程序,文件内容如下: 
#include  #include  #include  #include  #include  
#include  #include  
int daemon_init(void) 
{ pid_t pid; 
if((pid = fork()) < 0) return(-1); 
else if(pid != 0) exit(0); /* parent exit */ 
/* child continues */ 
setsid(); /* become session leader */ 
chdir("/"); /* change working directory */ 
umask(0); /* clear file mode creation mask */ 
close(0); /* close stdin */ 
close(1); /* close stdout */ 
close(2); /* close stderr */ 
return(0); } 
void sig_term(int signo) 
{ if(signo == SIGTERM) 
/* catched signal sent by kill(1) command */ 
 { syslog(LOG_INFO, "program terminated."); 
 closelog(); exit(0); } 
} 
int main(void) 
{ if(daemon_init() == -1) 
{ printf("can't fork self\n"); exit(0); } 
openlog("daemontest", LOG_PID, LOG_USER); 
syslog(LOG_INFO, "program started."); 
signal(SIGTERM, sig_term); /* arrange to catch the signal */ 
while(1) { sleep(1); /* put your main program here */ } 
return(0); } 
使用如下命令编译该程序: gcc -Wall -o daemontest daemontest.c 
编译完成后生成名为daemontest的程序,执行./daemontest来测试程序的运行。
使用ps axj命令可以显示系统中已运行的daemon程序的信息,包括进程ID、
session ID、控制终端等内容。 
部分显示内容: 
PPID PID PGID SID TTY TPGID STAT UID TIME COMMAND 
1098 1101 1101 1074 pts/1 1101 S 0 0:00 -bash 1 1581 777 777 ? -1 S 500 0:13 gedit 1 1650 1650 1650 ? -1 S 500 0:00 ./daemontest 794 1654 1654 794 pts/0 1654 R 500 0:00 
ps axj 从中可以看到daemontest程序运行的进程号为1650。
我们再来看看/var/log/messages文件中的信息: Apr 7 22:00:32 localhost 
daemontest[1650]: program started. 
显示了我们在程序中希望输出的信息。 
我们再使用kill 1650命令来杀死这个进程,
/var/log/messages文件中就会有如下的信息: 
Apr 7 22:11:10 localhost daemontest[1650]: program terminated.
 使用ps axj命令检查,发现系统中daemontest进程已经没有了。
 五、参考资料 
Advanced Programming in the UNIX Environment W.Richard Stevens 

void       g_main_loop_run        (GMainLoop    *loop)
{
 int open_max = sysconf(_SC_OPEN_MAX);
 struct pollfd *ufds = malloc(open_max * sizeof(struct pollfd));

 while (!loop->bail) {//外层主循环,本循环内没有函数改变loop的值,

//所以这是个无限循环;

//我猜测hcid->main.c中关于信号的处理将影响loop的值,

 memset(&sa, 0, sizeof(sa));
 sa.sa_flags = SA_NOCLDSTOP;
 sa.sa_handler = sig_term;
 //sigaction change default action by system when the first para signal happened;
 sigaction(SIGTERM, &sa, NULL);
 sigaction(SIGINT,  &sa, NULL);

sig_term的操作很简单loop->bail=1,这样g_main_loop_run就会退出无限循环;

比如,hcid是一个deamon,我们可以调用kill向hcid进程发出SIGTERM信号;
  int nfds, rc, i;
  struct watch *p, *w;

  nfds = 0;
  for (w = watch_head.next; w != NULL; w = w->next) {
   ufds[nfds].fd = w->channel->fd;
   ufds[nfds].events = w->condition;
   ufds[nfds].revents = 0;
   nfds++;
  }
  
  rc = poll(ufds, nfds, -1);

  if (rc < 0 && (errno == EINTR))

//poll’s man page http://jamesthornton.com/linux/man/poll.2.html

//EINTR A signal occurred before any requested event. 
   continue;

  if (rc < 0) {
   perror(“poll”);
   continue;
  }
 //poll的返回值大于0,是正常情况,我们处理;注意中文翻译书出错 
  p = &watch_head;
  w = watch_head.next;
  i = 0;
  while (w) {
   if (ufds[i].revents) {
    gboolean keep = w->func(w->channel, ufds[i].revents, w->user_data);
    if (!keep) {
      p->next = w->next;
      memset(w, 0, sizeof(*w));
      w = p->next;
      i++;
      continue;
    }
   } 
  
   p = w;
   w = w->next;
   i++;
  }

 }

 free(ufds);
}

Wait queues have several uses in the kernel, particularly for interrupt handling, process synchronization, and timing. Because these topics are discussed in later chapters, we’ll just say here that a process must often wait for some event to occur, such as for a disk operation to terminate, a system resource to be released, or a fixed interval of time to elapse.进程经常需要等待一些事件的发生,例如一个磁盘操作的结束,或者一个系统资源的释放等等。 Wait queues implement conditional waits on events: a process wishing to wait for a specific event places itself in the proper wait queue and relinquishes control.等待队列实现了事件上的条件等待:希望等待特定事件发生的进程将自己放在合适的队列并且放弃对cpu的控制。 Therefore, a wait queue represents a set of sleeping processes, which are woken up by the kernel when some condition becomes true. 因此,等待队列代表一个睡眠进程的集合,当条件为真时,由内核唤醒。

Wait queues are implemented as doubly linked lists whose elements include pointers to process descriptors. Each wait queue is identified by a wait queue head, a data structure of type wait_queue_head_t:

struct _ _wait_queue_head {
    spinlock_t lock;
    struct list_head task_list;
};
typedef struct _ _wait_queue_head wait_queue_head_t;

Since wait queues are modified by interrupt handlers as well as by major kernel functions, the doubly linked lists must be protected from concurrent accesses, which could induce unpredictable results (see Chapter 5). Synchronization is achieved by the lock spin lock in the wait queue head.

Elements of a wait queue list are of type wait_queue_t:

struct _ _wait_queue {
    unsigned int flags;
    struct task_struct * task;
    struct list_head task_list;
};
typedef struct _ _wait_queue wait_queue_t;

Each element in the wait queue list represents a sleeping process, which is waiting for some event to occur; its descriptor address is stored in the task field. However, it is not always convenient to wake up all sleeping processes in a wait queue.

For instance, if two or more processes are waiting for exclusive access to some resource to be released, it makes sense to wake up just one process in the wait queue. This process takes the resource, while the other processes continue to sleep. (This avoids a problem known as the “thundering herd,” with which multiple processes are awoken only to race for a resource that can be accessed by one of them, and the result is that remaining processes must once more be put back to sleep.)

Thus, there are two kinds of sleeping processes: exclusive processes (denoted by the value 1 in the flags field of the corresponding wait queue element) are selectively woken up by the kernel, while nonexclusive processes (denoted by the value 0 in flags) are always woken up by the kernel when the event occurs. A process waiting for a resource that can be granted to just one process at a time is a typical exclusive process. Processes waiting for an event like the termination of a disk operation are nonexclusive.

the wake_up_process( ) function is used to make a process runnable. It sets the process state to TASK_RUNNING and invokes add_to_runqueue( ) to insert the process in the runqueue list. It also forces the invocation of the scheduler when the process has a dynamic priority larger than that of the current process or, in SMP systems, that of a process currently executing on some other CPU

这个函数的用途:可以是一个进程可运行。它设置进程的状态为TASH_RUNNING,并且调用add_to_runqueue函数将进程插入runqueue链表。当这个进程的优先级大于现在正在cpu上执行的进程,就会调用scheduler进程调度者。

3.2.2.4 Doubly linked lists

The process list is a special doubly linked list. However, as you may have noticed, the Linux kernel uses hundreds of doubly linked lists that store the various kernel data structures.

For each list, a set of primitive operations must be implemented: initializing the list, inserting and deleting an element, scanning the list, and so on. It would be both a waste of programmers’ efforts and a waste of memory to replicate the primitive operations for each different list.

Therefore, the Linux kernel defines the list_head data structure, whose fields next and prev represent the forward and back pointers of a generic doubly linked list element, respectively. It is important to note, however, that the pointers in a list_head field store the addresses of other list_head fields rather than the addresses of the whole data structures in which the list_head structure is included (see Figure 3-4).

Figure 3-4. A doubly linked list built with list_head data structures

figs

A new list is created by using the LIST_HEAD(list_name) macro. LIST_HEAD宏产生一个新的链表。It declares a new variable named list_name of type list_head, which is the conventional first element of the new list (much as init_task is the conventional first element of the process list).

Several functions and macros implement the primitives, including those shown in the following list.

list_add(n,p)

Inserts an element pointed by n right after the specified element pointed by p (to insert n at the beginning of the list, set p to the address of the conventional first element)

list_add_tail(n,h)

Inserts an element pointed by n at the end of the list specified by the address h of its conventional first element

list_del(p)

Deletes an element pointed by p (there is no need to specify the conventional first element of the list)

list_empty(p)

Checks if the list specified by the address of its conventional first element is empty

list_entry(p,t,f)

Returns the address of the data structure of type t in which the list_head field that has the name f and the address p is included

返回数据结构t的地址,这个结构包含值等于f的list_head,地址p也在这个结构的地址范围内。

list_for_each(p,h)

Scans the elements of the list specified by the address h of the conventional first element (similar to for_each_task for the process list)

2004年10月14日

1.基础篇

什么是代理服务器?
代理服务器是介于浏览器和Web服务器之间的一台服务器,当你通过代理服务器上网浏览时,浏览器不是直接到Web服务器去取回网页,而是向代理服务器发出请求,由代理服务器来取回浏览器所需要的信息,并传送给你的浏览器。

什么是免费代理服务器
在使用代理猎手等软件搜索代理服务器地址时,会在验证状态栏中出现类似“要密码”、“Free”等字样。如果你把“Free”的地址设置为代理服务器,那你就会发现访问网页时不会要求你输入密码了。这就是“免费的代理服务器”。为什么会出现free的呢?有以下几种情况:
  1.是系统漏洞,一旦被网管发现就会被堵上;
  2.是善良的网管和其他有机会接近主机的人,将机器设成了代理服务器;
  3.是真正的好心人,就是将自己的机器作为免费代理,造福广大同仁。这真
      值得钦佩!但被查封关闭得也最快。
  4.是ISP商为了提高影响,在一段时间内免费开放,一般很短。
使用代理服务器的好处
Proxy Server(代理服务器)是Internet链路级网关所提供的一种重要的安全功能,它的工作主要在开放系统互联(OSI)型的对话层,主要的功能有:
    突破自身IP访问限制:
  1.访问国外站点。教育网、169网等网络用户可以通过代理访问国外网站。
  2.访问一些单位或团体内部资源,如某大学FTP(前提是该代理地址在该资源的允许访问范围之内),使用教育网内地址段免费代理服务器,就可以用于对教育网开放的各类FTP下载上传,以及各类资料查询共享等服务。
  3.突破中国电信的IP封锁:中国电信用户有很多网站是被限制访问的,这种限制是人为的,不同Serve对地址的封锁是不同的。所以不能访问时可以换一个国外的代理服务器试试。
  4.提高访问速度:通常代理服务器都设置一个较大的硬盘缓冲区,当有外界的信息通过时,同时也将其保存到缓冲区中,当其他用户再访问相同的信息时,则直接由缓冲区中取出信息,传给用户,以提高访问速度。
  5.隐藏真实IP:上网者也可以通过这种方法隐藏自己的IP,免受攻击。
    6.嘿嘿,免费。

2.上手篇:

Internet Explorer中代理的设置方法(适用于直接上internet的用户,否则请看二次或多次代理篇)
1.在IE4.0中的代理设置方法:
在主菜单上选择“查看”→“Internet选项”→“连接”→“通过代理服务器访问Internet”,此时将你找到的代理服务器地址和端口填入,然后点击“确定”,就可以通过代理服务器浏览网页了。
2. IE5.0的代理设置方法:
在主菜单上选择“工具”→“Internet选项”→“连接”→“设置”→“使用代理服务器”,这时将你找到的代理服务器地址和端口填入即可。
提示:对于局域网用户,应点击“连接‘标签下面的’局网域设置”来设置代理。
3. NETSCAPE 4.x的代理设置方法:
选择主菜单上的“Edit”→“Preferences”→“advanced”→“proxies”→“Manual proxy configuration”→“View”,将你找到的代理服务器地址和端口填入,按“OK”完成。
4. Opera的代理设置方法:
选择主菜单上的“设置”→“Proxy选项”,将你找到的代理服务器地址和端口填入即可。
5.网络蚂蚁的代理设置方法:
在主菜单上选择“选项设置”→“参数设置”→“代理”→“添加”,然后将可用的代理服务器地址根据类型填入,如该服务器需要输入用户名和密码,选中代理服务器选项下的“认证”,填入即可。大多数下载软件的代理设置与网络蚂蚁相似,如FlashGet。

3.进阶篇:

从哪里能找到代理最原始的方法就是用软件搜索某个网段(现在网上还有很多搜索代理的工具软件),不过这种搜索代理服务器可是很费时的活。通常大家是不会把自己经常使用的代理服务器告诉别人的,因为用的人多了速度自然就会慢。不过网上也有很多网站和BBS(如本论坛–鸭绿江专业代理论坛)都提供免费代理服务器的地址,你可以自己用搜索引擎(如Google、百度)查一下Proxy或者免费代理,就能发现很多类似的网站。
说到搜索代理软件那就首推代理猎手,向导式的在线帮助说明,就算你是第一次使用也应不存在太大的问题。具体步骤如下:
  1.从网上收录到尽可能多的代理列表(最好都是可用的),保存为一个以.txt后缀的文本文件,格式如下:
  101.123.193.15:1080@SOCKS4
  101.123.193.115:1080@SOCKS5
  101.123.193.115:21@ftp
  101.123.193.115:80@http
  101.123.193.115:8080@http
  ……
  (以上地址皆为举例)
  2.运用代理猎手到“搜索结果”页面中,点“导入结果”,将.txt格式的代理列表导入。
  3.点击“系统”按钮,选择“参数设置”。
  4.在“搜索验证设置”页面中对“验证设置”项中的两个超时时间参数进行设置。
  5.最后当然是上网的校验。

什么样的代理是好代理

代理好用的标准:速度快,稳定,当然前提是免费。
在代理猎手3.0以上版本,验证时间栏为“时间特性”,显示情况类似这样:“0.9│1.3│2.6”、“26.3│0.0│26.3”,这三个时间依次代表:连接时间、首次接收数据时间、总验证时间。当然也是越小越好了。决定一个代理的速度的因素有很多,主要有:
1.免费代理服务器所在的网路。大家用proxy主要还是为了出国,因而,四大网络的出口局的带宽就直接决定着其中的proxy的速度。
2.代理服务器的性能。前面的文章提到,proxy不过是一个大cache而已,因此它的硬盘大小、网路的带宽就会影响速度。这和你自己机器是一样的。
3.代理服务器与你的机器之间的距离。proxy主要是为特定对象服务的,其地理分布通常不会太广泛。而广大网友就不会与你所用的proxy之间的距离有多远了。自然,距离越远,速度也就越慢。
4.你所访问的站点的情况。这也是影响proxy速度的原因。你要访问对方的站点,自然要以对方的标准为主,就如同两架速度不同的Modem一样。可惜很多网友常常忽略这点。

4.高手篇:

怎样使用代理访问不能上的网站

由于……(省略100字,不告诉你们,哈哈)。教育网用户不能访问国外网站,所有国外的代理也不能为之使用,是否我们便无能为力了呢?答案不是这样的。
我们可以参照下面二次代理的使用方法解决。
  1.去Download一个Sockscap32,在设置中填好Socks代理服务器地址。
  2.将浏览器的快捷方式拖到SocksCap32的空白框中。联网后,先启动Sockscap32。再在浏览器中填上国外代理服务器的地址,在SocksCap32中运行浏览器即可。

如何通过代理使用FoxMail收信

可以使用sockscap32解决。前提:有一个好用的Socks代理,通过一个可以访问的Socks代理(Socks5或者Sock4代理),将FoxMail的快捷方式拖到SocksCap32的空白框中,你的Foxmail即可以畅通无阻了。同样的方法也适用于Cterm、Sterm等Telnet软件访问教育网内的各大BBS站点,加快速度,而又能隐藏真实IP地址等等。有时会出现不能解析服务器地址的现象,可以先使用ping pop.mail.yahoo.com命令,然后把解析到的IP地址填入Foxmal的POP3服务器选项。
另一法:假设你有POP3代理服务器,例如:203.95.7.196,你的账号为Algam@21cn.com;则
在OutlookExpress或FOXMAIL30中应按如下设置:POP3服务器地址中填写:代理服务器地址,203.95.7.196(端口无须设定);SMTP服务器地址为:原来的SMTP服务器地址smtp.21cn.com(实际上因为不需要用他发信,所以SMTP服务器地址可以随便填写);帐号为:原来账号Algam#21cn.com(既用’#'取代原来的’@'符号);口令为:原来的账号口令。

QQ可以使用代理吗

有一次笔者的同学在QQ上说:“你怎么跑到深圳去了,你不是在上海吗?”其实笔者知道这家伙爱卖弄,不就是装了个可以看IP的QQ版本吗,现在有几个人用的QQ不是可以看IP的。QQ使用代理可以隐藏真实IP,这样可以避免一些不必要的骚扰。QQ的会员可以能够使用HTTP代理的功能,而非会员就只能使用Socks代理了。有些公司网络只能上网浏览不能使用QQ,主要是封了Socks端口,避免员工上班的时候用QQ聊天。其实这种情况也有办法解决。首先下载一个SocksOnline软件,是将普通HTTP代理转换为“万能”的Socks5代理的工具,SocksOnline代理是利用了CommOnline的在线通讯能力,进行Socks代理转接。SocksOnline代理使用非常简单,只要将客户端应用的Socks5代理设置到SocksOnline的地址,客户端即能正常使用。

ICQ中使用代理

假设你有Socks5代理服务器,例如:202.96.58.241;则在oicq系统菜单==>喜好设定==>连接下,选择 “我在防火墙下或PROXY下”==>点击“防火墙设置”==>选择“我使用Socks5 proxy服务器”==>下一步==〉在socks5(防火墙)主机地址中填入代理的地址==> 端口号中填入sockes5的端口号(一般是1080),如果不确定代理服务器是否可用,可以按“检查我的防火墙/PROXY设置”。==>点击“完成”。

ICQ2000中使用代理
icq==>preferences==>connections==>firewall==>proxies/firewall==>选择代理服务器类型 socks4 or socks5 or https ==>在proxy server 页里填上host地址和port ==>最后不要忘记选择use proxy to resolve hostnames。
注意:据一些网友们说在安装时候如果不使用代理服务器,后来使用时可能将不能使用代理服务器上icq。

使用代理上oicq

假设你有Socks5代理服务器,例如:202.96.58.241;则在oicq系统菜单==>系统参数==>网络设置下,在使用Proxy Socks5 防火墙前面打勾==>在防火墙地址中填入代理的地址==> 端口号中填入socks5的端口号(一般是1080),如果不确定代理服务器是否可用,可以按校验用户密码边上的测试按钮进行测试。

使用FTP代理服务器(上传/下载文档)

一般FTP软件设置;服务器栏:代理服务器地址,账号为:账号@原FTP服务器地址,密码为:原来的账号口令。以CUTE FTP之中使用FTP代理为例子。菜单栏“FPT”==“SETTINGS”==〉“OPTIONS”==〉“FIRE WALL==〉HOST:代理服务器地址==〉PORT:21==〉TYPE:USERuser@site==〉选择“Enable firewall…”

CUTE FTP中使用socks代理服务器(上传/下载文档)

以CUTE FTP4.0为例:Edit==>Settings…==>Connection==>Socks==>选择“socks4”或
“socks5”==>在Host旁边填写上socks4或socks5代理服务器的地址(鉴于socks5十分紧俏,又不稳定,请使用socks4为好)==>选择“Firewall”把“Enable fire ac..”旁边的复选框中的钩去掉。==>点击确定。现在就可以大大方方的使用socks4代理服务器上传主页了。(虽然多数socks代理都能上传主页,但有部分socks代理由于不允许同一ip重复联接,可能不能上传,出现这种情况时,请换一个socks代理)

使用代理服务器上联众打游戏

无聊的时候笔者喜欢到联众或者中国游戏中心下几局四国军旗,笔者的寝室有两台电脑(相同IP),由于联众有禁止于相同IP玩家同桌的选项,所以玩的时候一个不用代理,一个用Socks代理,或者使用Sockscap32,这种玩法基本是百战百胜,呵呵。另外一种办法就是一台电脑用来玩,用另外一台电脑通过代理去偷看对手的棋。这两种方法也适合在网吧的朋友。如果你在联众看到一个叫笔者的人千万不要和他玩,不然你会死的很惨,同样的方法也可以在中国游戏中心之类的游戏网站使用。
运行“联众网络游戏世界” ==>点击“设置代理服务器”==〉选择要使用的socks4还是socks5代理(因为socks5代理奇缺,建议打游戏时候使用socks4代理)==>在“代理服务器地址”中填写socks代理服务器地址==>端口默认1080==>不要忘记选择“通过代理服务器联接internet”的复选框。==>“确定”==>在“地址”中填写游戏服务器的ip地址(如果不知道它的ip地址,以上海分站为例,可以把地址sh.ourgame.com抄下来。然后打开”开始菜单” 下的msdos方式键入”ping sh.ourgame.com”,他会把ip地址返回来)==>最后点击“连接”

在网络蚂蚁中设置代理服务器

点击“网络蚂蚁”的菜单“选项”==〉 参数设置==〉 “代理”==〉点击“添加”==〉在“类型”下拉式列表中选择http(get)==>在“地址”中填写http代理服务器的地址;端口填写代理服务器的端口(例如80);在“名称”中随便起个名字==〉一路选择“确定”当下载东西时,选择好了文件存放的本地文件夹之后,不要忙于点“确定”。应该点“代理”选择希望使用的代理服务器的名称,然后再点击“确定”,就可以使用这个代理服务器下载了。顺便说一句,本站长用“蚂蚁+自己专用的http代理”下载1M以上东西通常也都是能稳定在6k/s左右。

使用socks代理上IRC聊天

在mirc的菜单“文件”==〉“选项”==〉“连接”==>“防火墙”==>选择“使用代理服务器”==> 选择“socks4”或者“socks5”==>在“主机”里填写上socks4或者socks5代理服务器的ip地址==〉端口用1080==>确定

V2语音聊天软件中使用socks5代理

系统设置==> “网络”==> “连接方式”中选择“我使用的是支持socks协议的代理服务器”==> “代理服务器(proxy)”==>选择socks5==>填写socks5代理服务器的ip地址和端口1080==>“确定”==>现在你可以使用语音聊天和朋友打电话了。

CTERM2000中使用telnet代理访问BBS

文件==>地址簿==>选择自己要去的bbs或者自己增加新的bbs站==>将原来放置在“地址”栏中的bbs的地址(例如:网易的bbs.nease.net)剪贴到“自动登陆”栏中,原来的地方填写telnet代理服务器的ip地址(例如:203.93.37.248)==>然后最好在“自动登陆”栏中bbs.nease.net后面加上“\n”表示回车,如果知道进入时需要键入什么用户名之类的还可以加上其他的转意符和字符。(具体可以看他的Help)==>为了方便,建议点击“输出到文档”按钮,将设置存入文档,方便以后使用==>然后就可以按“连接站点”了。顺便说一句:我对cterm2000的印象很好,使用也很简单,建议要上bbs的用户使用。

************************************************************
二级代理篇:

对于在教育网和科技网内的朋友,直接从国外下载需要支付高额流量费,或机器不能直接连出国,所以要使用国外的代理,还得先学会用二级代理。二级代理的设置方法见 “Httport”的说明文章。”socks2http + Sockscap” 设置,参见其它代理设置网站。有一点需要注意的是:并不是所有的代理都能用作一级代理,只有支持SSL的HTTP代理才行。
论坛代理专业版中有很多.
一句话:一级代理用支持SSL的免费HTTP代理,二级代理用下载文献的国外代理!

1.Httport中二级代理设置简介

如果只是想使用二级代理的话,这个软件比socks2http+SocksCap32要方便得多。至于Httport的其它功用,自己慢慢摸索吧,对于这方面的询问,恕不回复!当然有一个前提,就是你所用的一级代理得要支持SSL,其实在socks2http里设的代理也有这个要求。这也就是为什么有些代理不能用在socks2http里的原因.
以202.120.25.36:8080作为一级代理为例,首先在代理页面将202.120.25.36填入主机名或IP地址栏中,别忘了填端口。勾选身份验证,填入用户名和密码(免费代理随便填)。用户代理选IE,用过SSL连接模式,其余不填。二级代理设置在端口映射菜单。”外部HTTP代理”下面的就是你要用的二级代理了,比如2.25.56.58:80。即”远程主机”里填上2.25.56.58,”远程端口”就是80,至于那个”本地端口”,比如用3128,那么你在IE里设代理localhost:3128 。点击左边那个的”开始”就行了.

Httport下载 http://202.38.64.10/%7Eadamxc/zip/httport3.zip

2.将HTTP代理转为SOCKS代理

首先向大家推荐两个软件:sockscap和socks2http。sockscap我想就不用多说了吧,如果你有socks代理,用了这个自然就能实现二级代理,不过socks代理倒是不多.而socks2http是用http代理模拟socks5代理. 比如用202.38.64.4:8080做socks代理,在socks2http设置中如是填入后,填入你的帐号和密码.再点击 “完成”即可.使用时,在你所用的软件中的socks5代理栏处 填入localhost,端口1080 .这样你所用的自然就是202.38.64.4的socks代理了. 或者运行sockscap,在socks代理设置中填localhost,注意只能用socks5,不能做socks4代理. 但用http模拟的socks代理限于很少的一些网络软件.http浏览没什么问题(注意IE4不支持sockacap),可telnet,ftp就不一定了,好像只有本身支持socks代理的软件才行.建议在telnet时使用Sterm1.0,在ftp时用Absoluteftp.(注意需要使用二级代理的软件,一定要在sockscap里运行,你所用的第一级代理才能生效)。哇塞,用了这个法子,好处可多多哟!特别是使用64.4的大侠们.用它telnet,ftp前面已述.当教育网那条路断了时,用64.4还是可以的说.特别是可以不再有什么几条线程的限制了,也没有什么不能下载mp3及rm文件的限制了,不信你试试看!只是有点遗憾不能用这个方法上oicq! 我想有了这个方法后,大家再也不用愁什么二级代理的问题了吧.象你如果用64.4模拟成socks5后,照上述方法,再用一个国内的免费代理,连出国,速度也还不马马虎虎,只是你的钞票会哗啦哗啦往外流得少一点了吧!
下载: socks2http http://mail.ustc.edu.cn/~adamxc/zip/s2h.zip
sockscap http://mail.ustc.edu.cn/~adamxc/zip/SocksCap32.zip
对于一些没有出校IP,只有学校proxy的朋友,得要用三级代理。设置三级代理就得要httport +socks2http+ sockscap一起用了。先搜索校内可用的代理,例如:202.120.25.36(假设),在httport中用第一级202.120.25.36;或申请国内浏览服务器(注意要填上你的帐号和密码)。第二级用支持SSL的免费代理,在httport的”端口映射”—>外部http代理”中设定。然后在socks2http里用代理localhost,端口就是你在上述”外部http代理”中你用的本地端口(202.120.25.36)。下面就是用sockscap,在里面启动IE,

二次代理进阶篇:

其实二次代理就是两个代理的级联,有很多Proxy Server本来就支持级联,如Winproxy、Wingate,不是我们自己开代理,只是使用代理,所以不讨论这个问题,(只讨论如何使用代理,建立代理的问题看看WINGATE等的说明,很容易的。)
先说说要用到的一些软件,Sockscap、Httport、MProxy,这几个软件在网上都能很方便的找到,代理级联一般有http代理和socks代理为基础来进行,常用代理级联大概有以下几种方式:
1、http代理之间的级联。
2、socks代理之间的级联。
3、http代理和其他代理的级联。
4、socks代理和其他代理的级联。
5、tlenet代理之间的级联。

一、http代理之间的级联

http代理级联可以有多种方式来实现,我说说简单的两种吧,最简单的方法就是使用Mproxy,它支持三级http代理级联,支持输入前两级代理的地址和端口即可,然后就可以使用本地127.0.0.1:888作为代理来访问,不如这个方法的缺陷就是不支持http代理的认证,不能使用需要认证http代理;另外一种方法使用Httport,其实这个代理功能很强大,现在只是用来http代理间的级联,打开Httport,在proxy页输入第一级http代理的地址和端口,如果需要认证就选择上认证,输入用户名和密码,然后到port mapping页,点击Add按钮,在列表中出现New mapping,然后在RemoteHost里输入第二级http代理的地址,Remote port里输入第二级http代理的端口,local port里输入本地监听的端口,如3128、8080等端口,在Proxy页点start按钮后就可以使用本地127.0.0.1:3128作为代理来访问了,需要注意的是第一级http代理必须支持ssl连接,否则不能级联第二级http代理。(所谓SSL,是Secure Sockets Layer,是由Netscape公司开发的一套Internet数据安全协议,当前版本为3.0。它已被广泛地用于Web浏览器与服务器之间的身份认证和加密数据传输。需要说明的是,虽然你浏览的内容是加密的,不过连接站点在代理服务器上边的是可见的。另外,站点的URL和IP在代理服务器上仍然是可见的。找SSL的代理很简单,可以使用AATools之类的软件,也可以直接用FLASHGAT来验证)需要补充一点的就是,上面的二次代理可以供别人使用,因为是在本地所有ip上进行监听的,如在你的机器ip是10.9.1.11,本地端口是888,别人能访问10.9.0.11:888作为二次代理使用,这样你就可以与别人共享你的二次代理了,这里介绍的Mproxy不是Multiproxy,Multiproxy是做代理验证和调度用的。

二、socks代理之间的级联

socks代理级联也有几种方式,常用的方法是使用sockscap来实现,在sockscap的Setting对话框中输入socks代理地址、端口,如是socks5还有用户和密码,然后加入可使用socks代理的软件(FREE的SOCKS更好了!!),如IE,在Internet选项里socks里设置二级socks代理的地址和端口,在sockscap里运行IE就可以使用上二次socks代理了,像其他的Flashfxp、Sterm和Leapftp里也一样,在这些软件上设置二级socks代理,然后在sockscap里运行就可以使用二次socks代理了;另外也可以使用SkSockServer来实现,这个软件支持256级socks代理的级联,本身也可以作为socks proxy server来使用,跟mproxy差不多,只要加入各级socks代理地址和端口即可,另外sockschain也是做socks级联的工具。(SOCKS代理本身的安全性就高。比如本来丁香园说即使你使用了代理,也可以查出你的真实IP,但是,如果你 。。。。。省略100字,以免有人用次来骗分数!嘿嘿!)

三、http代理和其他代理的级联

http代理跟别的代理级联,这里用的是上面提到的httport,注意第一级http代理一定要求ssl连接(一定是SSL的代理呀,否则不行的!!),在proxy页输入http代理的地址和口,然后在 port mapping页加入其他要级联的代理,如telnet代理,在remote host和remote port里输入分别telnet代理的地址和端口,在local port输入本地监听端口,如23,在proxy页点击start,这样telnet 127.0.0.1 23就是连接到二次代理上,接着输入要远程登录地址和端口即可,级联socks代理也一样,在port mapping页输入二次代理的地址、端口和本地监听端口(如1080),这样你就可以在其他软件上使用127.0.0.1:1080作为二次代理使用了,其他的如ftp、pop3代理也一样这样作为二级代理与http代理级联。

四、socks代理和其他代理的级联
socks代理与其他代理级联,这里介绍的是sockscap,跟上面介绍的一样,在setting对话框里输入socks代理的地址和端口,然后add其他需要用二次代理的软件,如IE,OE和flashfxp等软件,只要在internet选项里输入第二级http和ftp代理的地址和端口,在sockscap里运行IE就能使用二级的http和ftp代理,其他的软件也一样,设置上二级代理在sockscap里运行即可使用二级代理。

五、tlenet代理之间的级联

其实telnet代理之间的级联很简单,以常用的wingate代理为例,当我们telnet到代理时出现Wingate>的提示,直接输入另外一个telnet代理的地址和端口即可,一般是”ip port”,有些代理是”ip:port”(如CSM Proxy Server),输入即可连到二次代理上,在二次代理输入要telnet登录的地址就可以了。

上面介绍了几种常用代理的级联方法,其实就是灵活使用上面的httport、sockscap等几个软件,只要熟练掌握软件的使用,能够玩出很多的花样来,比如跟其它的软件配合使用,至于国外的二次代理,http代理可以到multiproxy的主页上去找,其他代理可以在google上输入free proxy http socks来搜索,最新软件可以到软件的主页获得,最后说一句,学好httport软件的使用大有前途, 对那些只开了http代理,其他端口被封的人大有用处,对了大家别用这些方法干坏事哦(干什么坏事呀?代理服务器上把你干的事记录的清清楚楚的,找你还不容易,只是。。。。。。。只是我想看会电影!)

sockscap的主页 http://www.socks.nec.com/

httport的主页 http://www.htthost.com/

multiproxy的主页 http://www.multiproxy.org/

譬如说,hci指令分组的inquiry指令;
编程如下:

#include
#include
#include

void main(int argc, char **argv)
{
int dev_id, num_rsp, length, flags;
inquiry_info *info = NULL;
bdaddr_t bdaddr;
int i;
dev_id = 0; /* device hci0 */
length = 8; /* ~10 seconds */
num_rsp = 10;
flags = 0;
num_rsp = hci_inquiry(dev_id, length, num_rsp, NULL, &info, flags);//调用这个函数,我们完成了所有的工作。
for (i = 0; i < num_rsp; i++) {
baswap(&bdaddr, &(info+i)->bdaddr);
printf(“\t%s\n”, batostr(&bdaddr));
}
free(info);
}

其中,hci_inquiry函数定义如下;

int hci_inquiry(int dev_id, int len, int nrsp, const uint8_t *lap, inquiry_info **ii, long flags)
{
 struct hci_inquiry_req *ir;
 void *buf;
 int s, err;

 if (nrsp <= 0)
  nrsp = 200; /* enough ? */

 if (dev_id < 0 && (dev_id = hci_get_route(NULL)) < 0) {
  errno = ENODEV;
  return -1;
 } 

 s = socket(AF_BLUETOOTH, SOCK_RAW, BTPROTO_HCI);//建立本地hci socket;
 if (s < 0)
  return -1;

 buf = malloc(sizeof(*ir) + (sizeof(inquiry_info) * (nrsp)));
 if (!buf) {
  close(s);
  return -1;
 }

 ir = buf;
 ir->dev_id  = dev_id;
 ir->num_rsp = nrsp;
 ir->length  = len;
 ir->flags   = flags;

 if (lap) {
  memcpy(ir->lap, lap, 3);
 } else {
  ir->lap[0] = 0×33;
  ir->lap[1] = 0×8b;
  ir->lap[2] = 0×9e;
 }

 err = ioctl(s, HCIINQUIRY, (unsigned long) buf);

//发出inquiry指令,inquiry result event’s struct’s data 会保存在地址(buf+sizeof(ir))
 close(s);

 if (!err) {
  int size = sizeof(inquiry_info) * ir->num_rsp;

  if (!*ii)
   *ii = (void *) malloc(size);

  if (*ii) {
   memcpy((void *) *ii, buf + sizeof(*ir), size);
   err = ir->num_rsp;
  } else
   err = -1;
 }
 free(buf);
 return err;
}

bluez支持/实现socket编程的协议层是

hci,l2cap,rfcomm;

具体的意思是说:

建立socket接口是,可以调用的函数以及参数是

socket(AF_BLUETOOTH,XXX,BTRROTO_HCI)

socket(AF_BLUETOOTH,XXX,BTRROTO_L2CAP)

socket(AF_BLUETOOTH,XXX,BTRROTO_BNEP)//提供bnep层的socket编程

socket(AF_BLUETOOTH,XXX,BTRROTO_SCO)//语音方面的我们用不着,其他的我们用不着

 

实现socket操作函数必须有内核的支持

 无庸置疑,对上班族而言,薪水是非常重要的一件事。谈到待遇问题,几乎是没有人
不关心的。 

    如果你是个有心人,在面试前,一定要做相关行业的薪资调查,建议你上104人力银行
打“职务别关键字”,至少可以有一些资料可以参考。转职的老鸟也一样,谈待遇前一定
要做一些功课,这时候,你仍然可以上104人力银行打“职务别关键字”,用最简单的方式
打探一下业界行情。这些攸关个人权益之事绝对偷懒不得。试想,如果被问到想要多少待
遇,却回答“不知道”,面试官一定会觉得你一点也不关心自身权益,或觉得你很没行情
! 

    你至少应该对所谓的“业界行情”有基本的概念,就算同样一个年资职务,也会因为
工作地点、所属产业不同而有差异,因此  集资料时,来源要尽可能丰富。如果你的人脉
够广,可以请相关产业的人给你直接的建议,当然是最好不过了! 

    当被问及待遇问题时,专家的建议是这样的:

    先了解面试公司的薪资结构,并提出一个合理行情的范围。首先要了解所谓的“底薪
”、“全薪”的差别,比如说月薪不高,但一年固定发十五个月的薪水,或者每年会视业
绩发放红利、股票等,就不能只看月薪的多寡,应该先作全面的了解再做评估。 

    如果你不确定自己提出的“希望待遇”是否恰当,也许你可请教对方“这样的职务通
常在贵公司的待遇如何?”一般来说,每个主考官心理都有一个行情,但可以适度的调整
。当主考官提出一个行情,你再依你的了解及需要提出讨论。 

    如果你学历佳、资历又好,具有谈判的筹码,要坚持自己的价码也比较有胜算,对方
可能因为爱才而以高於预算的待遇录用你。但是也不要漫天要价,显得既贪婪又无诚意。
 

    不过,与其说懂不懂如何谈价码,倒不如说先检视一下,自己有多少实力。价码和实
力是息息相关的,所以,如何再面试时显示实力则更为重要。 

    那么,面试时要如何显示实力呢?专家表示: 

    一、第一步当然是准备能清楚的讲述实力的简历表

    如果你能把过去的工作经历确实列出,又能说服别人你的能力,就已经成功了一半。
例如,你曾经是某公司的秘书,你可以以条列方式列出你以前的工作项目: 

    某某公司  总经理执行秘书  1998-2000 

    工作内容及职责: 

    1、联络国外客户 

    2.、员工教育训练规划 

    3、处理行政事务 

    4、专案执行 

    5、部门协调 

    6、文件翻译 

    7、员工福利规划 

    看起来就比只写“秘书”要好的多了。 

    二、如果有拥有资格认证,就应该列出,特别是在电脑相关行业,无疑是镀了一层金
。 

    例如: 

    专业认证 

    Microsoft Certified System Engineer 

    Softimage 3.7 Level One Certification 

    三、清楚的提出自己曾有的功劳:      

    简历讲的都是你完成的事迹,例如“我们赢得了……”、“我们完成了……”、
“我们克服了……”这些具体的字眼,不要千篇一律地报流水帐。当然,同事和客户也
公认你有超水准的表现。这些都是你能担当领导大任的明证。 

    四、附上推荐信:这对招聘过程非常有利,因为面谈的劳资双方,彼此相处时间有限
,却又极力讨好对方,面试官常因此深恐做出不智的判断。如果这时能有和你相处已久的
人,提供中肯的意见,真是再好也不过了。 

    谈待遇时的忌讳 

    专家站长表示,与其说关心待遇,倒不如先关心面试的表现。如果面试表现不好,怎
么可能获得好待遇呢?以下是几个常犯的错误: 

    错误一:让人觉得你不重视面谈  

    你也许觉得这次面谈只是先来看看,但对公司来说,你是来应聘工作的,他们希望知
道你有意争取这份工作,相信你胜任应无问题。所以,绝对别说你必须提前结束面谈去办
事,更不要在面谈中间打电话或接电话。如果你让人觉得不重视面谈,却对谈价钱很有精
神,主考官绝对不会理你。 

    有的公司在面谈前会先要求你填他们的制式表格,虽然麻烦,但是如果这是一家你感
兴趣的公司,还是“入境随俗”的好。这是表示你重视他们的规定,也很有诚意来面试,
如果对这个过程嫌麻烦,可能会失去你们唯一互相了解的机会。 

    错误二:穿着不整洁      

    你脑袋里在想什么,会经由各种不同的方式表达出来。沟通不仅仅局限于语言这一个
管道而已。有些专家坚持衣着要光鲜,仪容要整洁,保持成功者的相貌,让你在求职时就
呈现出一副已经走马上任的气势。      

    这时,传达出来的讯息是什么?“我认为我绝对能够胜任这份工作。”

    内心的讯息同时也可以以其他的方式来传达:  

      ■端正的姿势  

      ■握手坚定  

      ■步伐自信 

        ■ 镇静自若的外观(即双手交握置膝,而不是不安地拨弄文件或衣裳)。   

    禁忌三:打肿脸充胖子,不具备雇主需要的能力却膨胀自己 

    如果你资历过人,对产业状况了若指掌,又具备该职位所需的科技知识,更是如虎添
翼,这时,就可以要求一个合理的薪水。总之,要求待遇必须脚踏实地,不会眼高手低。
如果不是你熟悉的领域,绝对不要打肿脸充胖子。因为,人家付你多少钱,就会要求多少
的回馈;如果你要求的过火,即使一时得到了雇主的信任而得到工作,实际上事后很快的
就会造成雇主的失望,当然也可能很快的离职

“你的薪酬要求是多少?” 一般说,让你去“面试”的单位和你在此没有很大的谈
判余地,除非你是对方急需的人才。因此,你只消说说各单位都有自己的规矩,表示自己
会入乡随俗,薪水要经过工作实践来确定。这样,既回避了相对敏感的问题,也体现了你
的修养。 

  “你如何看待本单位?” 有的应聘者在遇到这样的问题时,总是显得很焦急,侃侃
而谈什么“贵单位是我的理想所在”、“这个单位条件好,有发展前途”、“这是个举世
闻名的企业”等。但是,一味地赞颂是不明智的,对方会认为你花拳绣脚没有真本事。其
实,客观地说一说你的观感和印象,是有益的;而当你要说到对方的弊端或缺陷时,不要
一味否定,以“若在某一方面再加注意也许会有较大的改善”结束话题,会让人觉得你有
观察力,又有宽宏大量的气度和改善面貌的能力。 

  “你如何看待你所应聘的岗位?” 通常,各个岗位在责任、权力、利益、分工、合
作、技能、技巧等方面,都有明显的要求,“万金油”式的人越来越不被看好。所以,你
不能说“我能干这也能干那”,而应该明确自己的力所能及。有人往往未详细了解岗位的
具体要求就仓促应允,以为自己什么都干得了,这容易招致对方反感。你只需按照单位的
规定行事即可。 

  “你如何证明自己是最优秀的?” 你说自己是最优秀的,会被认为是夜郎自大;而
你说自己不是最优秀的,又会被认为是缺乏自信心;你回避不答,则可能被认为是没有考
虑或是对对方不够尊重。这时,你最好回答:“以我所受过的良好教育以及此前的经验,
能够胜任这项工作,为单位的发展尽力。” 

  “你有什么业余爱好?” 如果一个人下班后就知道柴米油盐,那么他应该是个家务
型的人,缺乏情趣和格调,也许会是难以沟通的人。过于重视业余生活的人,也会有太爱
吃喝玩乐,不务正业的嫌疑。因此,在回答这类问题时,应该不温不火,既要显示自己的
情调与修养,又能展现自己的事业心,以此为原则说明实际情况。 

  “你的住处离单位距离如何?” 这也许是在试探你对上班时间和加班的想法。如果
这真是你理想中的单位,而你的住处离此单位又较远,应该在回答中表示会遵守单位规定
的作息时间,按时上下班,如果需要经常加班则可以想办法住得近些,不会影响工作,也
不会给单位增添麻烦。
     希望大家把上面常遇见的问题牢记在心!!