项目学习地址:【牛客网C++服务器项目学习】
day 11
socket通信过程:
1.socket函数
int socket(int domain, int type, int protocol);
功能:
- 创建一个文件描述符用于主机之间端对端的通信
参数:
- domain:domain是指定一个协议族用于通信,能够使用的协议族在头文件<sys/socket.h>中被定义好了:
- AF_UNIX, AF_LOCAL Local communication unix(7)
- AF_INET IPv4 Internet protocols ip(7)
- AF_INET6 IPv6 Internet protocols
- type: 套接字具有指定的类型,它指定了通信语义。目前定义的类型有:(罗列用于TCP和UDP的)
- SOCK_STREAM
- SOCK_DGRAM
- protocol:在第一个参数domain中我们指定了用于通信的协议族。既然是协议族,那么一个协议族中可能会包含多个协议
参数protocol就是用来指定具体的协议的。如果该参数为0,一般是使用协议族中的默认协议。
返回值:
- 成功执行,返回一个文件描述符;错误,返回-1;
2.bind函数
int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
功能:将一个由socket()函数创建的文件描述符sockfd,在内存空间中赋于一个地址。不过这个函数通常也叫作“给socket赋于一个
名字”
参数:
- sockfd:由socket函数得到的文件描述符
- addr:socket地址结构体的首地址。客户端的IP地址和端口号信息
- addrlen:结构体的长度
返回值:成功返回0,失败返回-1;
3.listen函数
int listen(int sockfd, int backlog);
功能:Listen()将sockfd所引用的套接字标记为被动套接字,然后使用accept()函数来接收传入的连接请求的套接字。
参数:
- sockfd:需要监听(标记)的套接字文件描述符
- backlog:backlog参数定义了sockfd的挂起连接队列可以增长的最大长度。如果在队列满时到达连接请求,
客户机可能会收到一个指示为ECONNREFUSED的错误,或者,如果底层协议支持重传,则可能会忽略该请求,以便稍后重试连接成功。
返回值:成功返回0,失败返回-1;
4.connect函数
int connect(int sockfd, const struct sockaddr *addr,
socklen_t addrlen);
功能:connect()系统调用将文件描述符sockfd所引用的套接字连接到addr所指定的地址。
参数:
- sockfd:需要连接的主机的套接字
- addr:需要连接的服务端的地址
- addrlen:地址长度
返回值:成功返回0,失败返回-1;
5.accept函数
int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
功能:提取监听套接字sockfd的挂起连接队列上的第一个连接请求,创建一个新的连接套接字,并返回一个引用该套接字的新文件描述符。
参数:
- sockfd:参数sockfd是一个用socket(2)创建的套接字,用bind(2)绑定到一个本地地址,并在listen(2)之后监听连接。
- addr:一个传出参数。该结构体最后会记录下所连接的客服端的IP地址和端口号
- addrlen:第二个参数的长度
返回值:
- 成功:返回一个新的文件描述符
- 失败: -1
|