设置linux的socket的非阻塞模式
2014-12-30 16:25
162 查看
http://blog.csdn.net/zqf_office/article/details/8833233
设置linux的socket的非阻塞模式
int setnonblocking(int sockfd)
{
if (fcntl(sockfd, F_SETFL, fcntl(sockfd, F_GETFD, 0)|O_NONBLOCK) == -1)
{
return -1;
}
return 0;
}
关于TCP_CORK选项
TCP_CORK选项与TCP_NODELAY一样,是控制Nagle化的。
1、打开TCP_NODELAY选项,则意味着无论数据包是多么的小,都立即发送(不考虑拥塞窗口)。
2、如果将TCP连接比喻为一个管道,那TCP_CORK选项的作用就像一个塞子。设置TCP_CORK选项,就是用塞子塞住管道,而取消TCP_CORK选项,就是将塞子拔掉。例如下面这段代码:
当TCP_CORK选项被设置时,TCP链接不会发送任何的小包,即只有当数据量达到MSS时,才会被发送。当数据传输完成时,通常需要取消该选项,以便被塞住,但是又不够MSS大小的包能及时发出去。如果应用程序确定能一起发送多个数据集合(例如HTTP响应的头和正文),建议设置TCP_CORK选项,这样在这些数据之间不存在延迟。为提升性能及吞吐量,Web Server、文件服务器这一类一般会使用该选项。
著名的高性能Web服务器Nginx,在使用sendfile模式的情况下,可以设置打开TCP_CORK选项:将nginx.conf配置文件里的tcp_nopush配置为on。(TCP_NOPUSH与TCP_CORK两个选项实现功能类似,只不过NOPUSH是BSD下的实现,而CORK是Linux下的实现)。另外Nginx为了减少系统调用,追求性能极致,针对短连接(一般传送完数据后,立即主动关闭连接,对于Keep-Alive的HTTP持久连接除外),程序并不通过setsockopt调用取消TCP_CORK选项,因为关闭连接会自动取消TCP_CORK选项,将剩余数据发出。
设置linux的socket的非阻塞模式
int setnonblocking(int sockfd)
{
if (fcntl(sockfd, F_SETFL, fcntl(sockfd, F_GETFD, 0)|O_NONBLOCK) == -1)
{
return -1;
}
return 0;
}
关于TCP_CORK选项
TCP_CORK选项与TCP_NODELAY一样,是控制Nagle化的。
1、打开TCP_NODELAY选项,则意味着无论数据包是多么的小,都立即发送(不考虑拥塞窗口)。
2、如果将TCP连接比喻为一个管道,那TCP_CORK选项的作用就像一个塞子。设置TCP_CORK选项,就是用塞子塞住管道,而取消TCP_CORK选项,就是将塞子拔掉。例如下面这段代码:
int on = 1; setsockopt(sockfd, SOL_TCP, TCP_CORK, &on, sizeof(on)); //set TCP_CORK write(sockfd, ...); //e.g., http header sendfile(sockfd, ...); //e.g., http body on = 0; setsockopt(sockfd, SOL_TCP, TCP_CORK, &on, sizeof(on)); //unset TCP_CORK |
著名的高性能Web服务器Nginx,在使用sendfile模式的情况下,可以设置打开TCP_CORK选项:将nginx.conf配置文件里的tcp_nopush配置为on。(TCP_NOPUSH与TCP_CORK两个选项实现功能类似,只不过NOPUSH是BSD下的实现,而CORK是Linux下的实现)。另外Nginx为了减少系统调用,追求性能极致,针对短连接(一般传送完数据后,立即主动关闭连接,对于Keep-Alive的HTTP持久连接除外),程序并不通过setsockopt调用取消TCP_CORK选项,因为关闭连接会自动取消TCP_CORK选项,将剩余数据发出。
相关文章推荐
- 设置linux的socket的非阻塞模式
- Linux UDP socket 设置为的非阻塞模式与阻塞模式区别
- 如何设置socket的Connect超时(linux)?
- 如何设置socket的Connect超时(linux)
- linux下将socket设置为非阻塞的方法
- Windows 和 Linux下使用socket下载网页页面内容(可设置接收/发送超时)的代码
- Windows 和 Linux下使用socket下载网页页面内容(可设置接收/发送超时)的代码
- [linux] 将socket设置为非阻塞(non-blocking)
- Linux下socket设置为非阻塞方式和fcntl系统调用
- Linux下socket设置为非阻塞方式和fcntl系统调用
- [linux] 将socket设置为非阻塞(non-blocking)
- 非阻塞模式的设置、设置socket为非阻塞模式 解决connect阻塞问题
- unix/linux socket设置非阻塞
- 如何设置socket的Connect超时(linux)
- 设置socket的非阻塞模式
- unix/linux socket设置非阻塞io
- 如何设置socket的Connect超时(linux)
- iphone设置非阻塞模式socket两种方法
- 看到关于socket非阻塞模式设置方式记录一下。
- Linux socket设置mark的必要性