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. C# SendMail 发送邮件

    最近因为用的发送邮件的地方,就查询了资料,总结以下几个方法 1.利用新浪邮箱发送 2.利用公司邮箱发送 3.利用CDO发送,这种方式要引用Interop.ADODB.dll(http://www.no ...

  2. onbeforepaste事件用法

    onkeyup="value=value.replace(/[^\d]/g,'')" onbeforepaste="clipboardData.setData('text ...

  3. Shortest Path [3]

    -----------应要求删除---------------

  4. 爪哇国新游记之二十九----访问URL获取输入流

    代码: import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.FileWriter; import ...

  5. 乌云主站所有漏洞综合分析&乌云主站漏洞统计

    作者:RedFree 最近的工作需要将乌云历史上比较有含金量的漏洞分析出来,顺便对其它的数据进行了下分析:统计往往能说明问题及分析事物的发展规律,所以就有了此文.(漏洞数据抓取自乌云主站,漏洞编号从1 ...

  6. vue - 总结build.js

    1. 导入外部包,用关键字 const :ES2015->不可变量 内部使用变量,let -> 块级声明 2.无分号结尾(我猜大概是用了es6变量,避免了es5应缺少分号出现的一些问题) ...

  7. jquery ui dialog 中使用select2 导致select2的input失去焦点的解决方法

    在jqueryUI 的dialog中使用select2,select2的input search无论怎样都获取不到焦点? 解决方法: $(document).ready(function () { $ ...

  8. VB的第一个项目

     前言-----本人也是刚刚接触VB,企业的VB代码基本能看的懂,但是自己开发,只能呵呵.一般在刚学习一门新的语言时,很容易发生一些自己相当然的认识错误,so,记下并分享开发学习的过程,望指正.--- ...

  9. csv导出文件中有html

    最近遇到再导出csv文件时,csv文件中包含html代码 一开始以为导出的数据量太大,减少数据后仍然出现html代码,此时想到应该与数据有关,仔细观察csv中的数据,有的单元里面是空值, 对比原始数据 ...

  10. 千万级大数据的Mysql数据库SQL语句优化

    1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索 ...