WinSock编程基础
一、套接字模式
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编程基础的更多相关文章
- Winsock编程基础介绍 .
相信很多人都对网络编程感兴趣,下面我们就来介绍,在网络编程中应用最广泛的编程接口Winsock API. 使用Winsock API的编程,应该了解一些TCP/IP的基础知识.虽然你可以直接使用Win ...
- Winsock编程基础2(Winsock编程流程)
1.套接字的创建和关闭 //创建套接字 SOCKET socket( int af, //指定套接字使用的地址格式,Winsock只支持AF_INET int type, //套接字类型 int pr ...
- Winsock编程基础1
1.加载和释放Winsoke库 //所有Winsock函数都是从WS2_32.DLL导出,包含相应库文件#include <winsock2.h>#pragma comment(lib, ...
- Winsock编程基础2(UDP流程)
UDP用户数据报协议 服务器端 <1 创建套接字(socket) <2 绑定IP地址和端口(bind) <3 收发数据(sendto, recvfrom) <4 关闭连接(cl ...
- windows socket网络编程基础知识
下面介绍网络7层协议在WINDOWS的实现: 7层协议 WIN系统 ________________________________________ 7 应用层 7 应用程序 ____________ ...
- 【网络编程1】网络编程基础-TCP、UDP编程
网络基础知识 网络模型知识 OSI七层模型:(Open Systems Interconnection Reference Model)开放式通信系统互联参考模型,是国际标准化组织(ISO)提出的一个 ...
- 第二章 Matlab面向对象编程基础
DeepLab是一款基于Matlab面向对象编程的深度学习工具箱,所以了解Matlab面向对象编程的特点是必要的.笔者在做Matlab面向对象编程的时候发现无论是互联网上还是书店里卖的各式Matlab ...
- [.net 面向对象编程基础] (1) 开篇
[.net 面向对象编程基础] (1)开篇 使用.net进行面向对象编程也有好长一段时间了,整天都忙于赶项目,完成项目任务之中.最近偶有闲暇,看了项目组中的同学写的代码,感慨颇深.感觉除了定义个类,就 ...
- Android开发4: Notification编程基础、Broadcast的使用及其静态注册、动态注册方式
前言 啦啦啦~(博主每次开篇都要卖个萌,大家是不是都厌倦了呢~) 本篇博文希望帮助大家掌握 Broadcast 编程基础,实现动态注册 Broadcast 和静态注册 Broadcast 的方式以及学 ...
随机推荐
- hdu 1255 覆盖的面积(线段树 面积 交) (待整理)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1255 Description 给定平面上若干矩形,求出被这些矩形覆盖过至少两次的区域的面积. In ...
- nginx 添加perl
首先,要知道你原安装的nginx版本,以及原来安装的模块,用nginx -V即可 /usr/sbin/nginx -V 结尾处的--add-module 重新安装时这里可以去掉, 然后去官网下载一个相 ...
- startService()和bindService()区别
1. 生命周期:startService()方式启动,Service是通过接受Intent并且会经历onCreate()和onStart().当用户在发出意图使之销毁时会经历onDestroy(),而 ...
- 在word中做复选框打对勾钩
在word中做复选框打对勾钩 现在终于搞明白正确的操作方法 一.你在word里输入2610,按alt+X就能出 空checkbox 你在word里输入2611,按alt+X就能出 打了勾的checkb ...
- android 开发进阶 自定义控件-仿ios自动清除控件
先上图: 开发中经常需要自定义view控件或者组合控件,某些控件可能需要一些额外的配置.比如自定义一个标题栏,你可能需要根据不同尺寸的手机定制不同长度的标题栏,或者更常见的你需要配置标题栏的背景,这时 ...
- c# 读取XML数据
1.首先调用接口,要有一个post数据到指定url并返回数据的函数: protected string PostXmlToUrl(string url, string postData) { stri ...
- AJAX(学习笔记一)
1:什么是AJAX? AJAX是一组英文单词的简写,这组英文单词是 :Asynchronous JavaScript and XML ,翻译成中文的意思是: 异步的JavaScript 和 XML.什 ...
- 未来十年的十三条思考(FW)
支付宝在某种意义上延续了“双十一”的购物狂欢. 如果你关注微信朋友圈,你会发现支付宝最近以各种广告.方案植入方式推出强劲广告.而其中很重要的一个促销手段便是,从今年12月1日到12月15日,用户在一些 ...
- Can't locate Switch.pm in @INC
the perl version (5.14) shipped with 12.10 does not include the Switch.pm module needed while buildi ...
- ASP.NET MVC 开源项目学习之ProDinner (一)
首先在github上面将ProDinner项目通过 Git Bash 克隆到本地,接下来我们开始分析这个项目吧~ 系统采用.Net 4.5, Asp.net Mvc 5,VS2012,Sql serv ...