在服务器中,需要建立一个socket套接字才能对外提供一个网络通信接口,在Linux系统中套接字仅是一个文件描述符,也就是一个int类型的值
socket概念
socket 的原意是“插座”,在计算机通信领域,socket 被翻译为“套接字”,它是计算机之间进行通信的一种约定或一种方式。通过 socket 这种约定,一台计算机可以接收其他计算机的数据,也可以向其他计算机发送数据。
我们把插头插到插座上就能从电网上获得电力供应,同样为了与远程计算机进行数据传输,需要连接到因特网,而socket就是用来连接到因特网的工具
UNIX/Linux下的socket
在UNIX/Linux下,一切都是文件
为了表示和区分已经打开的文件,UNIX/Linux 会给每个文件分配一个 ID,这个 ID 就是一个整数,被称为文件描述符(File Descriptor)。例如:
-
通常用 0 来表示标准输入文件(stdin),它对应的硬件设备就是键盘;
-
通常用 1 来表示标准输出文件(stdout),它对应的硬件设备就是显示器。
UNIX/Linux 程序在执行任何形式的 I/O 操作时,都是在读取或者写入一个文件描述符。一个文件描述符只是一个和打开的文件相关联的整数,它的背后可能是一个硬盘上的普通文件、FIFO、管道、终端、键盘、显示器,甚至是一个网络连接。
请注意,网络连接也是一个文件,它也有文件描述符
Linux下socket使用
创建
#include<sys/socket.h>
int sockfd = socket(AF_INET,SOCK_STREAM,0);
-
创建socket的API中第一个参数是IP地址类型,AF_INET表示使用IPv4,如果使用IPv6请使用AF_INET6,另外AF_UNIX则是Unix域套接字,即本地套接字
-
第二个是参数为数据传输方式,SOCK_STREAM表示流格式、面向连接,多用于TCP。SOCK_DGRAM表示数据报格式、无连接,多用于UDP,至于TCP为什么为流格式,UDP为什么为面向报文,在专栏计算机网络部分为有详细解释。
-
第三个参数:协议,0表示根据前面的两个参数自动推导协议类型。设置为IPPROTO_TCP和IPPTOTO_UDP,分别表示TCP和UDP。
sockadd_in结构体
对于客户端,服务器存在的唯一标识是一个IP地址和端口,这时候我们需要将这个套接字绑定到一个IP地址和端口上。首先创建一个sockaddr_