`
deepfuture
  • 浏览: 4329095 次
  • 性别: Icon_minigender_1
  • 来自: 湛江
博客专栏
073ec2a9-85b7-3ebf-a3bb-c6361e6c6f64
SQLite源码剖析
浏览量:79390
1591c4b8-62f1-3d3e-9551-25c77465da96
WIN32汇编语言学习应用...
浏览量:68278
F5390db6-59dd-338f-ba18-4e93943ff06a
神奇的perl
浏览量:101369
Dac44363-8a80-3836-99aa-f7b7780fa6e2
lucene等搜索引擎解析...
浏览量:280936
Ec49a563-4109-3c69-9c83-8f6d068ba113
深入lucene3.5源码...
浏览量:14580
9b99bfc2-19c2-3346-9100-7f8879c731ce
VB.NET并行与分布式编...
浏览量:65443
B1db2af3-06b3-35bb-ac08-59ff2d1324b4
silverlight 5...
浏览量:31264
4a56b548-ab3d-35af-a984-e0781d142c23
算法下午茶系列
浏览量:45143
社区版块
存档分类
最新评论

WIN网络编程-select(I/O模型)

阅读更多

//////////////////////////////////////////////////////
// select.cpp文件

//select的优点是程序能够在单个线程内同时处理多个套接字连接,但是增加

//到fd_set结构的套接字是有限制的。winsock2.h定义为64,在包含winsock2.h

//之前重新定义它是可以的,但是最大不能超过1024,并且此值太大,影响服

//务器性能,因为select返回之前会检查这些集合中的套接字,并移除没有未

//决I/O操作的套接字。

//s为套接字

//FD_ZERO(*set)初始化set为空集合

//FD_CLR(s,*set)从set移除s

//FD_ISSET(s,*set)检查s是不是set的成员,如果是返回true

//FD_SET(s,*set)增加套接字到集合


#include "../common/initsock.h"
#include <stdio.h>

CInitSock theSock;//初始化Winsock库
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_setfdSocket;// 所有可用套节字集合
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_inaddrRemote;
intnAddrLen = sizeof(addrRemote);
SOCKETsNew = ::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
{
charszText[256];
intnRecv = ::recv(fdSocket.fd_array[i], szText, strlen(szText),0);
if(nRecv>0)//(2)可读
{
szText[nRecv]= '\0';
printf("接收到数据:%s\n", szText);
}
else//(3)连接关闭、重启或者中断
{
::closesocket(fdSocket.fd_array[i]);
FD_CLR(fdSocket.fd_array[i],&fdSocket);
}
}
}
}
}
else
{
printf("Failed select() \n");
break;
}
}
return 0;

分享到:
评论

相关推荐

    c++实现win socket 编程中的Select I/O模型

    采用C++语言实现,在VS2010下开发,代码中有相关的注释,如发现问题请不吝指教,谢谢

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

    8.1 select模型 210 8.2 WSAAsyncSelect异步I/O模型 212 8.3 WSAEventSelect事件选择模型 216 8.4 重叠I/O模型 221 8.4.1 重叠I/O模型的优点 221 8.4.2 重叠I/O模型的基本原理 221 8.4.3 重叠I/O模型的...

    windows网络编程(PDF)

    Winsock I/O方法1728.1 套接字模式1728.1.1 锁定模式1738.1.2 非锁定模式1758.2 套接字I/O模型1768.2.1 select模型1768.2.2 WSAAsyncSelect1798.2.3 WSAEventSelect1838.2.4 重叠模型1888.2.5 完成端口模型1988.3 I/...

    Win32 Socket 基于Select的服务程序

    测试了Winsocket的Select功能 Win32 Socket 基于Select的服务程序

    Windows网络编程

    Winsock I/O方法1728.1 套接字模式1728.1.1 锁定模式1738.1.2 非锁定模式1758.2 套接字I/O模型1768.2.1 select模型1768.2.2 WSAAsyncSelect1798.2.3 WSAEventSelect1838.2.4 重叠模型1888.2.5 完成端口模型1988.3 I/...

    windows网络编程

    Winsock I/O方法1728.1 套接字模式1728.1.1 锁定模式1738.1.2 非锁定模式1758.2 套接字I/O模型1768.2.1 select模型1768.2.2 WSAAsyncSelect1798.2.3 WSAEventSelect1838.2.4 重叠模型1888.2.5 完成端口模型1988.3 I/...

    win32 socket 网络编程 api 全面演示

    全面演示直接使用win32 socket api编程,包括阻塞和阻塞socket。包括windows的WSAEventSelect和WSAAsyncSelect模型都有演示

    《WINDOWS网络编程技术》

    171第8章 Winsock I/O方法 1728.1 套接字模式 1728.1.1 锁定模式 1738.1.2 非锁定模式 1758.2 套接字I/O模型 1768.2.1 select模型 1768.2.2 WSAAsyncSelect 1798.2.3 WSAEventSelect 1838.2.4 重叠模型 1888.2.5 ...

    WINDOWS网络编程技术

    Winsock I/O方法1728.1 套接字模式1728.1.1 锁定模式1738.1.2 非锁定模式1758.2 套接字I/O模型1768.2.1 select模型1768.2.2 WSAAsyncSelect1798.2.3 WSAEventSelect1838.2.4 重叠模型1888.2.5 完成端口模型1988.3 I/...

Global site tag (gtag.js) - Google Analytics