十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
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、
创建和命名后,是不能直接被客户端访问,需要创建一个监听队列来存放待处理的客户连接
3.1 int listen(int sockfd, int backlog);
backlog参数提示内核监听队列的大长度
超过之后,就不再受理客户连接
错误消息是ECONNREFUSED
listen唱功返回0,失败返回-1并且设置errno
完整的连接只是backlog+1 个
4.接受连接
int accept(int sockfd,struct sockaddr addr,socklen_t addrlen)
问题:如果有个客户端请求出现网络异常或者掉线,会怎样?
答案:accept只是从监听队列取出来连接,不论连接出于什么状态,更不会关心网络变化
另外有需要云服务器可以了解下创新互联cdcxhl.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。