套接字不是传统意义上的数据流
到目前为止,你见过的数据流都一样,不管是连接文件的数据流,还是连接标准输入或输出的数据流,都可以用fprintf()
和fscanf()
与它们通信。但套接字有一点点不同,套接字是双向的,它既可以用作输入也可以用作输出,也就是说要用其他函数和它通信。
如果想向套接字输出数据,就要用send()
函数,而不是fprintf()
。
记住:一定要检查系统调用的返回值,send()
也不例外。网络错误随处可见,服务器必须处理它们。
百宝箱
如何选择端口号?
为服务器程序选择端口号时千万要小心。现如今有各式各样的服务器,所以不要选其他程序用过的端口号。在Cygwin和大多数Unix中有一个/etc/services文件,它列出了很多常用服务使用的端口号。在选择端口时必须确保没有其他程序用过。
端口号从0开始一直到65535,首先你需要决定用小号码(1024以下)还是大号码。很多计算机中,只有超级用户或管理员才有资格使用1024号以下的端口,因为小号的端口留给了一些知名服务,如网页服务器和邮件服务器。操作系统只允许管理员使用这些端口,防止普通用户启动一些多余的服务。
通常情况下,请使用1024号以上的端口。
磨笔上阵
下面这个服务器会为已连接的客户端随机提出忠告,但它少了很多系统调用。你需要把它们补全。再有,程序向客户端发送一条忠告,然后就结束了。其中有一段代码需要循环执行,请问是哪段?
磨笔上阵解答
下面这个服务器会为已连接的客户端随机提出忠告,但它少了很多系统调用。你需要把它们补全。再有,程序向客户端发送一条忠告,然后就结束了。其中有一段代码需要循环执行,请问是哪段?
试驾
编译服务器,看看会发生什么。
趁服务器还在运行,我们打开另一个控制台,用telnet连接几次试试。
太好了,服务器正确运行了,你用127.0.0.1作为IP地址,因为客户端和服务器在同一台机器上运行。你也可以从其他地方连接服务器,我们将得到同样的答复。