总结服务器端的函数和客户端的函数
再次声明博主写的都是对于linux下的网络编程,没有写关于Windows的网络编程,也许以后会写到。
这里只是总结一下,具体参数的含义等后面的跟新
1. #include<sys/socket.h> int socket(int domain, int type, int protocol); -->成功:返回文件描述符 失败:返回 -1 2. #include<sys/socket.h> int bind(int sockfd, struct sockaddr *myaddr, socklen_t addrlen); -->成功:返回 0 失败:返回 -1 3. #include<sys/socket.h> int listen(int sockfd, int backlog); -->成功:返回 0 失败:返回 -1 4. #include<sys/socket.h> int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen); -->成功:返回文件描述符 失败:返回-1 5. #include<sys/socket.h> int connect(int sockfd, struct sockaddr *serv_addr, socklen_t addrlen); -->成功:返回 0 失败:返回 -1 6. #include<sys/types.h> #include<sys/stat.h> #include<fcntl.h> int open(const char *path, int flag); -->成功:返回文件描述符 失败:返回 -1 7. #include<unistd.h> int close(int fd); -->成功:返回 0 失败:返回 -1 8. #include<unistd.h> ssize_ write(int fd, const void *buf, size_t nbytes); -->成功:返回写入的字节数 失败:返回 -1 9. #include<unistd.h> ssize_t read(int fd, void *buf, size_t nbytes); -->成功:返回接受的字节数(但遇到文件结尾则返回 0 ) 这就是后面的内容(单道程序设计模型)会用到的函数。写这个的目的为了方便查找。
下面介绍一下 提了这么久的socket函数吧。
#include<sys/socket.h> int socket(int domain, int type. int protocol); 参数含义: 第1个 int domain --> 选择: IPV4:AF_INET IPV6:AF_INET6 本地协议:AF_UNIX -->(其实还有的但是后面的基本用不到,所以博主就不介绍了) 第2个 int type --> 选择协议: SOCK_STREAM -->TCP "面向连接的、可靠的、数据完整的基于字节流的连接" SOCK_DGRAM -->UDP "面向消息的、不可靠的、无连接的、报文传输" 第3个 int protocol --> 传 0 表示使用默认协议 返回值: 成功:返回指向新创建的 socket 的文件描述符 失败:返回 -1 设置errno。
下面博主给出上面参数比较具体的协议等,大家记住博主上面的就行,下面的图片就当拓展了
socket函数其实是非常有将头的其中还涉及到了协议,博主尽力在学校断电之前多写一点。
开始!!!!
第一个参数 int domain:
dimain: 套接字中使用的协议族。再说协议族之前我们先说说什么是协议。
如果两个挺人相隔很远但他们想要展开对话的话,就必须现决定对方方式。如果一方使用电话,那么另一方也只能使用电话,而不是书信。我们就可以这么理解,电话就是两人对话所用到的协议。 协议是对话中使用的通信规则,把上述概念拓展到计算机领域可整理为“计算机间对话必备通信规则。”
简言之, 协议就是为了完成数据交换而定好的约定。
那我们就能来聊一聊协议族了(Protocol Family)
正如 奶油意大利面和 番茄意大利面都是属于意大利面的一种,与之类似的,套接字通信的协议也具有一些分类.通过socket函数的第一个参数传递套接字中使用的协议分类信息.此协议分类信息称为协议族,可以分为如下几类(你绝对会熟悉了,因为还是老图):
上面的你也可以写为AF_INET AF_INET6(我们常用的也是这个)
IPV4和IPV6可以很明显的
IPV4现在其实有点不够分配了所以才会出现IPV6,据说是用IPV6的话,世界上每一粒沙子都能分到坐标,是不是感觉很好??但是可喜的是IPV6还没有普及开来,所以在很长一段时间里我们都还会使用IPV4。
接下来就给大家介绍第二个参数了 int type大家记住TCP和UDP就行。
当然博主不会糊弄大家的,下面就为大家详细说一说大名鼎鼎的TCP?UDP/IP是啥
先给大家一个概念:
IP负责寻路、TCP和UDP在IP之上。TCP在IP寻路完成后将那一条路链接好,后面你要发的信息的会经过IP第一次寻的路,也就是你使用TCP之后后面的数据都是走的一条路径(虽然说TCP很稳定但是并不代表TCP不会丢包,他只是在丢包之后,再发一遍而已)。UDP则不会建立连接通路,消息发了就不管对面是否能收到,这种的速度是非常快的,但是难免会造成消息丢失的情况。
给大家介绍一下分层模型:
OSI参考模型
1.物理层:主要定义物理设备标准,如网线的接口类型、光纤的接口类型、各种传输介质的传输速率等。它的主要作用是传输比特流(就是由1、0转化为电流强弱来进行传输,到达目的地后再转化为1、0,也就是我们常说的数模转换与模数转换)。这一层的数据叫做比特。
2.数据链路层:定义了如何让格式化数据以帧为单位进行传输,以及如何让控制对物理介质的访问。这一层通常还提供错误检测和纠正,以确保数据的可靠传输。如:串口通信中使用到的115200、8、N、1
3.网络层:在位于不同地理位置的网络中的两个主机系统之间提供连接和路径选择。Internet的发展使得从世界各站点访问信息的用户数大大增加,而网络层正是管理这种连接的层。
4.传输层:定义了一些传输数据的协议和端口号(WWW端口80等),如:TCP(传输控制协议,传输效率低,可靠性强,用于传输可靠性要求高,数据量大的数据),UDP(用户数据报协议,与TCP特性恰恰相反,用于传输可靠性要求不高,数据量小的数据,如QQ聊天数据就是通过这种方式传输的)。 主要是将从下层接收的数据进行分段和传输,到达目的地址后再进行重组。常常把这一层数据叫做段。
5.会话层:通过传输层(端口号:传输端口与接收端口)建立数据传输的通路。主要在你的系统之间发起会话或者接受会话请求(设备之间需要互相认识可以是IP也可以是MAC或者是主机名)。
6.表示层:可确保一个系统的应用层所发送的信息可以被另一个系统的应用层读取。例如,PC程序与另一台计算机进行通信,其中一台计算机使用扩展二一十进制交换码(EBCDIC),而另一台则使用美国信息交换标准码(ASCII)来表示相同的字符。如有必要,表示层会通过使用一种通格式来实现多种数据格式之间的转换。
7.应用层:是最靠近用户的OSI层。这一层为用户的应用程序(例如电子邮件、文件传输和终端仿真)提供网络服务。
上面的大家看看就好,能理解就最好了。
我们经常使用的是TCP/IP模型.,博主也就躲给大家说一说
TCP/IP
这个模型主要分为四层博主在这里就介绍下 网络层和传输层,以及你发送的消息是如何在网络中传送的机制,博主认为了解到这种程度其实就是足够了的。
链路层负责线路连接,设备驱动程序以及接口卡等等,我们所说的 IP 就是位于网络层。 TCP/UDP位于传输层,上面的应用层就是用户自定义的协议如 ftp等
这就是TCP/IP的通信过程:
下面博主给大家用GIF演示一下你发的消息是如何发到网络中被你朋友接收到的。
(首先我们要明白 数据要进行传输就必须先进性封装,不然数据就会消失在网络中,因为CSDN上传gif大小有限制,博主就只上传成功的情况。)
gif有限制我只能上传最差画质了。
相信大家对这个过程有一定的了解了。切记,数据要传输就必须先进行封装!!!不然是传不到目的地的。
第三个参数就涉及到了应用层自定义协议了,我们暂时都还用不到所以就默认写 0吧。
以上三个参数全部介绍完毕,希望那个大家能对我们的socket()由更深的理解。
#include<sys/socket.h> int socket(int domain, int type. int protocol); 参数含义: 第1个 int domain --> 选择: IPV4:AF_INET IPV6:AF_INET6 本地协议:AF_UNIX -->(其实还有的但是后面的基本用不到,所以博主就不介绍了) 第2个 int type --> 选择协议: SOCK_STREAM -->TCP "面向连接的、可靠的、数据完整的基于字节流的连接" SOCK_DGRAM -->UDP "面向消息的、不可靠的、无连接的、报文传输" 第3个 int protocol --> 传 0 表示使用默认协议 返回值: 成功:返回指向新创建的 socket 的文件描述符 失败:返回 -1 设置errno。
那么最后就是返回的套接字了。
Socket中文意思是“插座”,在Linux环境下,用于表示进程x间网络通信的特殊文件类型。本质为内核借助缓冲区形成的伪文件。
既然是文件,那么理所当然的,我们可以使用文件描述符引用套接字。Linux系统将其封装成文件的目的是为了统一接口,使得读写套接字和读写文件的操作一致。区别是文件主要应用于本地持久化数据的读写,而套接字多应用于网络进程间数据的传递。
在TCP/IP协议中,“IP地址+TCP或UDP端口号”唯一标识网络通讯中的一个进程。“IP地址+端口号”就对应一个socket。欲建立连接的两个进程各自有一个socket来标识,那么这两个socket组成的socket pair就唯一标识一个连接。因此可以用Socket来描述网络连接的一对一关系。
套接字,这张图能很好地解释如何运用套接字进行通信。
在网络通信中,套接字一定是成对出现的。一端的发送缓冲区对应对端的接收缓冲区。我们使用同一个文件描述符索发送缓冲区和接收缓冲区。
好啦,这就是我们socket()的全部内容了。希望大家能理解。
谢谢观看。