Chinaunix首页 | 论坛 | 博客
  • 博客访问: 7656587
  • 博文数量: 1770
  • 博客积分: 18684
  • 博客等级: 上将
  • 技术积分: 16357
  • 用 户 组: 普通用户
  • 注册时间: 2010-06-02 10:28
个人简介

啥也没写

文章分类

全部博文(1770)

文章存档

2024年(15)

2023年(44)

2022年(39)

2021年(46)

2020年(43)

2019年(27)

2018年(44)

2017年(50)

2016年(47)

2015年(15)

2014年(21)

2013年(43)

2012年(143)

2011年(228)

2010年(263)

2009年(384)

2008年(246)

2007年(30)

2006年(38)

2005年(2)

2004年(1)

分类:

2008-05-19 17:36:45

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
#include
#include
#include
#include
#include
#include
#include

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

阅读(1878) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

chinaunix网友2008-07-29 22:59:33

抄我的东西我不介意,因为本身也没啥技术含量。但请抄的时候把内容抄完整,以免让阅读的人少读了内容。我的原文里是有一个文章的连接的。 http://blog.vetcafe.net/2008/04/packudppython.html