基本的TCP编程
int socket(int family,int type,int protocol);
family:
AF_INET ipv4协议
AF_INET6 ipv6协议
AF_LOCAL unix域协议
AF_ROUTE 路由套接口
type:
SOCK_STREAM 字节流套接口
SOCK_DGRAM 数据包套接口
SOCK_RAW 原始套接口
返回一个很小的非负整数,叫做套接口描述字,简称套接字sockfd
AF_XXX地址族
PF_XXX协议族
connect()建立一个TCP连接
三次握手出错:
1 发送无应答,6秒后再次发送,无应答,24秒后再次发送,若75秒钟后仍未相应,则返回错误
2 硬错:SYN返回RST:SYN到达端口,但没有监听进程、TCP想取消一个已有的连接、TCP接受了一个根本不存在的连接
3 软错:中间路由器产生目的地不可达的ICMP错误
bind() 给套接口分配一个本地协议地址
struct sockaddr_in servaddr; servaddr.sin_addr.s_addr = htol(INADDR_ANY);
头文件<netinet/in.h>定义的所有INADDR_常值都是主机字节序,所以应该使用htol
捆绑非通配IP地址的好处是:由内核将给定的目的IP地址解复用后送往服务器进程
int listen(int sockfd,int backlog);
listen()仅被TCP服务器使用:在调用socket bind之后,accept之前
1 将未连接的套接口转换成被动套接口,指示内核应接受只想此套接口的连接请求。
2 函数第二个参数规定了,套接口排队的最大连接个数
对于给定的监听套接口,有两个队列:
1 未完成连接队列 incomplete connection queue SYN_RCVD状态
2 已完成连接队列 complete connection queue ESTABLISHED状态
accept() TCP服务器调用,从已完成的队列头返回下一个已完成的连接。若完成队列为空,则睡眠
int accept(int sockfd,struct sockaddr *cliaddr,socklen_t * addrlen);
addrlen是值-结果参数
fork()一次调用两个返回值:
1 父进程调用返回的是子进程的ID
2 子进程调用返回0
close()将套接口设置为已关闭标记,并立即返回到进程。
描述字访问计数,用于设置父进程的访问状况。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
2013-01-17 《linux c编程指南》学习手记2