对于UDP的一个应用,我们已经说过了它的UDPClient和UDPServer的具体建立过程了。接下来,这里我们来运行一下我们的例子吧。看看具体的运行结果。
运行例子程序
1、编译例子程序
使用如下命令来编译例子程序:
- gcc -Wall -o udpserv udpserv.c
- gcc -Wall -o udpclient udpclient.c
编译完成生成了udpserv和udpclient两个可执行程序。
2、运行UDPServer程序
执行。/udpserv &命令来启动服务程序。我们可以使用netstat -ln命令来观察服务程序绑定的IP地址和端口,部分输出信息如下:
- Active Internet connections (only servers)
- Proto Recv-Q Send-Q Local Address Foreign Address State
- tcp 0 0 0.0.0.0:32768 0.0.0.0:* LISTEN
- tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN
- tcp 0 0 0.0.0.0:6000 0.0.0.0:* LISTEN
- tcp 0 0 127.0.0.1:631 0.0.0.0:* LISTEN
- udp 0 0 0.0.0.0:32768 0.0.0.0:*
- udp 0 0 0.0.0.0:8888 0.0.0.0:*
- udp 0 0 0.0.0.0:111 0.0.0.0:*
- udp 0 0 0.0.0.0:882 0.0.0.0:*
可以看到udp处有“0.0.0.0:8888”的内容,说明服务程序已经正常运行,可以接收主机上任何IP地址且端口为8888的数据。
如果这时再执行。/udpserv &命令,就会看到如下信息:
- bind error: Address already in use
说明已经有一个服务程序在运行了。
运行UDP Client程序
执行。/udpclient 127.0.0.1命令来启动客户程序,使用127.0.0.1来连接服务程序,执行效果如下:
- Hello, World!
- Hello, World!
- this is a test
- this is a test
- ^d
输入的数据都正确从服务程序返回了,按ctrl+d可以结束输入,退出程序。
如果服务程序没有启动,而执行客户程序,就会看到如下信息:
- $ ./udpclient 127.0.0.1
- test
- read error: Connection refused
说明指定的IP地址和端口没有服务程序绑定,客户程序就退出了。这就是使用connect()的好处,注意,这里错误信息是在向服务程序发送数据后收到的,而不是在调用connect()时。如果使用tcpdump程序来抓包,会发现收到的是ICMP的错误信息。