socket基础API(socket,bind,listen,accept,close)深入解析

本文深入解析了Linux网络编程中的关键API,包括socket()用于创建套接字,bind()绑定IP和端口,listen()设置监听队列长度,accept()接收客户端连接,以及close()关闭套接字。详细讨论了各调用的参数、返回值和异常情况,例如EADDRINUSE和ECONNREFUSED错误。
摘要由CSDN通过智能技术生成

①socket()系统调用声明

int socket(int domain,int type,int protocol);

domain告诉系统使用哪个底层的协议族:

PF_INET:IPV4
PF_INET6:IPV6

type参数指定服务类型

SOCK_STREAM服务(流服务)–TCP
SOCK_UGRAM服务(数据报)服务–UDP

protocal参数是在前两个参数构成的协议集合下,再选择一个具体的协议,几乎所有情况下我们把它设置为0,表示默认协议

------------------------------------------------------------
②bind()系统调用的声明

int bind(int sockfd,const struct sockaddr* my_addr,socklen_t addrlen);

bind成功时候返回0,失败返回-1,并设置errno

最常见的两种errno是EACCESEADDRINUSE

EASSES:被绑定的地址是受保护的地址,仅超级用户可以访问。比如普通用户将一个socket绑定到知名服务端口(端口为0-1023)上时,bing将返回ESACCES错误。

EADDRINUSE:被绑定的端口正在使用中,比如将一个socket绑定到一个TIME_WAIT状态的socket地址。
--------------------------------------------------------------
③listen()系统调用声明:

int listen(int sockfd,int backlog);

backlog参数提示内核监听队列的最大长度,监听队列的长度如果超过backlog,则服务器将不再受理新的客户连接,客户端也将受到ECONNREFUSED错误信息

在LINUX内核2.2版本之前,backlog参数指的是处于所有半连接(SYN_RCVD)和完全连接状态(ESTABLISHED)的socket的上限,但自从内核2.2之后它只表示处于完全连接的socket的上限,处于半连接状态的socket上限则由/proc/sys/net/i[v4/tcp_max_syn_backlog内核参数指定。backlog的典型值为5

假设backlog值设置为5,在程序运行后会发现会有>=5的连接连接上,也就是处于ESTABLISHED状态,但不会很多,一般是backlog+1的值,而其他的连接则会处于SYN_RCVD状态,在不同的系统上会有不同 的值,不过监听队列中完整的连接上限通常比backlog值大

listen成功返回0,失败返回-1,并设置errno。

---------------------------------------------------------------
④accept()系统调用


                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值