socket是用于通信的工具。

  套接字其实是一个广义上的进程间通信的信道。就像pipe一样,在GUN环境下socket也被用一个文件表示。不同的socket文件可以用于不同的进程间通信,甚至可以用来在网络通信中不同主机之间的进程间通信(比如,我们的浏览器进程与某台服务器上监听80端口的进程通信完成web请求)。socket是与其他主机通信的主要手段,相关软件有telnetrloginftptalk 等。

  并不是所有的机器都支持socket通信,不过在GUN C库中,头文件<sys/socket.h>无论是否存在,socket函数总是可用的,不过在机器不支持时,这些函数总会失败。

  1:socket套接字概念

    创建套接字时,必须指定通讯方式和通讯类型。创建socket时的协议决定了在套接字上发送和接收数据时的用户级别的语义。socket通讯类型回答了一下问题:

      数据的传输单位是什么?一些通信方式将数据视为较大结构的字节序列;其他人将字节分组成数据包

      数据在正常运行时可能丢失吗? 一些通信方式保证发送的所有数据按照发送的顺序到达(禁止系统或网络崩溃); 其他样式偶尔会丢失数据作为正常操作部分,有时可能会传送数据包不止一次或错误的顺序。设计使用不可靠通信方式的程序通常需要采取预防措施来检测丢失或错误的数据包,并根据需要重新发送数据。

      是否需要啊建立连接?一些通讯方式要求必须建立起连接通道才可以通信,有的则不需要。

    当创建一个套接字时,还必须制定一个NAMESPACE,socket("address")也只有在特定命名空间的上下文中才有意义。事实上,甚至数据类型也可能取决于命名空间。命名空间也称为“域”,也就是domain。但是我们应该避免使用这个词,因为它可能会与其他感念混淆。每一个命名空间都有一个以“PF_”开头的符号名称。以“AF_”开头的相应符号名称指定该命名空间的地址格式。

    最后,在建立连接时必须制定使用的协议。该协议确定用于发送和接收数据的低级机制。每个协议对于特定的命名空间和通信风格是有效的;命名空间有时被称为协议族,因为这是为什么命名空间名称以“PF_”开头。

    协议的规则适用于两个程序之间的数据传递,也许在不同的计算机上;大多数这些规则由操作系统处理,您不需要知道它们。需要了解的协议是什么?

    为了在两个socket之间进行通信,它们必须指定相同的协议。
    每个协议对于特定的样式/命名空间组合是有意义的,不能与不适当的组合一起使用。例如,TCP协议仅适用于通信的字节流风格和Internet命名空间。
    对于风格和命名空间的每个组合,都有一个默认协议,您可以通过指定0作为协议号来请求。这就是通常应该做的 - 使用默认值。
  在以下各个地方的描述中,需要用于表示尺寸的变量/参数。这里麻烦开始了。在第一个实现中,这些变量的类型只是int。在当时的大多数机器上,一个int是32位宽,这创建了一个事实上的标准,需要32位变量。这是重要的,因为这种类型的变量的引用被传递给内核。

    然后,POSIX组织来到并统一了界面,其中的“所有大小的值都是size_t”。在64位机器上,size_t是64位宽,所以不能再指向变量。

    Unix98规范通过引入一个类型socklen_t来提供一个解决方案。在POSIX更改为使用size_t的所有情况下都使用此类型。这种类型的唯一要求是它是至少32位的无符号类型。因此,需要传递对32位变量的引用的实现可以像使用64位值的实现。

  2:通讯方式

    GUN C库包括对不同套接字的支持,每个套接字有不同的属性。以下符号常量在<sys/socket.h>中定义

    宏:int SOCK_STREAM:这种方式就像是Pipes和FIFOs

    宏:int SOCK_DGRAM:用于不可靠的发送单独寻址的数据包,与SOCK_STREAM相反。每次向这种套接字写入数据时,该数据都会被打包成一个数据包。由于SOCK_DGRAM套接字没有连接,因此必须在每个数据包指定收件人地址。

    系统对要传输的数据唯一的保证是,它会尽力传递每一个数据包。如果在第四个,第五个数据包出现故障之后,它可能成功发送第六个第七个数据包,第七个数据包可能在第六个数据包之前到达。SOCK_DGRAM的典型用途是在合理的时间内没有看到响应的情况下简单地重新发送数据包是可以接受的。点此查看详情

    宏:int SOCK_RAW:这种风格提供对低级网络协议和接口的访问。普通用户程序通常不需要使用这种风格。

  3:socket地址

    套接字的名称通常称为地址。用于处理套接字地址的函数和符号名称不一致。有事使用术语“名称”,有时称为“地址”。可以讲这些视为同义词。

    使用socket函数创建一个套接字时没有地址,其他进程只有给它一个地址时才可以找到与它通信。我们将这个过程称为绑定到套接字,在C用使用bind函数实现。

    只需要关心套接字的地址,如果其他进程要找到它并开始与其通信。可以指定其他套接字的地址,但这通常是无意义的;首次从套接字发送数据,或者使用它来启动连接时,如果没有指定一个地址,系统会自动分配一个地址。

    偶尔,客户端需要指定地址,因为服务器基于地址进行区分;例如,rsh和rlogin协议查看客户端的套接字地址,只有在小于IPPORT_RESERVED(请参阅端口)时才会旁路密码检查。

    关于命名空间可以查阅Local NamespaceInternet Namespace。无论命名空间如何,都是用相同的bind、getsocketname来设置一个套接字的地址。在实际中,地址格式存在一些特定的数据结构中,当bind时将其转换为struct sockaddr *。

