`
xly_971223
  • 浏览: 1277684 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

阻塞 非阻塞socket的理解

阅读更多
阻塞socket是这样的
recv(socket1, buf, length);

去网卡缓冲区读取socket1的数据,读到的数据保存到buf
如果网卡缓冲区有1个字节,就返回1个,有两个就返回两个,当然不能超过length
如果网卡缓冲区没有数据,那么就一直等待,直到有数据可读
是的,很傻很执着
如果客户端再也不发送数据过来,那么就永远的等下去,这显然不够灵活
可以通过
setsockopt(sock, SOL_SOCKET, SO_RCVTIMEO, (char*)&timeout, sizeof(timeout));

设置等待时间
如果超过了这个等待时间,还没有收到数据就不等了,函数就返回

非阻塞socket是这样的
调用函数
unsigned long ul = 1;
ioctlsocket(sServer, FIONBIO, (unsigned long*)&ul);

设置为非阻塞
然后调用
recv(socket1, buf, length);

这儿的执行方式为:去查看网卡缓冲区有无数据,如果有那么读取数据并返回,如果没有不等待直接返回。这儿就是与阻塞socket的不同

非阻塞socket的数据读取方式:
BOOL SocketUtils::RecvNonBlock(SOCKET sock, char *buf, int length)
{
	const static maxRecvTimes = 10;

	int byteRead = 0;	//已读字节数
	for (int i = 0; i < maxRecvTimes; i++){
		int nVal = recv(sock, buf + byteRead, length - byteRead, 0);
		if(nVal > 0){ //读到数据
			byteRead += nVal;
			if(byteRead == length){
				return TRUE;
			}
		}else if(nVal == SOCKET_ERROR){
			if(WSAGetLastError() == WSAEWOULDBLOCK){ //非阻塞模式下,没数据可接收
				printf("[%d]Sleep 50ms\n", i);
				Sleep(50);	//睡眠一会
			}else{
				printf("recv error. ErrorCode=%d\n", WSAGetLastError());
				return FALSE;
			}
		}else if(nVal == 0){
			printf("socket connection has closed!\n");
			return FALSE;
		}
	}
	printf("[Error] Socket Recv Over %d times\n", maxRecvTimes);
	return FALSE;
}

1
4
分享到:
评论

相关推荐

    C++ socket 阻塞与非阻塞

    本话题主要探讨的是在C++ Socket编程中的阻塞模式与非阻塞模式,以及它们在多线程环境下的应用和资源管理。 一、阻塞与非阻塞模式 1. **阻塞模式**:在阻塞模式下,当一个Socket调用(如recv或send)执行时,如果...

    MFC实现非阻塞Socket通信

    首先,我们来理解“非阻塞Socket”。在传统的阻塞Socket编程中,当发送或接收数据时,程序会暂停执行,直到数据传输完成。而非阻塞模式下,Socket调用不会使调用线程挂起,而是立即返回,即使没有数据可读或可写。...

    windows的阻塞和非阻塞Socket编程

    通过分析这些代码,可以更深入地理解阻塞和非阻塞Socket编程的差异和应用场景。 在实际应用中,开发者需要根据具体需求选择合适的Socket模式。阻塞模式适合简单、低并发的应用,而非阻塞模式则适用于高并发、需要...

    socket 多线程 例程 非阻塞模式

    总之,"socket多线程例程非阻塞模式"是一个实用的编程实例,涵盖了网络通信、多线程以及异步处理的关键技术,对于学习和理解这些概念非常有价值。通过对源代码的分析和实践,开发者能够提升自己的网络编程技能,为...

    非阻塞模式socket程序

    回调函数在非阻塞Socket编程中起着关键作用。当接收到数据或发生特定事件(如连接、断开连接)时,程序会通过预先注册的回调函数通知应用层。这种方式使得处理网络事件更加灵活,应用可以根据自身需求定制事件处理...

    Linux UDP socket 设置为的非阻塞模式与阻塞模式区别

    ### Linux UDP Socket 非阻塞模式与阻塞模式的区别详解 #### 一、引言 在进行网络编程时,我们经常会遇到阻塞模式与非阻塞模式的选择问题。这两种模式直接影响程序的运行效率和资源利用率。本文将详细介绍在Linux...

    Socket C++ TCP阻塞\非阻塞 服务器 客户端 开发

    ### Socket C++ TCP阻塞与非阻塞服务器客户端开发 #### 概述 本文档将详细介绍如何使用C++ Winsock库来开发TCP非阻塞服务器。通过本篇内容的学习,您将了解到设置socket函数为非阻塞模式的方法,并且能够深入了解...

    feizuse.rar_C socket 非阻塞_网络服务_非阻塞_非阻塞 socket

    总之,这个压缩包提供了学习和实践非阻塞`socket`编程的机会,对于想要深入理解网络服务和提高服务器性能的开发者来说,是一份宝贵的资源。通过理解和应用这些知识,开发者可以设计出更高效、更具扩展性的网络应用...

    java网络编程socket非阻塞通信

    通过java网络编程深入理解socket阻塞通信和非阻塞通信的在网络中的应用 源码包每一行都有注释,在代码里面每一个类都有详细的注释来解释这个类的功能这个方法的功能,调用哪一个类的哪一个功能等等。 压缩包包含实验...

    Socket通信(TCP)非阻塞模式-select模型

    "Socket 通信(TCP)非阻塞模式-select 模型" 本资源是关于 Socket 通信的非阻塞模式下的 Select 模型的示例代码,基于 TCP 协议,分为...该示例代码可以帮助开发者更好地理解 Socket 编程和非阻塞模式下的通信。

    socket非阻塞超时设置

    在Windows环境下,如使用VC6(Visual C++ 6.0)进行开发,我们可以使用Winsock库来实现非阻塞Socket的超时设置。首先,我们需要包含必要的头文件`winsock2.h`和`ws2tcpip.h`,并链接`ws2_32.lib`库。然后,通过调用`...

    python多线程非阻塞socket

    非阻塞Socket允许Socket在等待数据时不会被挂起,而是立即返回,这样可以提高系统的整体效率。 在Python中,我们可以使用`threading`模块来创建和管理线程。创建一个线程的基本步骤包括定义一个运行函数,然后创建...

    Python实现socket非阻塞通讯功能示例

    这篇文章会详细探讨如何使用Python实现socket非阻塞通信,并结合示例分析其原理、多线程以及客户端和服务器端的具体实现技巧。 首先,了解socket编程的基础概念至关重要。Socket是计算机网络数据传输的基本操作单元...

    C++封装类CWSocket(多线程 非阻塞)

    通过阅读和分析这些代码,我们可以深入了解如何在C++中实现多线程、非阻塞的socket类,以及如何添加超时控制。 总的来说,C++封装类CWSocket的实现结合了多线程、非阻塞I/O和超时处理等关键技术,旨在提供一个高效...

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

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

    DELPHI SOCKET 阻塞通讯

    然而,对于初学者来说,理解和处理非阻塞或异步模式的复杂性可能更高,需要处理更多的边缘情况和错误处理。因此,阻塞模式通常是学习网络编程的起点,因为它提供了更简单的交互模型。 在实际应用中,选择哪种模式...

    非阻塞Socket的应用

    非阻塞Socket是一种在计算机网络编程...理解并掌握非阻塞Socket是构建高并发、高性能网络应用的关键技术之一。在设计和实现`ChatSystem_src`这样的聊天系统时,需要深入理解上述知识点,并根据具体需求进行优化和调整。

    非阻塞的Socket类20150331

    通过查看这些文件,你可以更深入地理解如何实现上述的非阻塞Socket编程。例如,"src"可能包含了具体的SocketIO接口和相关类的实现,而"bin"目录下的类文件则是经过编译后的结果,可以直接运行或反编译查看源码逻辑。...

    Java Socket学习---单线程阻塞

    为了提高效率,可以采用多线程或者非阻塞I/O(如NIO,Java的新I/O库)来改进。但是,对于初学者来说,理解单线程阻塞模型是学习网络编程的基础,有助于深入理解Socket通信的工作原理。 此外,源码分析可以帮助我们...

    异步非阻塞socket聊天室程序

    "异步非阻塞socket聊天室程序"是一个使用C++语言,并基于MFC(Microsoft Foundation Classes)库构建的项目,旨在实现高效的多用户通信。下面将详细阐述这个程序背后的关键知识点。 首先,我们关注的是"异步非阻塞...

Global site tag (gtag.js) - Google Analytics