`
isiqi
  • 浏览: 16158219 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

CSocket关于连接和阻塞!!

阅读更多

基于阻塞发送和接收二进制数据。

比如可以Client端发送,Server端接收

Server端:m_recvive. Receive( void* lpBuf int nBufLen int nFlags = 0 );

Client端:m_client. Send( const void* lpBuf int nBufLen int nFlags = 0 );

接着再分析一下各个类中提到的常用方法的同步特性。

Listen(…):执行后不管有没有连接,立即返回。

Connect(…):如果服务器端有端口正在侦听,则立即成功返回,如果没有,则过几秒钟显示无法连接。

Accept(…):Listen函数返回后可以执行此函数,但是此函数是基于阻塞的,只要客户机connect连接并且端口正确,则立即成功返回,建立连接。如果迟迟侦测不到连接,则不断阻塞,直到连接成功或者强行关闭。

Send(…)调用后就将数据保存在socket缓冲区中,立即返回。

Receive(…):和Accept一样的阻塞,直到能从socket缓冲区成功读取到nBufLen长度的数据。

既然如此,应该会想到这样会产生两个问题:

1、 在侦听的时候,如果客户端迟迟没有连接,则侦听方执行到Accept则阻塞不能响应。

2、 在用Receive接收数据,如果迟迟得不到发送的数据,也阻塞不能响应。

带有这两个问题的软件显然是不能忍受的。

幸亏CSocket类里可以使用继承自CAsyncSocket里的OnReceiveOnAccept消息处理函数,其原理分别是:

1、 OnAccept()Listen过后,如果侦测到客户机有连接,则产生消息调用OnAccept(),一般可以在此函数里面调用Accept便可避免侦听时的阻塞。

virtual void OnAccept( int nErrorCode );

参数nErrorCode:套接字上最近的错误代码。此成员函数可用的错误代码有:

l 0:函数成功地执行并返回。

l WSAENETDOWN:Windows Sockets检测到网络系统故障。说明由框架调用,通知监听套接字现在可以调用Accept成员函数来接收挂起的连接请求(有connect请求进入)。

2、 OnReceive():建立连接后,如果侦测到Socket缓冲区里有数据到达,便自动调用OnReceive(),在此函数里面使用Receive接收就可避免接收数据的阻塞。

virtual void OnReceive( int nErrorCode );参数nErrorCode套接字上最近的错误代码。此成员函数可用的错误代码有:

l 0:函数成功地执行并返回。

l WSAENETDOWN:Windows Sockets检测到了网络故障。说明本函数由框架调用,通知套接字缓冲中有数据,可以调用Receive成员函数取出。

分享到:
评论

相关推荐

    CSocket编程介绍

    它与CSocketFile类和CArchive类合作完成对数据的发送、接收的管理,并提供了对于同步操作CArchive对象非常重要的阻塞功能,使程序员在管理数据的发送和接收的工作变得简单。本篇只介绍如何使用CSocket类实现网络连接...

    简单的聊天室(基于CSocket,C/S)

    这个是为课程设计作业做的,VC6.0编译通过,基于CSocket非阻塞的服务器/客户端思路做的,初学者适用

    CSocket类编程的在线聊天例子

    1.用VC++6.0编程,CSocket类 2.TCP网络通讯,在线聊天室 3.无阻塞的消息响应函数 4.可以发送,接收消息。 5.如果本机网络无连接,服务器端和客户端同事在本机运行时,IP请填写127.0.0.1

    MFC疑难注解:CAsyncSocket及CSocket

    异步非阻塞模式有时也被称为长连接,同步阻塞模式则被称为短连接。 在异步非阻塞模式下,你可以设计两个函数,其中一个函数记录起跑时间和学生号,该函数你会主动调用 100 次;另一个函数记录到达时间和学生号,该...

    ChatRoom(Winsock).rar_WINSOCK_socket 非阻塞_非阻塞

    这个程序要完成一个聊天室的功能,它是用纯的winsock的去写,而不用任何CSocket的东西, 即可以用来做客户端又可以用来做服务器端,它要求是非阻塞方式的连接。

    非阻塞式socket编程select()

    作者:康华,华清远见嵌入式学院上海中心讲师。  现在我们讲使用数据库来进行变成,具体的提供了SELECT INSERT UPDATE DELETE等数据库的执行语句,这是在... 这些类提供了访问数据库,提出一个连接请求,如同文件

    网络编程实用教程(第三版).zip

    2.3.4 进程的阻塞问题和对策 40 2.4 无连接的套接字编程 43 2.4.1 高效的用户数据报协议 43 2.4.2 无连接的套接字编程的两种模式 43 2.4.3 数据报套接字的对等模式编程实例 45 2.5 原始套接字 47 2.5.1...

    WinSock 网络通信开发 pdf.rar

    网络通信与WinSock开发基础篇——讲述Winsock基本概念、TCP/IP协议与Winsock、Winsock通信与C/S结构、MFC中的Winsock封装类、Winsock网络编程的常用术语、Socket无连接通信机制与实现、面向连接的通信机制与实现、...

    基于VC编聊天室程序

    这个程序要完成一个聊天室的功能,它是用纯的winsock的去写,而不用任何CSocket的东西, 即可以用来做客户端又可以用来做服务器端,它要求是非阻塞方式的连接。

    实现基于事件通知的.Net套接字

    以前学过MFC,我用过的它里面的包装Winsock的两个类CSocket和CAsyncSocket,我一直觉得它哪个事件通知的功能比较不错,特别是在连接的两方收发数据没有一定的规律的时候比较有用,虽然不用它的事件通知也可以实现功能...

Global site tag (gtag.js) - Google Analytics