从客户端读取数据
你已经会向客户端发消息了,那怎么从客户端读取数据呢?套接字用send()
写数据,用recv()
读数据:
<读了几个字节> = recv(<描述符>, <缓冲区>, <要读取几个字节>, 0);
如果用户在客户端输入一行文本,然后按下回车,recv()
函数就会把文本保存在一个像这样的字符数组中:
牢记以下几点:
字符串不以\0结尾。
当用户在telnet输入文本时,字符串以\r\n结尾。
recv()将返回字符个数,如果发生错误就返回-1,如果客户端关闭了连接,就返回0。
recv()调用不一定能一次接收到所有字符。
最后一点很重要,它意味着可能需要多次调用recv()
。
revc()
用起来十分繁琐,最好把它封装在某个函数中,比如下面这个函数,它在指定数组中保存以\0
结尾的字符串。
滑野雪
这是简化
recv()
的一种方法,你可以做得更好吗?为什么不自己写一个read_in()
呢?我们在headfirstlabs.com等你的好消息。
代码熟食
这里还有一些在写服务器时会用到的代码,你能看懂它们是怎么工作的吗?
下面就来试用一下这几个服务器函数……
练习
下面就开始写互联网knock-knock服务器的代码。这次你要写更多代码,不过可以使用上一页中现成的代码,我们为你开了一个头。
主函数需要你来写。需要创建一个新的服务器套接字,然后保存在
listener_d
中;服务器套接字将绑定到30000端口;队列长度为10。程序流程图如下:
别忘了检查错误。如果用户回答错误就向它发送一条错误消息,然后关闭连接,等待其他客户端连接。
加油!
练习解答
下面就开始写互联网knock-knock服务器的代码。这次你要写更多代码,不过可以使用第479页中现成的代码,我们为你开了一个头。
你的代码应该看起来像下面这样,不一模一样也没关系,只要代码能按正确的套路说笑话并且能处理错误就行。
试驾
knock-knock服务器已经竣工,下面就来编译运行。
服务器正在等待连接。打开另一个控制 台,用telnet连接它。
服务器开始讲笑话了。如果违反协议,乱回答一句会怎么样?
服务器成功校验了你发送给它的数据,然后立马关闭了连接。当你不想运行服务器时,可以切回服务器窗口按Crtl-C关闭,它还会和你说拜拜:
太好了!服务器不辱使命。
真的吗?