免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3399 | 回复: 1
打印 上一主题 下一主题

用pack实现UDP包在PYTHON与C结构体透明通信 [复制链接]

论坛徽章:
2
2015年辞旧岁徽章
日期:2015-03-03 16:54:1515-16赛季CBA联赛之上海
日期:2016-05-05 09:45:14
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-05-19 17:36 |只看该作者 |倒序浏览

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


本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u/249/showart_694581.html

论坛徽章:
0
2 [报告]
发表于 2008-07-29 22:58 |只看该作者
抄我的东西我不介意,因为本身也没啥技术含量。但请抄的时候把内容抄完整,以免让阅读的人少读了内容。我的原文里是有一个文章的连接的。

http://blog.vetcafe.net/2008/04/packudppython.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP