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 的方式以及学 ...
随机推荐
- 黑马程序员_Java基本数据的自动拆装箱及享元设计模式视频学习笔记
------- android培训.java培训.期待与您交流! ---------- 装箱:把基本数据类型装成java类(被托管?). 拆箱:把java类拆成基本数据类型(取消托管? ...
- Android:Java代码添加按钮
LinearLayout layout = (LinearLayout) findViewById(R.id.container); Button bn = new Button(this); bn. ...
- MFC学习 事件临界区
事件: #include <Windows.h> #include <iostream> DWORD WINAPI Func1Pro(LPVOID lpParameter); ...
- Xml语言
一.XML是什么?作用是什么? l XML ( eXtensible Markup Language )语言是一种可扩展的标记语言.其中的可扩展是相对HTML来说的.因为XML标签没有被预定义,需要 ...
- VS集成Qt环境搭建
环境:VS2010 + Qt5.2 关于VS的下载.安装,这里就不再做过多阐述. 一.下载Qt5.2安装包(qt-windows-opensource)与Qt插件(Visual Studio Add- ...
- 静态库制作.a .framework
一.静态库 .a 制作 1.新建一个Cocoa Touch Static Library 2.往里面添加文件,或者自己新建 3.添加一个Headers Phase ...
- sublime Text及package control的安装
1.下载并安装sublime Text2http://www.baidu.com/s?wd=sublime&rsv_spt=1&issp=1&f=8&rsv_bp=0& ...
- table extraction
http://yz.mit.edu/papers/webtables-vldb08.pdf http://www.vldb.org/pvldb/vol4/p528-venetis.pdf Alon H ...
- 二模11day2解题报告
T1.修改文章(amend) 给出n个单词和一个长度为m的字符串,求改动多少个字符才能使字符串全由单词组成. 要说这道题还真的坑很坑超坑非常坑无敌坑--不过还是先想到了动规.毕竟要修改的前提是要组成的 ...
- Jsp servlet 值传递。。
先新建一个动态WEB项目. 展开WebRoot/index.jsp 1 <%@ page language="java" import="java.util.*&q ...