TCL脚本语言学习

TCL是一种脚本语言,它几乎可以在全部平台上运行,可移植行很强。
TCL语言设计的目的是提供程序与其他程序之间进行交互的功能,也是作为一个可嵌入的翻译互相作用的能力。
开发简单,上手快。

TCL输入输出

1
2
3
4
5
6
7
8
9
10
#!/usr/bin/tclsh
#默认输出到标准输出流
puts hello
puts stdout hello
#输出到标准错误流
puts stderr error
#输入必须指定输入流
gets stdin varible
puts $varible

TCL文件读写操作

1
2
3
4
5
6
7
8
9
#打开data文件,打开模式有r,w,a,r+,w+,a+
set fp [open data w]
puts $fp "hello world"
close $fp
set fp [open data r]
gets $fp test
puts $test
close $fp

TCL数据类型

TCL变量不需要声明,可以直接使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# TCL对象,对于整数,浮点数,bool,字符串,都是一个对象
#可直接给其赋值
set varible 1
set s "hello world"
# 列表,列表初始化时可以使用双引号或者大括号进行初始化
set list {hello world hah hah}
set list "hello world hah hah"
#访问列表元素,使用lindex
puts [lindex $list 0] #hello
#关联数组,类似map,key可以是数字,也可以是字符串
set map(a) 10
puts $map(a)

TCL条件控制语句

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# if语句
if {expression1} {
dosomting
} elseif {expression2} {
dosometing
} else {
dosomething
}
#for 语句
for {set a 10} {$a < 20} {incr a} {
dosometing
}
#switch语句
switch switchingString {
matchString1 {
body1
}
matchString2 {
body2
}
matchStringn {
bodyn
}
}

运算符的优先级

分类 操作符 关联
Unary + - Right to left
Multiplicative * / % Left to right
Additive + - Left to right
Shift << >> Left to right
Relational < <= > >= Left to right
Equality == != Left to right
Bitwise AND & Left to right
Bitwise XOR ^ Left to right
Bitwise OR Left to right
Logical AND && Left to right
Logical OR || Left to right
Ternary ?: Right to left

Comment and share

Unix网络编程相关错误码和信号处理

特别注意当出现一下错误码时,处理之后一定要将errno复位为0

在网络编程的过程中会出现一些错误码,下面总结:

  • EAGAIN(11) : Resource temporarily unavailable

    • 错误原因:当将套接字设置为异步时,由于函数调用之后是立即返回的,所以会出现两种情况导致这个错误:(1):当调用read函数,此时没有数据可读,此时read函数会立即返回错误码EAGAIN表示此时无数据可读(2):当调用write函数,此时缓冲区满,write函数将会立即返回错误码EAGAIN。
    • 解决方法:EAGAIN错误表示此时无数据可读或者缓冲区已满,所以此时只需要重试即可。
  • ECONNRESET(104):Connection reset by peer

    • 错误原因:当对端socket已关闭,此时调用read或write函数将返回ECONNRESET错误,在之后如果继续调用read或write,就会得到该错误。常见的原因是发送端接收端实现约定好的数据长度不一致,若接收端被通知需要接收99个字节,而服务端发送了100个字节给接收端,这样一来,接收端接收99个字节就执行了close操作,如果发送端继续发送,接收端将向发送端返回一个RESET信号
  • EALREADY (114):Operation already in progress

    • 错误原因:套接字为非阻塞套接字,并且原来的链接请求还未完成
  • EINPROGRESS(115):Operation in progress

    • 错误原因:套接字为非阻塞套接字,连接正在建立

网络编程相关信号

  • SIGPIPE(13):管道破裂。管道另一端没有进程接收数据,导致管道破裂而崩溃。对一个对端已经关闭的socket进行两次write,第二次调用将会产生该信号,此信号的默认行为是结束进程
    • 解决方法:将该信号的处理函数设置为SIG_IGN,即忽略此信号

Comment and share

Unix网络函数与TCP状态转变之间的关系

connect函数导致状态转变

client状态变化:

connect函数导致当前client套接字从CLOSED(初始状态)转移到SYN_SENT状态,若成功则再转移到ESTIBLISHED状态,若失败,则回到CLOSED状态

server TCP状态变化:

当client发送SYN分节,server接收成功并返回SYN分节之后,server套接字将从LISTEN状态转移到SYN_RCVD状态,server发送SYN分节之后,client返回ACK到server,Server套接字状态从SYN_RCVD状态转变为ESTIBLISHED状态。

注意:若connect失败,必须调用close函数将当前socket关闭,不可再次调用connect函数。若需重试,则关闭后重新创建socket进行connect操作

listen函数导致状态转变

listen函数把一个未连接的套接字转换成一个被动套接字,调用listen导致套接字从CLOSED状态转变为LISTENED状态

Comment and share

netstat命令使用详解

netstat命令用于显示各种网络信息,如当前机器的网络连接状态,路由表,接口状态等等。

基本信息

执行netstat命令,其结果主要包括两个部分。

  • Active Internet connections (servers and established),称为有源TCP链接,包括TCP和UDP等的详细状态
  • Active UNIX domain sockets (servers and established)。称为有源Unix域套接口。

示例:

1
2
3
4
5
6
7
8
9
10
$netstat -a
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 2 xx.xx.xx.xx:telnet ss.ss.ss.ss:port ESTABLISHED
...
Active UNIX domain sockets (servers and established)
Proto RefCnt Flags Type State I-Node Path
unix 2 [ ACC ] STREAM LISTENING 6474 /var/run/test.socket
...

有源TCP链接字段详解:

  • Proto : 当前链接的协议。如TCP,UDP
  • Recv-Q : 网络接收队列
  • Send-Q : 网络发送队列
  • Local Address : 本机的ip:端口(注意此处127.0.0.1默认显示主机名,0.0.0.0默认显示*,端口可能显示别名。若强制显示数字,加-n参数)
  • Foreign Address:对端IP:端口。与local address规则相同
  • State : 当前套接字的网络状态。

有源Unix域套接口字段详解

  • proto : 当前链接的协议,一般为Unix
  • RefCnt : 连接段本端口上的进程号
  • Type:套接字的类型,stream或 DGRAM
  • state : 当前套接字的状态
  • I-Node : 当前socket对应的inode号
  • Path : 连接到套接口的其它进程使用的路径名。

netstat常用参数

  • -a : 显示所有选项
  • -t : 显示所有与TCP相关的选项
  • -u : 显示所有与UDP相关的选项
  • -x : 显示所有与Unix域相关的套接字选项
  • -n : 拒绝显示别名,能显示数字的全部转换为数字显示
  • -p : 显示建立相关连接的程序名。
  • -l : 显示所有状态为Listen的连接
  • -e : 显示扩展信息,如当前链接所对应的用户
  • -c : 间隔一段时间执行一次netstat命令。
  • -s : 显示统计信息。对每种类型进行汇总

netstat常用组合

  • netstat -anp : 显示所有的网络连接,并拒绝显示别名,同时打印该连接对应的程序名
  • netstat -lt : 显示所有正在监听状态的tcp连接
  • netstat -lu : 显示所有正在监听状态的udp连接

Comment and share

  • page 1 of 1

魏传柳(2824759538@qq.com)

author.bio


Tencent


ShenZhen,China