绝大部分关于socket编程的教程总是从socket的概念开始讲起的。要知道,socket的初衷是个庞大的体系,TCP/IP只是这个庞大体系下一个很小的子集,而我们真正能用上的更是这个子集中的一小部分:运输层(Host-to-Host Transport Layer)的TCP和UDP协议,以及使用这两个协议进行应用层(Application Layer)的开发。即使是socket的核心部分,网络层(Internet Layer)的IP协议,在编程的时候我们也很少会感觉到它的存在——因为已经被封装好了,我们唯一需要做的事情就是传入一个宏。第一节我想介绍的概念就这么多,当然,既然我们已经说了3个层了,我想最好还是把最后一个层也说出来,即所谓链路层(Network Access Layer),它包括了物理硬件和驱动程序。这四个层从底到高的顺序是:链路层--网络层--运输层--应用层。
        好,说实话我们现在并不清楚所谓TCP到底是什么东东,不过我们知道这东东名气很大。或许你早就知道,另外一个声名狼藉建立在TCP协议基础上的应用程序,它曾经几乎是统治了一个时代,即使是今天,我们依然无法消除他的影响力的——恩,是的,就是telnet。
        在这个教程中,我使用的环境是Debian GNU/Linux 4.0 etch。传说中的stable -_-!!!,恩,我是很保守的人。如果你不是自己DIY出来的系统,相信默认安装里面就应该有telnet(/usr/bin/telnet,要是没装就自己aptitude install吧)。telnet可以与所有遵循TCP协议的服务器端进行通讯。通常,socket编程总是Client/Server形式的,因为有了telnet,我们可以先不考虑client的程序,我们先写一个支持TCP协议的server端,然后用telnet作为client验证我们的程序就好了。
        server端的功能,我们也考虑一种最简单的反馈形式:echo。就如同你在终端输入echo 'Hello World',回车后shell就会给你返回Hello World一样,我们的第一个TCP server就用以实现这个功能。
        什么样的模型适合描述这样的一种server呢?我相信,一个很2的例子会有助于我们记忆TCP server端的基本流程。
        想象你自己是个小大佬,坐办公室(什么样的黑社会做办公室啊?可能是讨债公司吧^^)你很土,只有一个小弟帮你接电话(因为你自己的号码是不敢对外公开的)。一次通讯的流程大概应该是这样的:小弟那里的总机电话响了;小弟接起电话;对方说是你女朋友A妹;小弟转达说,“老大,你马子电话”;你说,接过来;小弟把电话接给你;你和你女朋友聊天半小时;挂电话。
        我们来分析一下整个过程中的元素。先分析成员数据(请注意,这里开始用C++术语了):你小弟(listenSock),你需要他来监听(listen,这是socket编程中的术语)电话;你自己(communicationSock),实际上打电话进行交流的是你自己;你的电话号码(servAddr),否则你女朋友怎么能找到你?你女朋友的电话号码(clntAddr),这个比喻有点牵强,因为事实上你接起电话,不需要知道对方的号码也可以通话(虽然事实上你应该是知道的,你不会取消了来电显示功能吧^^),但是,难道你是只接女朋友电话从来不打过去的牛人吗?这个过程中的行为(成员函数):你小弟接电话并转接给你(isAccept());你自己的通话(handleEcho())(这个行为确实比较土,只会乌鸦学舌的echo,呵呵)。
        简单的说,就是这些了。根据这个模型,我们可以很容易写出实现我们需要的echo功能的TCP server的类:

class TcpServer
{
private:
    int listenSock;
    int communicationSock;
    sockaddr_in servAddr;
    sockaddr_in clntAddr;
public:
    TcpServer(int listen_port);
    bool isAccept();
    void handleEcho();
};

这里面有些简写,比如,sock实际上就是socket,addr就是address。serv和clnt我想你一定能猜到是server和client吧。还有一个socket中的结构体sockaddr_in,实际上就是这个意思:socket address internet(网络嵌套字地址),具体解说,请看下回分解。

