使用socket()函数创建套接字

原创 2016年06月01日 06:54:53
在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套接字
版权声明:本文为芝麻软件工作室原创文章,未经芝麻软件工作室允许不得转载。

Windows 下的socket(套接字编程)

前一段时间研究了下模拟网页登陆的相关资料,在此记录防遗忘。 Socket 源于unix,Socket就像我们使用CDC作图一样,免去了程序直接和设备驱动程序打交道的麻烦。就是提供给我们用来操作底层硬...
  • eldn__
  • eldn__
  • 2012年08月31日 09:09
  • 10819

Winsock学习 --- 建立套接字

所谓套接字,就是代表传输者的句柄,Win32中套接字不同于文件描述符,所以它是一个独立的类型SOCKET。 创建套接字的函数 SOCKET socket( int af, int type, int ...
  • lingdi2000
  • lingdi2000
  • 2015年03月25日 09:28
  • 417

C语言网络编程(三)建立套接字通讯TCP

为了实现服务器与客户机的通信,服务器和客户机都必须建立套接字。服务器与客户机的工作原理可以用下面的过程来描述。 (1)服务器先用socket函数来建立一个套接字,用这个套接字完成通信的监听。 (2)用...
  • loophome
  • loophome
  • 2015年11月10日 22:21
  • 1754

使用socket套接字创建服务器

今天上课我们学习了如何搭建一个简单的服务器。 首先需要准备的是: 1.两天电脑需要同时连接在同一个局域网内。 2.需要知道作为服务器的计算机的IP地址。 3.客户端需要打开telnet客户端。...
  • aeiou20018
  • aeiou20018
  • 2016年05月21日 21:28
  • 1346

使用socket()函数创建套接字

在Linux中,一切都是文件,除了文本文件、源文件、二进制文件等,一个硬件设备也可以被映射为一个虚拟的文件,称为设备文件。例如,stdin 称为标准输入文件,它对应的硬件设备一般是键盘,stdout ...
  • softn
  • softn
  • 2016年06月01日 06:54
  • 1226

C/C++ socket编程教程之四:使用socket()函数创建套接字

在Linux中,一切都是文件,除了文本文件、源文件、二进制文件等,一个硬件设备也可以被映射为一个虚拟的文件,称为设备文件。例如,stdin 称为标准输入文件,它对应的硬件设备一般是键盘,stdout ...
  • Ctrl_qun
  • Ctrl_qun
  • 2016年09月06日 22:12
  • 2165

Windows 下的socket(套接字编程)

前一段时间研究了下模拟网页登陆的相关资料,在此记录防遗忘。Socket 源于unix,Socket就像我们使用CDC作图一样,免去了程序直接和设备驱动程序打交道的麻烦。就是提供给我们用来操作底层硬件的...
  • weicaijiang
  • weicaijiang
  • 2016年08月11日 09:34
  • 1215

Socket.Select()函数使用不当引发的问题(关于套接字在线程间传递是否可行的验证)

使用环境:VS2010 C# 做东西的时候碰到一个问题: 在后台中,创建了一个监听线程,用来监听是否有连接到监听地址的请求,如果有,则加入监听套接字集中;(这样的话,一个线程就可以接收N个套接字的...
  • xiaobai1593
  • xiaobai1593
  • 2012年03月13日 14:18
  • 1784

使用Socket套接字绑定函数bind的一个细节

只要稍微接触Socket套接字进行过网络编程的人,对Socket客户端调用流程或服务端调用流程都会很熟悉,传输层协议采用TCP也好,或UDP也罢。但是要写好这套“固化”的流程代码,如果稍不小心,或缺乏...
  • chexlong
  • chexlong
  • 2011年11月05日 21:09
  • 7422

linux 套接字 socket 函数 手册

  • 2010年11月24日 19:11
  • 148KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:使用socket()函数创建套接字
举报原因:
原因补充:

(最多只允许输入30个字)