在Linux中,一切都是文件,除了文本文件、源文件、二进制文件等,一个硬件设备也可以被映射为一个虚拟的文件,称为设备文件。例如,stdin 称为标准输入文件,它对应的硬件设备一般是键盘,stdout 称为标准输出文件,它对应的硬件设备一般是显示器。对于所有的文件,都可以使用 read() 函数读取数据,使用 write() 函数写入数据。


“一切都是文件”的思想极大地简化了程序员的理解和操作,使得对硬件设备的处理就像普通文件一样。所有在Linux中创建的文件都有一个 int 类型的编号,称为文件描述符(File Descriptor)。使用文件时,只要知道文件描述符就可以。例如,stdin 的描述符为 0,stdout 的描述符为 1。

在Linux中,socket 也被认为是文件的一种,和普通文件的操作没有区别,所以在网络数据传输过程中自然可以使用与文件 I/O 相关的函数。可以认为,两台计算机之间的通信,实际上是两个 socket 文件的相互读写。

文件描述符有时也被称为文件句柄(File Handle),但“句柄”主要是 Windows 中术语,所以本教程中如果涉及到 Windows 平台将使用“句柄”,如果涉及到 Linux 平台将使用“描述符”。

在Linux下创建 socket

在 Linux 下使用 <sys/socket.h> 头文件中 socket() 函数来创建套接字,原型为:

int socket(int af, int type, int protocol);

1) af 为地址族(Address Family),也就是 IP 地址类型,常用的有 AF_INET 和 AF_INET6。AF 是“Address Family”的简写,INET是“Inetnet”的简写。AF_INET 表示 IPv4 地址,例如 127.0.0.1;AF_INET6 表示 IPv6 地址,例如 1030::C9B4:FF12:48AA:1A2B。

大家需要记住127.0.0.1,它是一个特殊IP地址,表示本机地址,后面的教程会经常用到。

你也可以使用PF前缀,PF是“Protocol Family”的简写,它和AF是一样的。例如,PF_INET 等价于 AF_INET,PF_INET6 等价于 AF_INET6。

2) type 为数据传输方式,常用的有 SOCK_STREAM 和 SOCK_DGRAM,在《socket是什么意思》一节中已经进行了介绍。

3) protocol 表示传输协议,常用的有 IPPROTO_TCP 和 IPPTOTO_UDP,分别表示 TCP 传输协议和 UDP 传输协议。

有了地址类型和数据传输方式,还不足以决定采用哪种协议吗?为什么还需要第三个参数呢?

正如大家所想,一般情况下有了 af 和 type 两个参数就可以创建套接字了,操作系统会自动推演出协议类型,除非遇到这样的情况:有两种不同的协议支持同一种地址类型和数据传输类型。如果我们不指明使用哪种协议,操作系统是没办法自动推演的。

该教程使用 IPv4 地址,参数 af 的值为 PF_INET。如果使用 SOCK_STREAM 传输数据,那么满足这两个条件的协议只有 TCP,因此可以这样来调用 socket() 函数:

int tcp_socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);  //IPPROTO_TCP表示TCP协议

这种套接字称为 TCP 套接字。

如果使用 SOCK_DGRAM 传输方式,那么满足这两个条件的协议只有 UDP,因此可以这样来调用 socket() 函数:

int udp_socket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);  //IPPROTO_UDP表示UDP协议

这种套接字称为 UDP 套接字。

上面两种情况都只有一种协议满足条件,可以将 protocol 的值设为 0,系统会自动推演出应该使用什么协议,如下所示:

int tcp_socket = socket(AF_INET, SOCK_STREAM, 0);  //创建TCP套接字
int udp_socket = socket(AF_INET, SOCK_DGRAM, 0);  //创建UDP套接字

后面的教程中多采用这种简化写法。

在Windows下创建socket

Windows 下也使用 socket() 函数来创建套接字,原型为:

SOCKET socket(int af, int type, int protocol);

除了返回值类型不同,其他都是相同的。Windows 不把套接字作为普通文件对待,而是返回 SOCKET 类型的句柄。请看下面的例子:

SOCKET sock = socket(AF_INET, SOCK_STREAM, 0);  //创建TCP套接字

转载于:https://www.cnblogs.com/sddai/p/5790428.html

