从客户端读取数据

你已经会向客户端发消息了,那怎么从客户端读取数据呢?套接字用send()写数据,用recv()读数据:

  1. <读了几个字节> = recv(<描述符>, <缓冲区>, <要读取几个字节>, 0);

如果用户在客户端输入一行文本,然后按下回车,recv()函数就会把文本保存在一个像这样的字符数组中:

从客户端读取数据 - 图1

牢记以下几点:

  • 字符串不以\0结尾。

  • 当用户在telnet输入文本时,字符串以\r\n结尾。

  • recv()将返回字符个数,如果发生错误就返回-1,如果客户端关闭了连接,就返回0。

  • recv()调用不一定能一次接收到所有字符。

最后一点很重要,它意味着可能需要多次调用recv()

从客户端读取数据 - 图2

revc()用起来十分繁琐,最好把它封装在某个函数中,比如下面这个函数,它在指定数组中保存以\0结尾的字符串。

从客户端读取数据 - 图3

从客户端读取数据 - 图4滑野雪

这是简化recv()的一种方法,你可以做得更好吗?为什么不自己写一个read_in()呢?我们在headfirstlabs.com等你的好消息。

从客户端读取数据 - 图5代码熟食

这里还有一些在写服务器时会用到的代码,你能看懂它们是怎么工作的吗?

从客户端读取数据 - 图6

下面就来试用一下这几个服务器函数……

从客户端读取数据 - 图7练习

下面就开始写互联网knock-knock服务器的代码。这次你要写更多代码,不过可以使用上一页中现成的代码,我们为你开了一个头。

从客户端读取数据 - 图8

主函数需要你来写。需要创建一个新的服务器套接字,然后保存在listener_d中;服务器套接字将绑定到30000端口;队列长度为10。程序流程图如下:

从客户端读取数据 - 图9

别忘了检查错误。如果用户回答错误就向它发送一条错误消息,然后关闭连接,等待其他客户端连接。

加油!

 

从客户端读取数据 - 图10练习解答

下面就开始写互联网knock-knock服务器的代码。这次你要写更多代码,不过可以使用第479页中现成的代码,我们为你开了一个头。

从客户端读取数据 - 图11

你的代码应该看起来像下面这样,不一模一样也没关系,只要代码能按正确的套路说笑话并且能处理错误就行。

从客户端读取数据 - 图12

从客户端读取数据 - 图13试驾

knock-knock服务器已经竣工,下面就来编译运行。

从客户端读取数据 - 图14

服务器正在等待连接。打开另一个控制 台,用telnet连接它。

从客户端读取数据 - 图15

服务器开始讲笑话了。如果违反协议,乱回答一句会怎么样?

从客户端读取数据 - 图16

服务器成功校验了你发送给它的数据,然后立马关闭了连接。当你不想运行服务器时,可以切回服务器窗口按Crtl-C关闭,它还会和你说拜拜:

从客户端读取数据 - 图17

太好了!服务器不辱使命。

真的吗?