一、基本概念
流套接字(SOCK_STREAM):流套接字用于提供面向连接、可靠的数据传输服务。该服务将保证数据能够实现无差错
、无重复发送,并按顺序接收。流套接字之所以能够实现可靠的数据服务,
原因在于其使用了传输控制协议,即TCP(The Transmission Control Protocol)协议。
数据报套接字(SOCK_DGRAM):数据报套接字提供了一种无连接的服务。该服务并不能保证数据传输的可靠性,数据有可能在传输过程
中丢失或出现数据重复,且无法保证顺序地接收到数据。数据报套接字使用UDP(User Datagram Protocol)协议进行数据的传输。由于数
据包套接字不能保证数据传输的可靠性,对于有可能出现的数据丢失情况,需要在程序中做相应的处理。
二、基本API
(一)、API介绍
服务器:
1、socket() 创建套接字
2、bind() 绑定socket和端口号
3、listen()监听端口号
4、accept()接收来自客户端的连接请求
5、recv()从socket中读取字符
6、close()关闭socket
客户端
1、socket() 创建套接字
2、connect()连接指定计算机的端口
3、send()向socket中写入信息
4、close()关闭socket
(二)
1、socket(int domain,int type int protocol)
domain:协议域 AF_INET,AF_INET6
type:指定socket类型 SOCK_STREAM 、 SOCK_DGRAM
SOCK_STREAM是基于TCP的,数据传输比较有保障。
SOCK_DGRAM是基于UDP的,专门用于局域网,基于广播
protocol 指定协议
2、int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen) ;
addr:sockfd的协议地址
addrlen:地址长度
3、 int listen(int sockfd ,int backlog) ;
sockfd:要监听的套接字
backlog:可以排队的最大连接个数
(思考socekt主和被动的情况)
4、int accept(int sockfd, struct sockaddr *addr, socklen_t *addrl addrlen) ;
sockfd:服务器的socket描述字
addr 用来返回客户端协议地址
addrlen 协议地址长度
处理连接请求后,accept 将返回新的套接字描述符。将此新的套接字连接到客户端
区分下监听套接字和已连接套接字。监听套接字,一直存在,直到该服务器关闭。
同时内核为每一个客户端创建一个已连接套接字,当客户端完成某客户服务时,关闭
这个套接字
5、read和write函数
ssize_t read(int fd, void *buf, size_t count);
当读取成功时,返回实际所读到的字节数返回值为0 表示读到了文件的结束,
小于0表示错误,如果错误为EINTR表示读是由中断引起的,如果是 ECONNREST
表示网络连接出了问题
三个参数
① socket 描述宇 fd ; ②缓冲区 buf; ③缓冲区长度 count。
write()的函数原型是:
ssize_t write(int fd, const void *buf, size_t count);
失败返回-1,成功返回写的字节数,小于0 ,表示有问题
如果错误为 EINTR 表示在写的时候出现了中
断错误。 如果为 EPIPE 表示网络连接出现了问题(对方已经关闭了连接)
3 个参数分别是:
① fd 表示 socket 描述字;② buf表示缓冲区; ③ count 表示缓冲区长度 。
6、close函数
close(fd)
这个fd是为客户端创建的套接字