套接字不是传统意义上的数据流

到目前为止,你见过的数据流都一样,不管是连接文件的数据流,还是连接标准输入或输出的数据流,都可以用fprintf()fscanf()与它们通信。但套接字有一点点不同,套接字是双向的,它既可以用作输入也可以用作输出,也就是说要用其他函数和它通信。

如果想向套接字输出数据,就要用send()函数,而不是fprintf()

套接字不是传统意义上的数据流 - 图1

记住:一定要检查系统调用的返回值,send()也不例外。网络错误随处可见,服务器必须处理它们。

套接字不是传统意义上的数据流 - 图2百宝箱

如何选择端口号?

为服务器程序选择端口号时千万要小心。现如今有各式各样的服务器,所以不要选其他程序用过的端口号。在Cygwin和大多数Unix中有一个/etc/services文件,它列出了很多常用服务使用的端口号。在选择端口时必须确保没有其他程序用过。

端口号从0开始一直到65535,首先你需要决定用小号码(1024以下)还是大号码。很多计算机中,只有超级用户或管理员才有资格使用1024号以下的端口,因为小号的端口留给了一些知名服务,如网页服务器和邮件服务器。操作系统只允许管理员使用这些端口,防止普通用户启动一些多余的服务。

通常情况下,请使用1024号以上的端口。

 

套接字不是传统意义上的数据流 - 图3磨笔上阵

下面这个服务器会为已连接的客户端随机提出忠告,但它少了很多系统调用。你需要把它们补全。再有,程序向客户端发送一条忠告,然后就结束了。其中有一段代码需要循环执行,请问是哪段?

套接字不是传统意义上的数据流 - 图4

 

套接字不是传统意义上的数据流 - 图5磨笔上阵解答

下面这个服务器会为已连接的客户端随机提出忠告,但它少了很多系统调用。你需要把它们补全。再有,程序向客户端发送一条忠告,然后就结束了。其中有一段代码需要循环执行,请问是哪段?

套接字不是传统意义上的数据流 - 图6

套接字不是传统意义上的数据流 - 图7试驾

编译服务器,看看会发生什么。

套接字不是传统意义上的数据流 - 图8

趁服务器还在运行,我们打开另一个控制台,用telnet连接几次试试。

套接字不是传统意义上的数据流 - 图9

太好了,服务器正确运行了,你用127.0.0.1作为IP地址,因为客户端和服务器在同一台机器上运行。你也可以从其他地方连接服务器,我们将得到同样的答复。

套接字不是传统意义上的数据流 - 图10