使用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
  • 10434

使用socket套接字创建服务器

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

Socket详解-socket建立

Socket建立    为了建立Socket,程序可以调用Socket函数,该函数返回一个类似于文件描述符的句柄。socket函数原型为:   int socket(int doma...

Linux的SOCKET编程详解

Linux的SOCKET编程详解 1. 网络中进程之间如何通信 进 程通信的概念最初来源于单机系统。由于每个进程都在自己的地址范围内运行,为保证两个相互通信的进 程之间既互不干扰又...
  • hguisu
  • hguisu
  • 2012年04月10日 17:44
  • 234631

socket的底层创建与关闭

Tcp连接的创建与关闭          看了网络编程的的东西,并且做了一个QQ的项目。socket编程也算是入门了,但是只是会用还是不行的,必须了解底层的实现,这篇博客就把底层的实现总结一遍。网络传...

Windows下基于原始套接字的回射客户端

根据使用的场合的不同,我们可以使用TCP、UDP和原始套接字来实现这个功能,今天就说一下基于基于原始套接字的回射客户端源代码。跟前面提过的工程一样,这个工程里面也包含着SocketFrame.cpp和...

socket服务器和客户端的建立步骤

转自http://blog.csdn.net/wenwen227/archive/2008/12/17/3543497.aspx TCP编程的服务器端一般步骤是: 1、创建一个socket,用函数...

1.3创建一个主动套接字

TCP/IP标准没有告诉我们关于套接字的任何信息。此外,TCP/IP标准几乎没有告诉我们如何实现TCP或UDP协议软件API。通过协议软件API,应用程序可以“享受”这个软件功能。​...

linux网络协议栈分析——ioctl的调用流程

http://blog.csdn.net/cbmsft/article/details/7214639 首先从系统调用开始,ioctl的系统调用在fs/ioctl.c中: [c...

《Java平台体系》——第二章 JVM——从JVM指令到机器指令

我们前面也聊过JVM在规范层面引入字节码的好处,但将Java字节码翻译成机器指令是需要时间的。所以如何提高Java指令到机器指令的转化效率成为每一个JVM实现必须考虑的问题。如果发挥我们的想象力来理解...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:使用socket()函数创建套接字
举报原因:
原因补充:

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