套接字的基本概念
通信类型: 控制套接字如何传输和处理数据,数据以包的形式传输
- 连接(connection)类型:确保所有包依序传输,如果丢包,则请求重传
- 数据报(datagram)类型:不保证包的到达顺序,包可能丢失
名空间: 指定套接字地址格式
- 本地名空间:套接字地址为普通文件名
- Internet名空间:套接字地址由Internet地址和端口号(用于区分一台主机上的多个套接字)确定
协议: 确定数据如何传输
套接字函数
socket()函数: 创建套接字
- 原型:
int socket(int domain,int type,int protocol);
- 参数:名空间、通信类型和协议
- 名空间:PF_LOCAL(本地)或PF_INET(Internet)
- 通信类型:SOCK_STREAM(连接类型)或SOCK_DGRAM(数据报类型)
- 协议:传递0,让系统自动选择协议(通常为最佳协议)
- 返回值:套接字描述符
close()函数: 释放套接字
- 原型:
int close(int fd);
connect()函数: 创建两个套接字之间的连接
- 客户发起此系统调用,试图与服务器建立套接字连接
- 原型:
int connect(int sockfd,const struct sockaddr* addr,socklen_t addrlen);
- 参数:sockfd 为文件描述符; addr 为指向套接字地址结构体指针(服务器地址);addrlen 为服务器地址字符串的长度
- 返回值:0 连接成功; -1 连接失败
send()函数: 发送数据
- 原型:
ssize_t send(int sockfd,const void* buf,size_t len,int flags);
- 只有在套接字处于连接状态时才可调用
bind()函数: 绑定套接字与其服务器地址
- 原型:
int bind(int sockfd,const struct sockaddr* addr,socklen_t addrlen);
listen()函数: 侦听客户连接
- 原型:
int listen(int sockfd,int backlog);
- 参数:backlog 指定有多少个连接可以进入队列,超出该值的连接将被抛弃
accept()函数: 接受连接,为该连接创建一个新的套接字
- 原型
int accept(int sockfd,struct sockaddr* addr,socklen_t addrlen);
- 参数: addr 为指向套接字地址结构体(客户地址)的指针
- 返回值:创建一个新的套接字,以接受客户连接,返回值为新的套接字文件描述符
- 原先套接字文件描述符可以继续接受新连接
本地套接字示例:服务器端
#include <iostream>
#include <cstdio>
#include <c