由adsl多拨信号量机制探讨

网上看到一篇文章.通过修改pppd源码来实现adsl多拨的目的.由此引发了我对进程间同步的兴趣.于是研究了一番linux下进程间同步.

是这样的应用场景,在pppoe最后的阶段,客户端response给服务器的最后阶段,如果有多个pppd进行拨号.同时进行到这一阶段而同时把最后的response发送给服务器.就可以多拨成功.所以问题的关键就是多进程的同步.涉及到以下几个系统调用

一. int semget(key_t key, int nsems, int semflg);

1. key_t key,其它进程得到这个信号量需要这个key,一般用ftok来生成

#define KEY_PATH /path/to/file

#define KEY_PRI_NUM

int sem_key;

sem_key = ftok(KEY_PATH, KEY_PRI_NUM);

返回信号量的标识符

2. int nsems,信号量集包含的信号量的个数,这里是1

3. int sem_flg, 标志位.可以是IPC_CREAT,IPC_EXCL,如果设置了IPC_EXCL,则对于已经存在的信号量会返回错误,如果只设了IPC_CREAT对于已经存在的会返回当前信号量标识符,如果不存在则会创建信号号集,并返回标识符

二. int semctl(int semid, int semnum, int cmd,…)

1. int semid,信号量的标识符

2. int semnum,信号量在信号量集中偏移位置

3. int cmd,这个是你想要执行的命令,可以用来获取信号量的状态,我的需求是设置信号量的值,所以cmd就为SETVAL,

4.第4个参数是根据cmd的值来设置的。如果cmd是GETVAL,则不需要第四个参数,如果是SETVAL则调用程序需要声明以下联合体

union semun {

int val; /* Value for SETVAL */

struct semid_ds *buf; /* Buffer for IPC_STAT, IPC_SET */

unsigned short *array; /* Array for GETALL, SETALL */

struct seminfo *__buf; /* Buffer for IPC_INFO

(Linux-specific) */

};

三 int semop(int semid, struct sembuf *sops, unsigned nsops)

1. semid: 是通过semget获取到的id

2. sembuf

struct sembuf {

unsigned short sem_num; /* semaphore number */

short sem_op; /* semaphore operation */

short sem_flg; /* operation flags */

}

如果sem_op为0,则是一个等待信号量为0的过程。 当信号量的值为0时。程序就会继续执行。

写了一个小程序。模拟这个过程:

sem.c

#include <stdio.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>

#define KEY_PATH "/usr/bin/"
#define KEY_PRI 123

#define SEM_NUM 1

key_t key;

union semun {
int              val;    /* Value for SETVAL */
struct semid_ds *buf;    /* Buffer for IPC_STAT, IPC_SET */
unsigned short  *array;  /* Array for GETALL, SETALL */
struct seminfo  *__buf;  /* Buffer for IPC_INFO (Linux-specific) */
};

union semun arg;
int main(int argc, char* argv[]) {
int sem_id;
int ret;
key = ftok(KEY_PATH, KEY_PRI);
if (-1 == key) {
perror("fail to get key\n");
return -1;
}

sem_id = semget(key, SEM_NUM, IPC_CREAT|0660);
if (-1 == sem_id) {
perror("fail semget\n");
return -1;
}

arg.val = 5;
//incre 5
ret = semctl(sem_id, 0, SETVAL, arg);
if (-1 == ret) {
perror("fail semctl\n");
return -1;
}

sleep(1000);
return 0;
}

sem_c.c

#include <stdio.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>

#define KEY_PATH "/usr/bin/"
#define KEY_PRI 123

#define SEM_NUM 1

key_t key;

struct sembuf sb={0, -1, 0};

int main(int argc, char* argv[]) {
int sem_id;
int ret;
key = ftok(KEY_PATH, KEY_PRI);
if (-1 == key) {
perror("fail to get key\n");
return -1;
}

sem_id = semget(key, SEM_NUM, IPC_CREAT|0660);
if (-1 == sem_id) {
perror("fail semget\n");
return -1;
}

ret = semctl(sem_id, 0, GETVAL);
if (-1 == ret) {
perror("semctl fail\n");
return -1;
}

printf("semct: %d\n", ret);
//decrement
ret = semop(sem_id, &amp;sb, 1);
if (-1 == ret) {
perror("semop fail\n");
return -1;
}

//wait for 0
sb.sem_op = 0;
ret = semop(sem_id, &amp;sb, 1);
if (-1 == ret) {
perror("semop fail\n");
return -1;
}

printf("ha");

return 0;
}

找房间号.

路由器那点破事儿
最近写了一个自动pin别人家路由器的脚本,破解出来还可以给我发邮件提醒哦…,网卡插到raspberry pi一刻不停的在扫描着..
今天晚上到家的时候破解出来一个路由器.但是我想知道这个路由器是在哪个房间.我为什么可以知道具体的房间..听我慢慢说来,
话说,上周,一不小心进了网管的pppoe服务器的管理系统.admin/admin.还带ssh远程管理..真的是一不小心进去的……
所以呢.什么pppoe的账号密码了.我就统统拷贝了下来…嗯..然后我就退出来了…
这个账号的规则就是’前缀+区+房间号’,例我的就是’yje1042′,e1区42号..pin出来别人的路由器后呢.我就进到路由器的管理界面看看他的adsl账号
是什么就可以确定这个路由器所在的房间了…虽然路由器里看不到密码.但是.我已经从服务器上全部拷出来了..哇哈哈…
但是今天破解出来的这个路由器管理密码修改了.不是默认的admin/admin了.我又想知道它所在房间号..怎么办?

网管pppoe系统的可以看到在线用户的账号与ip地址的对应关系…这就好办了.连上这台路由器.如果traceroute到被破解的这台路由器的wan口ip(即pppoe服务器分配的ip)
那么traceroute一定会显示出只有一跳,否则,会通过默认网关才能到达目的地…嗯..这就好办了.写个脚本跑一下.就成..我就直接用nmap了..很强大.

nmap -sn 172.18.0.0/24 -n –traceroute
nmap -sn 172.18.1.0/24 -n –traceroute
nmap -sn 172.18.2.0/24 -n –traceroute

Nmap scan report for 172.18.1.182
Host is up (0.46s latency).

TRACEROUTE (using proto 1/icmp)
HOP RTT       ADDRESS
–   Hop 1 is the same as for 172.18.1.7
2   …
3   471.86 ms 172.18.1.182

Nmap scan report for 172.18.1.193
Host is up (1.4s latency).

TRACEROUTE (using proto 1/icmp)
HOP RTT       ADDRESS
1   161.29 ms 172.18.1.193

Nmap scan report for 172.18.1.203
Host is up (0.068s latency).

TRACEROUTE (using proto 1/icmp)
HOP RTT       ADDRESS
–   Hop 1 is the same as for 172.18.1.7
2   …
3   468.19 ms 172.18.1.203

可以看到172.18.1.193的traceroute结果只有一跳…可以确实就是这个ip了..然后去网管系统中查找对应关系就的到账号名了…yeah

yje3041

哈哈..