一、套接字模式

  1、阻塞模式

      创建套接字时,默认是阻塞模式,对recv函数调用会使程序进入等待状态,知道接收到数据才返回。

  2、非阻塞模式:

     可以调用ioctlsocket函数显式地让套接字工作在非阻塞模式下。

u_long ul = 1;
SOCKET s = ::socket(AF_INET,SOCK_STREAM,0);
::ioctlsocket(s,FIONBIO,(u_long*)&ul);

3、windows提供的I/O模型

    1、Select模型

           使用select函数来管理I/O

#include "../../common/InitSock.h"
#include <stdio.h> CInitSock initsock; int main(){ USHORT nPort = 4567;
SOCKET sListen = ::socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
sockaddr_in sin;
sin.sin_family = AF_INET;
sin.sin_port = htons(nPort);
sin.sin_addr.S_un.S_addr = INADDR_ANY; //服务端一般这样这是地址 //绑定套接字到本地机器
if(::bind(sListen,(sockaddr*)&sin,sizeof(sin)) == SOCKET_ERROR){
printf("Failed bind()\n");
return -1;
} //进入监听模式
::listen(sListen,5); //select模型处理过程
//1)初始化一个套接字fdsocket,添加监听套接字句柄到这个集合
fd_set fdsocket; //所有可用套接字集合
FD_ZERO(&fdsocket);
FD_SET(sListen,&fdsocket); while(TRUE){
//2)将fdsocket集合的一个拷贝fdRead传递给select函数
// 当有事情发生时,select函数移除fdRead集合中没有未决I/O操作的套接字句柄,然后返回
fd_set fdRead = fdsocket;
int nRet = ::select(0,&fdRead,NULL,NULL,NULL);
if(nRet > 0){
//3)通过将原来fdsocket集合与select处理过的fdread集合比较
// 确定有哪些套接字有未决I/O, 并进一步处理这些I/O
for (int i = 0; i != (int)fdsocket.fd_count; ++i)
{
if(FD_ISSET(fdsocket.fd_array[i],&fdRead)){
if(fdsocket.fd_array[i] == sListen){//(1)监听套接字接收到新连接
if(fdsocket.fd_count < FD_SETSIZE){
sockaddr_in addrRemote;
int nAddrLen = sizeof(addrRemote);
SOCKET sNew = ::accept(sListen,(SOCKADDR*)&addrRemote,&nAddrLen);
FD_SET(sNew,&fdsocket);
printf("接收到连接%s\n",::inet_ntoa(addrRemote.sin_addr));
}else{
printf("too much connections!\n");
continue;
}
}else{
char szText[256];
int nRecv = ::recv(fdsocket.fd_array[i],szText,strlen(szText),0);//可读
if(nRecv > 0){
szText[nRecv] = '\n';
printf("接收到数据:%s",szText);
}else{ //连接关闭 重启或中断
::closesocket(fdsocket.fd_array[i]);
FD_CLR(fdsocket.fd_array[i],&fdsocket);
}
}
}
}
}else{
printf("Failed select()\n");
break;
}
} return 0;
}

   

    2、WSAAsyncSelect模型

        WSAAsyncSelect模型允许应用程序以windows消息的形式接受到网络时间通知。 MFC的CSocket也是该模型。

        (为适应windows的消息驱动环境而设置的,现在许多对性能要求不高的网络应用程序都采用WSAASyncSelect模型)

    3、WSAEventSelect模型

    4、重叠(Overlapped)I/O模型

