目录:
一、MSG_DONTWAIT | MSG_NOSIGNAL
方法一、fcntl 函数可以将一个socket 句柄设置成非阻塞模式,设置之后每次的对于sockfd 的操作都是非阻塞的。
flags = fcntl(sockfd, F_GETFL, 0); //获取文件的flags值。 fcntl(sockfd, F_SETFL, flags | O_NONBLOCK); //设置成非阻塞模式; flags = fcntl(sockfd,F_GETFL,0); fcntl(sockfd,F_SETFL,flags&~O_NUNBLOCK); //设置成阻塞模式;
方法二、recv, send 函数的最后有一个flag 参数可以设置成MSG_DONTWAIT
临时将sockfd 设置为非阻塞模式,而无论原有是阻塞还是非阻塞。
recv(sockfd, buff, buff_size,MSG_DONTWAIT); //非阻塞模式的消息发送 send(scokfd, buff, buff_size, MSG_DONTWAIT); //非阻塞模式的消息接受
注意:linux中send函数MSG_NOSIGNAL异常消息
Linux 下当连接断开,还发送数据的时候,不仅 send() 的返回值会有反映,而且还会向系统发送一个异常消息,如果不作处理,系统会出 BrokePipe,程序会退
出,这对于服务器提供稳定的服务将造成巨大的灾难。为此,send() 函数的最后一个参数可以设置为 MSG_NOSIGNAL,禁止 send() 函数向系统发送常消息。
二、socket
#include <sys/socket.h> int socket(int family, int type, int protocol); //指定期望的通信协议类型,
返回的文件描述符和套接字描述符类似,我们成为套接字描述符,简称sockfd
AF_INET IPv4协议 SOCK_STREAM(常用) 字节流套接字 protocol:协议类型的常量或设置为0,以选择给定的family和type组合的系统默认值
#include<arpa/inet.h> int inet_pton(int family,const char *strptr,void *addrptr);//成功返回1,格式不对返回0,出错返回-1
作用:p代表表达式 n代表数值 以后所写的所有代码中都有可能会需要这个函数,所以这个函数很重要
将char所指向的字符串,通过addrptr指针存放
他的反函数: inet_ntop()作用相反。可以百度查阅这个函数的功能。因为例子里我们没有涉及到,就不介绍了。以后用到的时候再说
需要注意的是:当他发生错误的时候,errno的值会被置为EAFNOSUPPORT
#include <sys/socket.h> int connect(int sockfd,const struct sockaddr* servaddr,socklen_t addrlen);//用connect函数来建立与TCP服务器的连接 #include<unistd.h> int close(int sockfd);//关闭socket,并终止TCP连接 #include <sys/socket.h> int bind(int sockfd,const struct* myaddr,socklen_t addrlen);//把本地协议地址赋予一个套接字。 //也就是将32位的IPv4或128位ipv6与16位的TCP或者UDP组合 #include<sys/socket.h> int listen(int sockfd,int backlog)//成功返回0,失败返回-1 listen函数仅由TCP服务器调用
listen函数将会做两件事:
1:我们在创建套接字的时候使用了socket函数,它创建的套接字是主动套接字,bind函数的功能就是通过这个将主动套接字,变成被动套接字,
告诉内核应该接受指向这个套接字的请求,CLOSED状态变成LISTEN状态。
2:本函数的第二个参数规定了内核要为该套接字排队的最大连接个数。
#include <sys/socket.h> int accept(int sockfd,struct sockaddr* cliaddr,socklen_t *addrlen);//成功返回描述符,失败返回-1
1、如果第二三个参数为空,代表了,我们对客户的身份不感兴趣,因此置为NULL;
2、第一个参数为socket创建的监听套接字,返回的是已连接套接字,两个套接字是有区别的,而且非常重要。区别:我们所创建的监听套接字
一般服务器只创建一个,并且一直存在。
而内核会为每一个服务器进程的客户连接建立一个连接套接字,当服务器完成对某个给定客户的服务时,连接套接字就会被关闭。