一: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通道是阻塞的。gets或read将会一直等待到数据可用时才返回。如果通道还没有准备好接收数据,puts也会等待。在使用网络套接字时,阻塞特性就可能使应用程序挂起,所以一般用-blocking 0设置成非阻塞模式。在没有数据时,gets或read会立刻返回。
在默认情况下,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条评论)
登录后参与讨论