WinSock编程基础的更多相关文章

  1. Winsock编程基础介绍 .

    相信很多人都对网络编程感兴趣,下面我们就来介绍,在网络编程中应用最广泛的编程接口Winsock API. 使用Winsock API的编程,应该了解一些TCP/IP的基础知识.虽然你可以直接使用Win ...

  2. Winsock编程基础2(Winsock编程流程)

    1.套接字的创建和关闭 //创建套接字 SOCKET socket( int af, //指定套接字使用的地址格式,Winsock只支持AF_INET int type, //套接字类型 int pr ...

  3. Winsock编程基础1

    1.加载和释放Winsoke库 //所有Winsock函数都是从WS2_32.DLL导出,包含相应库文件#include <winsock2.h>#pragma comment(lib, ...

  4. Winsock编程基础2(UDP流程)

    UDP用户数据报协议 服务器端 <1 创建套接字(socket) <2 绑定IP地址和端口(bind) <3 收发数据(sendto, recvfrom) <4 关闭连接(cl ...

  5. windows socket网络编程基础知识

    下面介绍网络7层协议在WINDOWS的实现: 7层协议 WIN系统 ________________________________________ 7 应用层 7 应用程序 ____________ ...

  6. 【网络编程1】网络编程基础-TCP、UDP编程

    网络基础知识 网络模型知识 OSI七层模型:(Open Systems Interconnection Reference Model)开放式通信系统互联参考模型,是国际标准化组织(ISO)提出的一个 ...

  7. 第二章 Matlab面向对象编程基础

    DeepLab是一款基于Matlab面向对象编程的深度学习工具箱,所以了解Matlab面向对象编程的特点是必要的.笔者在做Matlab面向对象编程的时候发现无论是互联网上还是书店里卖的各式Matlab ...

  8. [.net 面向对象编程基础] (1) 开篇

    [.net 面向对象编程基础] (1)开篇 使用.net进行面向对象编程也有好长一段时间了,整天都忙于赶项目,完成项目任务之中.最近偶有闲暇,看了项目组中的同学写的代码,感慨颇深.感觉除了定义个类,就 ...

  9. Android开发4: Notification编程基础、Broadcast的使用及其静态注册、动态注册方式

    前言 啦啦啦~(博主每次开篇都要卖个萌,大家是不是都厌倦了呢~) 本篇博文希望帮助大家掌握 Broadcast 编程基础,实现动态注册 Broadcast 和静态注册 Broadcast 的方式以及学 ...

随机推荐

  1. Socket网络编程例子

    1.为了安全的进行通信,基于ACK确认机制----重传机制 使用selector机制的多路复用的IO通信机制,此外还有epoll控制 业务挂接点或者接入点: 常见的接入点: RDBMS进行CRUD M ...

  2. ASP.NET MVC 之 View 测试

    项目又出问题了!手贱了一下,使用某个工具整理了一下 View 中的内容,不经意之间,将 View 的输出中大小写不小心搞错了,导致输出的内容没有办法正常解析. 这种问题太隐蔽了,下次再遇到怎么办呢? ...

  3. vc读写注册表

    注册表是Windows重要组成部分,注册表记录了大量有关电脑软硬件的信息.注册表中的值通过其名称标识.值名称由与键名相同的字符组成.值本身可以是字符串.二进制数据或者是32位无符号值.在这里我们主要运 ...

  4. python连mysql时避免出现乱码

    使用python连mysql时候,常常出现乱码,采取以下措施可以避免 1 Python文件设置编码 utf-8 (文件前面加上 #encoding=utf-8)2 MySQL数据库charset=ut ...

  5. SDUT 3344 数据结构实验之二叉树五:层序遍历

    数据结构实验之二叉树五:层序遍历 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Problem Description 已知一个按 ...

  6. powerdesigner中怎么给一主键设为自增型auto increme

    在使用powerdesigner 设计数据库表时,通常要对主键进行设置,如果主键是int 类型,一般会设置成自增,那么怎么在 powerdesigner 中设置呢,以下是具体的方法: 在所要设为自增型 ...

  7. centos下的防火墙配置

    1,查看防火墙文件: vim /etc/sysconfig/iptables # Generated by iptables-save v1. :: *filter :INPUT ACCEPT [:] ...

  8. 生成ssl证书

    http://blog.csdn.net/liuchunming033/article/details/48470575 https://segmentfault.com/a/119000000256 ...

  9. Oracle笔记 十二、PL/SQL 面向对象oop编程

    ------------------------抽象数据类型----------- --创建地址类型,一定要加as object,还可以在类型中加过程或方法 create or replace typ ...

  10. IE 不兼容的几个js问题及解决方法1

    IE 不兼容的几个js问题及解决方法 1 Table的问题   在动态新增tr或者td时,createElecment() 一般用appendChild();都不生效,解决办法是用新增tbody, 如 ...