使用socket()函数创建套接字相关推荐

  1. C语言socket()函数解析(创建套接字)af地址族,ip地址类型(Address Family)INET(Inetnet)PF(Protocol Family)

    文章目录 Linux 下的 socket() 函数 1) af 为地址族(Address Family),也就是 IP 地址类型 2) type 为数据传输方式/套接字类型 3) protocol 表 ...

  2. socket()函数用法详解:创建套接字

    不管是 Windows 还是 Linux,都使用 socket() 函数来创建套接字.socket() 在两个平台下的参数是相同的,不同的是返回值. 在<socket是什么>一节中我们讲到 ...

  3. Python网络编程2:创建套接字和套接字对象的内建方法

    1.使用socket模块中socket()函数创建套接字: socket()函数返回一个socket对象,该对象的方法实现了各种socket系统调用. 语法: import socket socket ...

  4. python套接字编程_Python套接字编程(1)——socket模块与套接字编程

    在Python网络编程系列,我们主要学习以下内容: 5. 常见的Python异步编程框架 6. 协程在Python网络编程中的使用 本文介绍Python下的基本套接字编程,主要基于 socket 模块 ...

  5. JAVA socket编程 Datagram套接字 UDP协议(转)

      查看文章     JAVA socket编程 Datagram套接字 UDP协议 2009-05-13 09:35 1 UDP套接字 数据报(Datagram)是网络层数据单元在介质上传输信息的一 ...

  6. socket:数据报套接字

    数据报套接字 一.什么是数据报套接字 二.基于流套接字的客户/服务器的工作流程 1.服务器 2.客户端 三.套接字接口 1.recvfrom()系统调用 2.sendto()系统调用 四.示例 一.什 ...

  7. eclipse写java实现端口_使用eclipse(windows)在java中使用IPv6地址和端口号创建套接字...

    当我尝试使用IPv4地址创建套接字时,它很成功,但是当我尝试使用IPv6地址和端口号创建套接字时,它会引发异常: java.net.SocketException: Network is unreac ...

  8. 使用DatagramSocket发送、接收数据(Socket之UDP套接字)

    2019独角兽企业重金招聘Python工程师标准>>> 创建一个DatagramSocket实例,并将该对象绑定到指定IP地址.指定端口. 通过上面三个构造器中的任意一个构造器即可创 ...

  9. linux网络编程之一般应用采用的协议和不同套接字的地址结构以及用户进程和内核通过哪些函数传递套接字的地址结构

    1.一般应用采用的协议 2.不同套接字的地址结构 3.用户进程和内核通过哪些函数传递套接字的地址结构 从进程到内核传递套接字的地址结构函数有3个 bind.connect.sendto函数 从内核到进 ...

  10. socket模块(套接字模块)

    socket模块(套接字模块) 一.最简单版本(互传一次就结束) # 客户端 import socket client = socket.socket() client.connect(('127.0 ...

最新文章

  1. python绘图颜色代码_python matplotlib-颜色代码+ve和-ve值在绘图中
  2. 【2015沈阳现场A】
  3. 亚马逊产品描述计算机语言编辑,亚马逊Listing产品描述编辑讲解
  4. python 定时任务 Apscheduler
  5. 转载:迷你云 – 搭建自己的本地多人团队Dropbox 服务
  6. 苹果:我们一直在App Store上展示竞争对手的应用程序
  7. 基于JAVA+SpringMVC+Mybatis+MYSQL的建筑项目管理系统
  8. java用swing日历标记节日_如何用JavaSwing作一个日历控制程序?
  9. 【链表】两个链表的第一个公共结点
  10. Linux中常用目录作用
  11. 使用xadmin更新数据时,报错expected string or bytes-like object
  12. html中span隐藏属性,span标签的class属性
  13. gateway中的局部过滤器_GateWay过滤器
  14. 电脑技术员联盟 GhostXp Sp3 装机版V5.1
  15. java实现查询Word是否包含批注和修订内容
  16. 科技爱好者周刊(第 108 期):阵地战与奇袭战
  17. vscode中打开浏览器的快捷键_VSCode设置默认打开的浏览器的方法
  18. laravel 验证码一直提示不正确的问题
  19. CCF-野外环境中的蝴蝶自动识别-排名54
  20. 拓展编辑器(十八)_源生自定义菜单

热门文章

  1. 如何让 Pages 文字分为两栏或更多栏?
  2. Error fetching https://gems.ruby-china.org/: bad response Not Found 404 (https://gems.ruby-china.or
  3. 终端SSH工具SecureCRT 9.2.0 for Mac
  4. FE File Explorer Pro for mac(文件管理器)
  5. 实践解决跨域问题的三种方式剖析
  6. Loadrunner关联
  7. 仿淘宝首页产品分类菜单栏的设计
  8. 自定义Silverlight播放器
  9. 打造Vim作为前端IDE
  10. MyBatis 的 4 个妙用,别再踩坑了!