原创 学习Tcl(四)——UDP收发包

2007-9-14 22:21 7505 9 13 分类: FPGA/CPLD

    这些天在编一个windows操作系统下接收和发送UDP包的程序,由于我C语言编程基础差,时间又紧,所以选择了Tcl作为编程语言。 riple


    在手头一本Tcl编程的书中查找了一下,只有TCP套接字编程的指导,没有UDP的相关内容。 riple


    眼前没有,只好到Tcl Developer Xchange上“大海捞针”一下。相关的内容还真不少,顺着前面几个链接,我终于找到了UDP相关的内容。到Xchange上搜索,真是一个学习、开发Tcl的好方法。 riple


    在Tcl的标准发布包内是没有直接对UDP操作的命令的,需要下载一个TclUDP包,在程序中包含这个包即可。 riple


    经过两天的分解、重组、拷贝、粘贴、尝试和失败,终于把示例程序中提供的程序修改成了我需要的能够连续接收、响应的简单UDP服务器程序。 riple


    Tcl编程中的高级功能(如加载包、事件驱动编程、套接字编程)和几个重要但是难懂的操作(如从用户输入中提取参数、列表操作),以前我是敬而远之的,这次也不得不硬着头皮一一“磨”了下来。学习一门编程语言还是要“躬行”才能学得快啊。 riple


    现在看来,当初觉得很难的UDP网络收发包也不是那么难。分析清楚了,和Tcl下对文件的操作差不多 riple


   


    从本机特定端口向目标机特定端口发送特定包的程序:udp_send.tcl


package require udp 1.0.6


proc Event {sock} {
    global forever
    global pkt
    global peer
    set pkt [read $sock]
    set peer [fconfigure $sock -peer]
    puts "Received [string length $pkt] from $peer\n$pkt"
    set forever 1
    return
}


set forever 0
# parse input arguments
if {[lindex $argv 2]    == ""} {
    puts "\n"
    puts "usage: quartus_sh -t udp_send.tcl -srcport -host -desport -msg"
    puts "\n"
} else {
  # parse input arguments
    set srcport [lindex $argv 0]
    set host    [lindex $argv 1]
    set desport [lindex $argv 2]
    set msg     [lindex $argv 3]
  # open udp   
    set s [udp_open $srcport]
    fconfigure $s -blocking 0 -buffering none -translation binary \
        -remote [list $host $desport]
    fileevent $s readable [list Event $s]
  # send message
    if {$msg == {}} {
        for {set i 0} {$i < 512} {incr i 1} {
        append loop_hello "hello"
        }
        puts -nonewline $s $loop_hello
    } else {
        puts -nonewline $s $msg
   
    }
  # close udp
    close $s
}


    监听本机特定端口UDP包,接受后根据发送机IP和端口返回特定信息的程序:udp_reply.tcl


package require udp 1.0.6


proc Event {sock} {
    global forever
    global pkt
    global peer
    set pkt [read $sock]
    set peer [fconfigure $sock -peer]
    puts "Received [string length $pkt] from $peer\n$pkt"
    set forever 1
    return
}


set forever 0


# parse input arguments
  if {[lindex $argv 0] == ""} {
    puts "\n"
    puts "usage: quartus_sh -t udp_reply.tcl -port"
    puts "\n"
  } else {
    # open udp
      set s [udp_open [lindex $argv 0]]
      fconfigure $s -blocking 0 -buffering none -translation binary
   
    # listen to required port
      puts "\n"
      puts "listenning to local port [lindex $argv 0]"
      fileevent $s readable [list Event $s]
      vwait ::forever
     
    # reply to sender host and port
      fconfigure $s -remote [list [lindex $peer 0]  [lindex $peer 1]]
      puts  -nonewline $s hello
      puts "replied remote peer $peer"
      puts "\n"
   
    # close udp
      close $s
  }

文章评论4条评论)

登录后参与讨论

用户122827 2007-11-26 20:50

大家有没有学习Tcl的资料啊?

ash_riple_768180695 2007-10-12 09:36

是啊,还有modelsim的脚本,也是Tcl类型的。能够有人一起讨论,还是很高兴的。Tcl作为一种方便快捷的编程语言,很适合我们硬件工程师使用。

用户37412 2007-10-11 21:24

今天仔细的看了看Lattice以及Xilinx生成的工程Tcl文件,才发现这个真的很有用

看来是要好好学学了

到时候一起讨论啊

 

用户1499147 2007-9-25 21:28

^_^, 容易,终于碰见一个喜欢玩tcl的了。

用户48957 2006-11-9 21:41

同感啊

用户1053025 2006-10-31 15:05

深蓝,转这个是因为有同感?北京本来就是这样。等他的房子升值了,就该心花怒放了
相关推荐阅读
ash_riple_768180695 2015-12-18 11:06
学习示例程序:FPGA快速系统原型设计--敏捷实践
        学习与开发板配套的示例程序,是敏捷实践的起点。示例程序是厂商针对开发板上提供的硬件资源和接口量身定做的工程,可以展示其FPGA芯片的功能和性能特点。从示例程序入手最大的好处就是:示...
ash_riple_768180695 2015-11-03 16:46
开发板选取:FPGA快速系统原型设计--敏捷实践
    既然是“实践”,就不能只谈编码和仿真,必须要上板运行、调试。这个虚拟项目的目标是实现一块兼容Intel82574L以太网控制器的千兆网卡,需要运行在一块具备PCIe接口和10/100/10...
ash_riple_768180695 2015-10-22 12:41
开篇:FPGA快速系统原型设计--敏捷实践
    虽然借用了 “系统原型开发”的标题,本系列文章将围绕FPGA IP级别的开发这个主题展开,如果可能的话,将扩展至FPGA System级别的开发。     先上一篇PPT:RSPwFP...
ash_riple_768180695 2013-08-26 10:21
学习SystemVerilog(二)——学习它的理由
    学习SystemVerilog的理由也很多,我在阅读SystemVerilog for Design 和 SystemVerilog for Verification两本书前言的过程中,总...
ash_riple_768180695 2013-08-26 10:19
学习SystemVerilog(一)——不学习它的理由
    想要学习SystemVerilog已经很久了。曾经尝试通过Accellera网站上给出的LRM学习,怎奈内容众多,找不出入手点和重点,只能望而却步。虽然手头有三本SystemVerilog...
ash_riple_768180695 2011-06-26 23:20
Hardware-Assisted IEEE1588 Implementation Analysis
06/18/11 11:00:05 PM         最近一段时间在研究IEEE1588-2008精确时间同步协议(PTP)。该协议可以在软件中实现,如果需要提高时间同步...
我要评论
4
9
关闭 站长推荐上一条 /2 下一条