socket 编程入门教程(一)TCP server 端:1、建模相关推荐

  1. socket 编程入门教程(三)TCP原理:5、TCP的三次握手(three-way handshake)

    socket 编程入门教程(三)TCP原理:5.TCP的三次握手(three-way handshake) 前面3个小节介绍了socket机制对TCP协议三次握手的实现,需要强调的是,与协议独立于实现 ...

  2. socket 编程入门教程(一)TCP server 端:7、接收与发送

    现在,我们通过accept()创建了新的socket,也就是我们类中的数据成员communicationSock,现在,我们就可以通过这个socket进行通讯了. TCP通讯模型 在介绍函数之前,我们 ...

  3. socket 编程入门教程(一)TCP server 端:6、创建“通讯 ”嵌套字

    这里的"通讯"加上了引号,是因为实际上所有的socket都有通讯的功能,只是在我们的例子中,之前那个socket只负责listen,而这个socket负责接受信息并echo回去. ...

  4. socket 编程入门教程(一)TCP server 端:4、构造函数涉及的概念

    话题回到"黑社会办公室"的例子,讲概念已经扯得比较远了,不过,这一节我们还得讲概念,不过好在有些程序的例子.如果大家不想翻回去看TcpServer类的原型,我这里直接给出这个头文件 ...

  5. socket 编程入门教程(一)TCP server端:3、sockaddr与sockaddr_in

    2019独角兽企业重金招聘Python工程师标准>>> 收件人地址 一家化妆品公司将一批新产品的样品,准备发给某学校某个班的女生们免费试用.通常情况下,这件邮包的地址上可以这么写: ...

  6. socket 编程入门教程(一)TCP server 端:5、创建监听嵌套字

    前面一小节,我们已经写出了TcpServer的构造函数.这个函数的实际作用,就是创建了listen socket(监听嵌套字).这一节,我们来具体分析这个创建的过程. socket和sockaddr的 ...

  7. socket 编程入门教程(一)TCP server 端:2、socket与文件描述符

    UNIX中的一切事物都是文件( everything in Unix is a file!) 当我在这篇教程中提到UNIX的时候,其意思专指符合UNIX标准的所谓"正统"UNIX的 ...

  8. socket 编程入门教程(一)TCP server 端:3、sockaddr与sockaddr_in

    收件人地址 一家化妆品公司将一批新产品的样品,准备发给某学校某个班的女生们免费试用.通常情况下,这件邮包的地址上可以这么写: 收件人:全体女生. 地址:A省B市C学校,X级Y班. 但是,如果在描述地址 ...

  9. socket 编程入门教程(三)TCP原理:7、TCP连接的关闭

    2019独角兽企业重金招聘Python工程师标准>>> TCP连接一旦建立,服务器端和客户端就成为了对等关系,任何一方都可以发出关闭握手请求,甚至可以同时发出关闭握手请求.TCP的连 ...

最新文章

  1. Java 8 一行代码解决了空指针问题,太厉害了...
  2. 验证字符串是否以指定字符开头
  3. java数据类型常见面试题
  4. 用php程序能消除水印吗,php——水印
  5. IBM AIX服务器分区之间迁移IO设备以迁移HBA卡为例
  6. Android 测试支持库 1.0 现已发布!
  7. spark之5:配置文件
  8. caffe开始训练自己的模型(转载并验证过)
  9. CJOJ 【DP合集】最长上升序列2 — LIS2
  10. 消息中间件Rabbitmq核心概念讲解
  11. 中移4G模块-ML302-OpenCpu开发-前端网页搭建
  12. Android开发笔记(一百三十五)应用栏布局AppBarLayout
  13. 跨域 webpack + vue-cil 中 proxyTable 处理跨域
  14. 超市系统服务器,超市收银系统 服务器 配置
  15. 关于O、Θ、Ω、o、ω等数学符号
  16. 免费注册个体户营业执照出证教程
  17. 易建联惨遭雄鹿霸王硬上弓!!!
  18. JAVA入门学习资料
  19. groovy+grails+gradle开发
  20. java测试smtp连接失败_java – MailConnectException:无法连接到主机,端口:smtp.sendgrid.net...

热门文章

  1. android 刷rom,刷ROM是什么?刷ROM是什么意思?
  2. spring jdbctemplate 实体列与数据表列 查询
  3. 高级数据库,建库,建表,建约束
  4. (JAVA)超大小数运算
  5. Ipython\Jupyter数据分析工具
  6. [SDOI 2010]外星千足虫
  7. 变量的比较之equals 与 == 的区别
  8. android 请求网络异步载入
  9. ContentType的类型
  10. leetcode 42 接雨水 单调栈