« 2008年03月 | 首页 | 2008年06月 »

2008年04月30日

用pack实现UDP包在PYTHON与C结构体透明通信

  Python是一个好东西,是如此的适合写身边的一些小toolkit。测试程序就是其中一例。比如用C写了一个server,就可以用python写一个client来测试这个server。但遇到一个小问题,就是在UDP传输的时候UDP包中信息的各个字段是用结构体定义的。但Python本身是模糊类型的动态语言,怎么样才能构造UDP包的时候符合C语言结构体的结构呢。Yahoo search找到这篇文章,才想起来perl和php也是有这个pack函数的,以前看到这个函数的时候都是略过,没想到有啥具体用处。看来自己还是一根墙上芦苇啊,BS自己一下。

顺便改出两段简陋的code来说明这个问题.

/*
 * udpsrv.c
 * 
 * The test udp server, source code is stolen from UNP 3ed ED.
 *
 */

#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <strings.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>

typedef struct my_data
{
	char name[10];
	int age;
	float score;
} MY_DATA;

void dg_echo(int, struct sockaddr *, socklen_t);

int
main(int argc, char **argv)
{
	int                                   sockfd;
	struct sockaddr_in              svraddr, cliaddr;

	sockfd = socket(AF_INET, SOCK_DGRAM, 0);
	bzero(&svraddr, sizeof(svraddr));
	svraddr.sin_family = AF_INET;
	svraddr.sin_addr.s_addr = htonl(INADDR_ANY);
	svraddr.sin_port = htons(3000);

	bind(sockfd, (struct sockaddr *) &svraddr, sizeof(svraddr));
	dg_echo(sockfd, (struct sockaddr *) &cliaddr, sizeof(cliaddr));

}

void
dg_echo(int sockfd, struct sockaddr *pcliaddr, socklen_t clilen)
{
	int                  n;
	socklen_t         len;
	MY_DATA         mydata;

	bzero(&mydata, sizeof(MY_DATA));

	for( ; ; ) {
		len = clilen;
		n   = recvfrom(sockfd, &mydata, sizeof(MY_DATA), 0, pcliaddr, &len);
		printf("Name:%s\tAge:%d\tScore:%f\n", mydata.name, mydata.age, mydata.score);
	}

}


#!/usr/bin/python

# Filename: udpcli.py

# a simple udp client

import socket, struct

hostname = 'localhost'
port = 3000

host = socket.gethostbyname(hostname)

name = 'sleetdrop'
age = 18
score = 100

buf = struct.pack("10sif", name, age, score)

s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.sendto(buf, (host, port))


在linux上编译并起动udp服务器
$gcc udpsrv.c -o udpsrv
$./udpsrv

在另一个term执行
$python udpcli.py

在服务器所在term会得到如下输出:
Name:sleetdrop  Age:18  Score:100.000000


2008年04月29日

网络监视工具NTOP

  网络流量的监测是服务器和网络设备使用中常见的需求,在多服务器的环境下大多使用MRTG或者CACTI. 类似这样的软件还有很多,如:Nagioszenoss, hyperic hq, jffnms等。

  这些工具大多通过snmp取得服务器或网络设备的信息,不仅有网络流量,同时也可以监控服务器负载,应用服务健康状况,通过自写脚本实现多种监控。并通过类似RRDtool的绘图工具绘制图表以web界面展示给使用者。大多需要在被监控服务器上配置snmp,然后再在一台服务器(LAMP)上采集信息绘制图表。

  而本文要简单介绍的NTOP是一款专门监控网络流量的软件,同样使用RRDtool绘制图表,但它本身不需要配置snmp和web服务器。在本机安装起动后直接可以用浏览器访问3000端口访问查询和管理界面,支持用户权限管理和插件。并且有着详细的网络状态信息。它也支持把一些统计数据输出为php,python,perl等语言的数组,这样可以很方便的在自己的程序里取到数据。如果你想对单台的服务器的网络状态进行监控,比如在压力测试时。并且你对tcpdump这样的工具不太感冒。可以尝试一下这个方便的工具。

偶遇百度错误页

  因为对于国内虚拟主机价格与国外如Deamhost等提供商的价格相比造成的心理不平衡,我在Baidu里输入“国内空间 太贵”,居然得到如下页面,找旁边的朋友测试也返回同样的页面。不过过几分钟就正常了。
  认识Baidu也有好多年了,这还是第一次撞见。

baidubug

2008年04月01日

蝶恋花 难眠--中学日记之二

(1998年9月上旬 个人日记98-99年本 后数第28页)

蝶恋花

      --难眠

孤枕独榻夜难眠,
数点秋岁,
盈盈一水间。
暖棉裹身心愈寒,
唯与飞星诉贫欢!

辗转难饮梦江水,
午夜轻歌,
幽咽无声泪。
万般惆怅随风翚,
撕碎情花卜错对。