socket的相关操做

1.建立socket:全部的东西在UNIX都是文件
socket系统调用可建立一个socket
int socket  (int domain,  int  type,  int  protocol);

domain:告诉系统使用那个底层协议族
type:指定服务类型
1.1服务类型有SOCK_STREAM和SOCK_UGRAM(数据报)
1.内核在2.16.17开始,type能够接逻辑与的参数SOCK_NONBLOCK和SOCK_CLOEXEC来表示soocket是否非阻塞
1.3protocol参数在前两个参数的下,在选择一个具体的协议
调用结果:返回一个socket文件描述符,失败返回-1而且设置errno
2.命名socket
建立的时候,咱们只是指定了地址族,可是未指定使用具体的那个socket地址
讲一个socket与socket地址绑定称为socket命名

服务器须要命名socket,客户端不须要
2.1int bind(int sockfd,const  struct  sockaddr * my_addr,socklen_t addrlen);

bind 成功返回0,失败返回-1并设置errno
2.2 常见的失败有EACCES:被绑定的地址是受保护的,仅仅是超级用户能够访问
EADDRINUSE:被绑定的地址正在使用服务器

3.监听socket、网络

建立和命名后,是不能直接被客户端访问,须要建立一个监听队列来存放待处理的客户链接dom

3.1 int listen(int sockfd, int backlog);socket

backlog参数提示内核监听队列的最大长度ide

超过以后,就再也不受理客户链接code

错误消息是ECONNREFUSED队列

listen唱功返回0,失败返回-1而且设置errnoit

完整的链接只是backlog+1 个class

4.接受链接请求

int accept(int sockfd,struct sockaddr addr,socklen_t addrlen)

问题:若是有个客户端请求出现网络异常或者掉线,会怎样?答案:accept只是从监听队列取出来链接,不论链接出于什么状态,更不会关心网络变化

相关文章
相关标签/搜索