从客户端读取数据
你已经会向客户端发消息了,那怎么从客户端读取数据呢?套接字用
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 关闭,它还会和你说拜拜:
太好了!服务器不辱使命。
真的吗?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论