GUN C中的socket学习(一)的更多相关文章

  1. .NET Core 2.1 源码学习:看 SocketsHttpHandler 如何在异步方法中连接 Socket

    在 .NET Core 2.1 中,System.Net.Sockets 的性能有了很大的提升,最好的证明是 Kestrel 与 HttpClient 都改为使用 System.Net.Sockets ...

  2. 详细讲解nodejs中使用socket的私聊的方式

    详细讲解nodejs中使用socket的私聊的方式 在上一次我使用nodejs+express+socketio+mysql搭建聊天室,这基本上就是从socket.io的官网上的一份教程式复制学习,然 ...

  3. PHP中的Libevent学习

    wangbin@2012,1,3 目录 Libevent在php中的应用学习 1.      Libevent介绍 2.      为什么要学习libevent 3.      Php libeven ...

  4. Android中基于Socket的网络通信

    1. Socket介绍 2. ServerSocket的建立与使用 3. 使用ServerSocket建立聊天服务器-1 4. 使用ServerSocket建立聊天服务器-2 5. 在Android中 ...

  5. Socket学习总结系列(二) -- CocoaAsyncSocket

    这是系列的第二篇 这是这个系列文章的第二篇,要是没有看第一篇的还是建议看看第一篇,以为这个是接着第一篇梳理的 先大概的总结一下在上篇的文章中说的些内容: 1. 整理了一下做IM我们有那些途径,以及我们 ...

  6. 详解nodejs中使用socket的私聊和公聊的办法

    详解nodejs中使用socket的私聊和公聊的办法 nodejs的应用中,关于socket应该是比较出彩的了,socket.io在github上有几万人的star,它的成功应该是不输于express ...

  7. Java中的Socket的用法

                                   Java中的Socket的用法 Java中的Socket分为普通的Socket和NioSocket. 普通Socket的用法 Java中的 ...

  8. EBS中利用Socket与外系统通信

    某银行要求做一个签到签退功能,日终EBS系统发送报文与核心系统对帐,规定利用Socket来做传送,记录下步骤: 1.编辑: $INST_TOP/ora/10.1.3/j2ee/oacore/appli ...

  9. QT中的SOCKET编程(QT-2.3.2)

    转自:http://mylovejsj.blog.163.com/blog/static/38673975200892010842865/ QT中的SOCKET编程 2008-10-07 23:13 ...

随机推荐

  1. win下写任务提交给集群

    一,复制和删除hdfs中的文件 import org.apache.hadoop.fs.{FileSystem, Path} import org.apache.spark.{SparkConf, S ...

  2. hibernate学习系列-----(9)hibernate对集合属性的操作之Map集合篇

    照旧,先新建一个StudentMap.java实体类,将hobby属性使用map集合接口来存放: package com.joe.entity; import java.util.Map; publi ...

  3. PuTTY连接Linuxserver常常断线解决方式

    PuTTY在远程连接server之后.常常会断线提示"Software caused connection abort",并且常常在非常短的时间内就失去连接. 解决方式例如以下: ...

  4. 大巧不工web前端设计修炼之道—笔记

      设计原则: 深入人心的设计--别让我思考 简洁是一种文化,一种需求,一种思想   ·排版 ·字体(衬线 | | 无衬线)

  5. java 方法传参方式: 按值调用

    程序设计语言中将参数传递给方法的几种方式: 按名调用(call by name): Algol 语言采用此方式, 已成为历史; 按值调用(call by value): 方法接收到的是调用者提供的 变 ...

  6. DB2解锁

    1.登录数据库 db2 connect to 数据库名字 user 用户名 using 密码 2.进入db2top db2top -d 数据库名 进入到如下界面:  3.按下shift+u(图中U-L ...

  7. mac使用git管理Github

    工欲善其事,必先利其器. 在OS X Yosemite 10.10.3安装最新版本号Xcode.在terminal下能够发现git已经被安装. ~ mesut$ git --version git v ...

  8. RIP协议

    1.概念:RIP协议是一种内部网关协议(IGP),是一种动态路由选择协议,用于自治系统(AS)内的路由信息的传递.        RIP协议基于距离矢量算法(DistanceVectorAlgorit ...

  9. atitit.TokenService  token服务模块的设计

    atitit.TokenService  token服务模块的设计 1. Token的归类1 2. Token的用途2 2.1. 访问控制2 2.2. 编译原理术语)编辑2 2.3. 数据处理2 1. ...

  10. SGDMA

    Scatter-gather DMA 使用一个链表描述物理上不连续的存储空间,然后把链表首地址告诉DMA master.DMA master在传输完一块物理连续的数据后,不用发起中断,而是根据链表来传 ...