`

非阻塞connect编程

阅读更多

非阻塞模式有3种用途

  1.三次握手同时做其他的处理。connect要花一个往返时间完成,从几毫秒的局域网到几百毫秒或几秒的广域网。这段时间可能有一些其他的处理要执行,比如数据准备,预处理等。
  2.用这种技术建立多个连接。这在web浏览器中很普遍.
  3.由于程序用select等待连接完成,可以设置一个select等待时间限制,从而缩短connect超时时间。多数实现中,connect的超时时间在75秒到几分钟之间。有时程序希望在等待一定时间内结束,使用非阻塞connect可以防止阻塞75秒,在多线程网络编程中,尤其必要。 例如有一个通过建立线程与其他主机进行socket通信的应用程序,如果建立的线程使用阻塞connect与远程通信,当有几百个线程并发的时候,由于网络延迟而全部阻塞,阻塞的线程不会释放系统的资源,同一时刻阻塞线程超过一定数量时候,系统就不再允许建立新的线程(每个进程由于进程空间的原因能产生的线程有限),如果使用非阻塞的connect,连接失败使用select等待很短时间,如果还没有连接后,线程立刻结束释放资源,防止大量线程阻塞而使程序崩溃。

 

 

 

// 设置套接字为非阻塞

flags = fcntl(sock[i],F_GETFL,0);

fcntl(sock[i],F_SETFL,flags|O_NONBLOCK);

 

 

fcntl(文件描述词操作

 

相关函数
open,flock
表头文件
#include<unistd.h>
#include<fcntl.h>
定义函数
int fcntl(int fd , int cmd);
int fcntl(int fd,int cmd,long arg);
int fcntl(int fd,int cmd,struct flock * lock);
函数说明
fcntl()用来操作文件描述词的一些特性。参数fd代表欲设置的文件描述词,参数cmd代表欲操作的指令。
有以下几种情况:
F_DUPFD用来查找大于或等于参数arg的最小且仍未使用的文件描述词,并且复制参数fd的文件描述词。执行成功则返回新复制的文件描述词。请参考dup2()。F_GETFD取得close-on-exec旗标。若此旗标的FD_CLOEXEC位为0,代表在调用exec()相关函数时文件将不会关闭。
F_SETFD 设置close-on-exec 旗标。该旗标以参数arg 的FD_CLOEXEC位决定。
F_GETFL 取得文件描述词状态旗标,此旗标为open()的参数flags。
F_SETFL 设置文件描述词状态旗标,参数arg为新旗标,但只允许O_APPEND、O_NONBLOCK和O_ASYNC位的改变,其他位的改变将不受影响。
F_GETLK 取得文件锁定的状态。
F_SETLK 设置文件锁定的状态。此时flcok 结构的l_type 值必须是F_RDLCK、F_WRLCK或F_UNLCK。如果无法建立锁定,则返回-1,错误代码为EACCES 或EAGAIN。
F_SETLKW F_SETLK 作用相同,但是无法建立锁定时,此调用会一直等到锁定动作成功为止。若在等待锁定的过程中被信号中断时,会立即返回-1,错误代码为EINTR。参数lock指针为flock 结构指针,定义如下
struct flcok
{
short int l_type; /* 锁定的状态*/
short int l_whence;/*决定l_start位置*/
off_t l_start; /*锁定区域的开头位置*/
off_t l_len; /*锁定区域的大小*/
pid_t l_pid; /*锁定动作的进程*/
};
l_type 有三种状态:
F_RDLCK 建立一个供读取用的锁定
F_WRLCK 建立一个供写入用的锁定
F_UNLCK 删除之前建立的锁定
l_whence 也有三种方式:
SEEK_SET 以文件开头为锁定的起始位置。
SEEK_CUR 以目前文件读写位置为锁定的起始位置
SEEK_END 以文件结尾为锁定的起始位置。
返回值
成功则返回0,若有错误则返回-1,错误原因存于errno.

 

 

 

此时socket设置为非阻塞,connect调用后,无论连接是否建立立即返回-1,同时将errno(包含errno.h就可以直接使用)设置为EINPROGRESS, 表示此时tcp三次握手仍旧进行,如果errno不是EINPROGRESS,则说明连接错误,程序结束。(当客户端和服务器端在同一台主机上的时候,connect回马上结束,并返回0;无需等待。

 

ret = connect(sock[i],(struct sockaddr *)&tracker[i],
				          sizeof(struct sockaddr));
if(ret < 0 && errno != EINPROGRESS)  valid[i] = 0;

 

EINPROGRESS

The socket is non-blocking, and the connection cannot be completed immediately. You can use select(3C) to complete the connection by selecting the socket for writing.

 

 

过调用 getsockopt(sockfd,SOL_SOCKET,SO_ERROR,&error,&len); 函数返回值来判断是否发生错误

int error, len;

error = 0;

len = sizeof(error);

if(getsockopt(sock[i],SOL_SOCKET,SO_ERROR,&error,&len) < 0) {

valid[i] = 0;

close(sock[i]);

}

error返回0则表示连接成功!

 

 

分享到:
评论

相关推荐

    linux客户端Socket非阻塞connect编程[归纳].pdf

    Linux 客户端Socket 非阻塞 connect 编程详解 本文档详细介绍了 Linux 客户端 Socket 非阻塞 connect 编程的实现方法和原理。非阻塞 connect 是一种高效的网络编程技术,能够提高程序的性能和可靠性。 一、非阻塞 ...

    linux客户端Socket非阻塞connect编程收集.pdf

    Linux 客户端 Socket 非阻塞 connect 编程收集 本文档主要讨论了 Linux 客户端 Socket 非阻塞 connect 编程的实现与应用,非阻塞 connect 编程的主要用途有三种: 1. 三次握手同时做其他的处理。在 connect 过程中...

    QTcpSocket通信编程时阻塞与非阻塞的问题 - findumars - 博客园1

    在QTcpSocket的编程中,我们经常会遇到阻塞和非阻塞两种模式的选择。这两种模式在处理网络通信时有着不同的行为和应用场景。 首先,阻塞模式意味着在执行某些操作(如连接、读取或写入数据)时,QTcpSocket会暂停...

    非阻塞TCP,VC2010,更新版

    非阻塞TCP编程是计算机网络通信中的一个重要概念,特别是在高并发和实时性要求较高的系统中。在传统的TCP编程中,通常使用阻塞模式,即一个线程在等待数据到达时会被挂起,直到数据到达才会继续执行。然而,这种模式...

    Linux下的Socket编程实例(阻塞和非阻塞)

    Linux下的Socket编程实例(阻塞和非阻塞) 通过分析给定的文件信息,我们可以生成以下知识点: Socket编程概述 Socket 编程是指使用操作系统提供的 socket 编程接口来实现网络通信的编程方式。Socket 编程可以实现...

    C++ TCP客户端非阻塞连接超时测试源码

    非阻塞连接是网络编程中的一个重要概念,它允许客户端在发起连接请求后不立即等待服务器的响应,而是继续执行其他任务。这种方式提高了程序的效率,避免了因为等待响应而被挂起的情况。在C++中,可以使用`select()`...

    非阻塞tcpip通讯

    非阻塞TCP/IP通信是一种高效的网络编程模型,它在处理大量并发连接时具有显著优势。在传统的阻塞模式下,一个套接字调用(如recv或send)会一直阻塞,直到有数据可读或发送空间可用。然而,在非阻塞模式下,这些调用...

    Linux非阻塞套接字client

    在Linux系统中,非阻塞套接字编程是一种高级网络通信技术,主要用于提高程序的并发性和效率。非阻塞模式允许程序在等待数据时不会被挂起,而是立即返回一个状态,让程序可以处理其他任务,从而避免了线程或进程的...

    IO中同步、异步与阻塞、非阻塞的区别

    在软件开发领域,尤其是在涉及输入输出(IO)操作时,理解同步与异步、阻塞与非阻塞的概念是非常重要的。这些概念对于设计和实现高效的程序至关重要,尤其是在高并发和分布式系统中。 一、同步与异步 同步和异步是...

    非阻塞异步传输java网络编程(含源代码)

    ### 非阻塞异步传输Java网络编程 #### 实验背景及目标 本实验旨在通过Java语言实现一种基于自定义协议的文件传输系统,包括一个文件传输服务器(FileServer)和一个客户端(FileClient)。该系统的特点在于采用了非...

    python多线程非阻塞socket

    在Python编程中,多线程和非阻塞的Socket技术是构建高效网络应用程序的关键组成部分。本文将深入探讨如何在Python中实现多线程非阻塞的Socket服务端和客户端,以提升并发处理能力。 首先,让我们理解“多线程”和...

    VC2010,非阻塞TCP简单源码

    本篇将深入讲解基于VC2010环境下的非阻塞TCP(Transmission Control Protocol)网络编程。非阻塞模式允许程序在等待数据到来时,不被阻塞并可以执行其他任务,从而提高系统的效率和响应性。 首先,我们要理解TCP的...

    阻塞及非阻塞通信

    阻塞与非阻塞通信是计算机网络编程中的两种基本通信方式,主要涉及到Java NIO(Non-blocking Input/Output,非阻塞输入/输出)框架。Java NIO 提供了一种新的方式来处理I/O操作,使得程序在进行读写操作时,不再必须...

    非阻塞java通信代码

    非阻塞Java通信是一种高效的网络编程模式,它允许程序在等待数据就绪时继续执行其他任务,而不是简单地挂起,直到数据准备完毕。这种方式提高了系统资源利用率和并发能力,尤其适用于高并发的网络服务。在Java中实现...

    异步非阻塞socket聊天室程序

    在IT领域,网络编程是不可或缺的一部分,特别是在开发实时交互系统如聊天室时。"异步非阻塞socket聊天室程序"是一个...理解并掌握异步非阻塞的socket编程对于任何希望从事网络编程的IT专业人员来说都是至关重要的技能。

    C/C++ 学习代码实例 - socket编程代码(包括阻塞式、非阻塞式:select/epoll模式)

    本资料包“C/C++ 学习代码实例 - socket编程代码(包括阻塞式、非阻塞式:select/epoll模式)”提供了一些关键知识点,帮助开发者深入了解 socket 编程。 首先,我们来讨论 socket 编程。Socket 是网络通信的基本...

    从linux源码看socket的阻塞和非阻塞1

    以一个简单的非阻塞TCP客户端为例,它创建一个Socket并设置为非阻塞模式,然后通过`connect()`函数发起连接请求。在非阻塞模式下,`recv()`函数可能在连接尚未完全建立或没有数据可接收时返回EAGAIN或EWOULDBLOCK...

    Qt模式弹框不阻塞

    总之,“Qt模式弹框不阻塞”是一种利用透明顶层窗口实现的非阻塞式交互方式,它结合了模态对话框的视觉焦点和非模态窗口的可操作性,为用户界面设计提供了更多的灵活性。在Qt编程中,通过设置窗口属性和旗标,我们...

    windows下设置socket的connect超时

    通过以上介绍,我们可以看到在Windows环境下设置socket连接超时的主要步骤包括:建立socket、设置非阻塞模式、调用connect、使用select检测socket状态、判断connect结果以及最后将socket恢复为阻塞模式。这些步骤...

    Linux下多线程的阻塞模式下的socket编程

    首先,理解“阻塞”和“非阻塞”模式。在Linux的socket编程中,阻塞模式是指当一个套接字(socket)调用如recv或send等函数时,如果数据未准备好,那么该调用会一直等待,直到数据可用才会返回。相反,非阻塞模式下...

Global site tag (gtag.js) - Google Analytics