原创 Tcl UDP 的运用

2008-11-17 17:47 4501 4 4 分类: 通信

一:Tcl UDP extension


Tcl UDP extension(最新的UD<?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" />P 1.0.9可在http://sourceforge.net/projects/tcludp下载),该扩展包支持通过TCL来控制UDP套接字。UDP套接字与其它Socket命令一样,先打开指定的主机地址和端口号的套接字,然后用read gests命令和puts命令,读出/写入数据流,最后用close命令关闭套接字。


  Tcl UDP扩展包中,提供了下面几个命令。


udp_open ?port?


fconfigure sock ?-myport? ?-remote? ?-peer? ?-broadcast bool? ?-ttl count?


fconfigure ?-mcastadd groupaddr?


fconfigure ?-mcastdrop groupaddr?


其中:


udp_conf sock ?-myport? ?-remote? ?-peer? ?-broadcast bool? ?-ttl count?


-myport


Returns the local port number of the socket. 用来返回本地正使用的套接字的端口号。


-remote


Returns the remote hostname and port number as set using udp_conf sock host port。如果后面指明了地址和端口号,则把该地址和端口号配置成远端主机的地址和端口号;如没有指明,则返回远端主机的地址和端口号。一般用来指定待要通信的远端主机的地址和端口号,或查询与本地通信的远端主机的地址和端口号。<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />


-peer


Returns the remote hostname and port number for the packet most recently received by this socket。返回最近与本地通信的远端主机的地址和端口号。


 


二:UDP套接字也可看作文件或管道


。则可用fconfigure命令设置或查询多种I/O通道的属性。fconfigure channelId name value ?name value ...? 比较常用的选项为:


-blocking boolean


-buffering newValue


-buffersize newSize


-encoding name


-translation {inMode outMode}


默认情况下,I/O通道是阻塞的。getsread将会一直等待到数据可用时才返回。如果通道还没有准备好接收数据,puts也会等待。在使用网络套接字时,阻塞特性就可能使应用程序挂起,所以一般用-blocking 0设置成非阻塞模式。在没有数据时,getsread会立刻返回。


在默认情况下,Tcl会进行数据缓冲,这样I/O会更有效,对底层设备的存取频度就会少一些,因此开销也少一些。但在某些情况下,要立即得到数据,缓冲就会碍事,可用-buffering none来关闭缓冲。有时默认情况下的,数据缓冲大小不定,这时就需要指定缓冲数据大小,用-buffersize number来给随后的I/O通道分配缓冲空间(单位大小为字节)。


三:UDP的运用。


 关于UDP的运用(比如server的搭建)见http://tcludp.sourceforge.net/ http://wiki.tcl.tk/8493


  UDP最大能传4096bytes的有效数据包。而我的一个项目中需要一次传32K的数据再加几个字节的上层协议的包头。怎么办?做硬件的对软件相当不熟悉,只有按部就班了,下源码,然后按修改相关参数,按照readme编译下即可了。在源码的generic文件夹有一个udp_tcl.c文件,打开找到#define MAXBUFFERSIZE 4096,修改成#define MAXBUFFERSIZE 32828,就可以了。


接下来,加载该重新编译的UDP包。运行程序。发现还是只能接收/传输4096bytes。可明明修改MAXBUFFERSIZE的参数了呀。到处找问题。还是不行。一次偶然的原因终于找到错误了。


在一般的例子里:                      


set s [udp_open $port]


fconfigure $s -blocking 0 -translation binary  -buffering none


上面提到UDP套接字也可看作文件或管道,这时还得设置管道的缓冲空间大小。即:fconfigure $s -blocking 0 -translation binary  -buffering none -buffersize 32828。这时,再运行程序就发现可以接收/发送32828 bytes的数据包了。


至于为什么要设置管道的缓冲空间大小,我想可能是默认的缓冲空间大小比较小吧。???

文章评论0条评论)

登录后参与讨论
我要评论
0
4
关闭 站长推荐上一条 /2 下一条