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

绝大部分关于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(网络嵌套字地址),具体解说,请看下回分解。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/434825.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

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

UNIX中的一切事物都是文件( everything in Unix is a file!)当我在这篇教程中提到UNIX的时候,其意思专指符合UNIX标准的所谓“正统”UNIX的衍生系统(其实我就用来带指那些买了最初UNIX源代码的商业系统)操作系统和类似…

linux 故障注入_用软件中断实现的Linux内核故障注入方法

用软件中断实现的Linux内核故障注入方法郭庆伟;杨麦顺;张影;张兴军【期刊名称】《计算机应用》【年(卷),期】2014(000)0z2【摘要】针对容错操作系统的可靠性评测问题,提出一种向Linux内核注入“单个位”故障的方法。基于x86体系结构中的软件中断机制,首先…

arcgis将一个字段里的文字按上下标进行显示

示例 代码如下 def FindLabel ( [分区代号] ):a [分区代号]ba[0:1]<sub>a[1:2]</sub>return b

【转载】我对研发工作的一点感悟

一、现有状况分析不 觉新人来到我们研发已近一年&#xff0c;这一年里&#xff0c;同一批人员&#xff0c;有的已经很快适应了环境&#xff0c;经过自己的努力和付出&#xff0c;能为研发工作独挡一面&#xff0c;成为某一方面的小专家&#xff1b;有的 尽管前期不太适应&#…

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

话题回到“黑社会办公室”的例子&#xff0c;讲概念已经扯得比较远了&#xff0c;不过&#xff0c;这一节我们还得讲概念&#xff0c;不过好在有些程序的例子。如果大家不想翻回去看TcpServer类的原型&#xff0c;我这里直接给出这个头文件的完整源代码&#xff1a;//Filename:…

地质灾害风险评价中按字段进行编号

示例 代码 # -*- coding: utf-8 -*- A1 B1 C1 D1 def a(name):namename.encode(utf-8);global A,B,C,Dif(name极高危险区):end"Ⅰ"str(A)AA1elif(name高危险区):end"Ⅱ"str(B)BB1elif(name中危险区):end"Ⅲ"str(C)CC1elif(name低危险区):end&qu…

vm虚拟机安装lede旁路由_教你利用VMM虚拟机安装LEDE旁路由实现软路由超强功能的方法教程...

教你利用VMM虚拟机安装LEDE旁路由实现软路由超强功能的方法教程6 H* ]: {$ Y2 f. W! o" u/ G& M9 p( d原文作者&#xff1a;阿文菌# [2 w0 p, K; H9 s$ ~6 |& }4 ]6 | y/ W$ A& d# n; x- K5 ~大家好俺又来了&#xff01;: ]2 f% S1 W7 D% l2 y俺现在家里24小时…

arcgis字段计算器VB脚本提取字符串

从左往右提取 left&#xff08;字段名称&#xff0c;提取长度&#xff09; Left( [地貌类型区],5) 从右往左提取 right&#xff08;字段名称&#xff0c;提取长度&#xff09; Right( [地理位置_1],3)

android学习笔记:数据库存储

使用的是SQLite 1.建立SQLiteOpenHelper扩展类。 public class DictionaryOpenHelper extends SQLiteOpenHelper {private static final int DATABASE_VERSION 2;private static final String DICTIONARY_TABLE_NAME "dictionary";private static final String DIC…

python允许无止境的循环吗_Python第一天 - 思想永无止境的个人页面 - OSCHINA - 中文开源技术交流社区...

下载安装python以及相关软件。python直接到python官网下windows-msi文件&#xff0c;版本根据需要下2.7或3.0。pydev自己网上搜&#xff0c;pydev官网的反而不行(eclipse上安装失败)。javaoracle官网eclipseeclipse官网配置pydev新建一个Python Interpreter&#xff0c;选择pyt…

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

前面一小节&#xff0c;我们已经写出了TcpServer的构造函数。这个函数的实际作用&#xff0c;就是创建了listen socket&#xff08;监听嵌套字&#xff09;。这一节&#xff0c;我们来具体分析这个创建的过程。socket和sockaddr的创建是可以相互独立的在函数中&#xff0c;我们…

GIS之土地利用数据下载

下载链接&#xff1a; 全球地表覆盖-数据浏览 数据说明&#xff1a; 具体请查看官网: 全球地表覆盖-产品介绍 下载步骤&#xff1a;

Scribe应用实例

源代码里所给的example很简单&#xff0c;但大体上了模拟了其运行的过程&#xff0c;分三个部分。可参考里面的README文件&#xff1a;Configurarion&#xff08;配置&#xff09;、Running Scribe Server&#xff08;运行服务器&#xff09;、Logging messages&#xff08;记录…

群晖docker签到京豆_利用Synology(群晖)Docker安装签到框架

利用Synology(群晖)Docker安装签到框架Mark • 2018 年 05 月 15 日1、前言之前一直想自己开一套WEB签到工具用&#xff0c;一方面是精力有限(老了)&#xff0c;另一方面技术能力欠佳一直没有搞。去年时候在偶然机会下在V2ex了解到Binux大佬开发的一套签到框架系统qiandao&…

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

这里的“通讯”加上了引号&#xff0c;是因为实际上所有的socket都有通讯的功能&#xff0c;只是在我们的例子中&#xff0c;之前那个socket只负责listen&#xff0c;而这个socket负责接受信息并echo回去。我们现看看这个函数&#xff1a;boolTcpServer::isAccept() { unsi…

python离线安装pip出现timeout_Python pip安装包出现timeout的解决办法,修改国内的镜像源...

今天安装django时老是出现timeoutWARNING: Retrying (Retry(total4, connectNone, readNone, redirectNone, statusNone)) after connection broken by ConnectTimeoutError(at 0x00000000044BC9B0>, Connection to pypi.org timed out. (connect timeout15)): /simple/dian…

DIY_DE2开发板介绍

Altera官方有一个DE2开发板&#xff0c;该开发板的资源很丰富&#xff0c;外设也很齐全&#xff0c;采用的是十层电路板设计&#xff0c;价格自然很高了。本人仿照其原理图自制了一块&#xff0c;叫做DIY_DE2开发板。开发板采用核心板和底板的模式&#xff0c;方便使用&#xf…

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

现在&#xff0c;我们通过accept()创建了新的socket&#xff0c;也就是我们类中的数据成员communicationSock&#xff0c;现在&#xff0c;我们就可以通过这个socket进行通讯了。TCP通讯模型在介绍函数之前&#xff0c;我们应该了解一些事实。TCP的Server/Client模型类似这样&a…