随笔——控制台下的Select模型的模板
2014-06-01 10:38
120 查看
Winsock编程中select模型是个好东西,不用多线程的话这是个很好的选择。
MFC编程中,如果还是用简单的阻塞模型while(1)的话,很可能会发生界面未响应,变白down掉的情况。所以这个时候select模型就显得十分重要。
这是控制台下的Select模型的模板,MFC下的select请看下一篇文章
MFC编程中,如果还是用简单的阻塞模型while(1)的话,很可能会发生界面未响应,变白down掉的情况。所以这个时候select模型就显得十分重要。
这是控制台下的Select模型的模板,MFC下的select请看下一篇文章
#include<winsock2.h> #include<ws2tcpip.h> #include<windows.h> #include<stdio.h> #include<conio.h> #pragma comment(lib,"ws2_32.lib") #define DEFAULT_BUFLEN 512 #define DEFAULT_PORT 27015 int _tmain() { WSADATA wsaData; int iResult; SOCKET SeverSocket = INVALID_SOCKET; iResult = WSAStartup(MAKEWORD(2,2),&wsaData); if(iResult != 0) { //WSAStartup failed!\r\n return 1; } SeverSocket = socket(AF_INET,SOCK_STREAM,IPPROTO_IP); if(SeverSocket == INVALID_SOCKET) { //socket failed! WSACleanup(); return 1; } SOCKADDR_IN addrServ; addrServ.sin_family = AF_INET; addrServ.sin_port = htons(DEFAULT_PORT); addrServ.sin_addr.S_un.S_addr = htonl(INADDR_ANY); iResult = bind(SeverSocket, (const struct sockaddr*)&addrServ,sizeof(SOCKADDR_IN)); if(iResult == SOCKET_ERROR) { //Bind failed! closesocket(SeverSocket); WSACleanup(); return 1; } iResult = listen(SeverSocket,SOMAXCONN); if(iResult == SOCKET_ERROR) { //Listen failed! closesocket(SeverSocket); WSACleanup(); return -1; } //Tcp sever strting... WSAEVENT Event = WSACreateEvent(); int iIndex = 0,i; int iEventTotal = 0; WSAEVENT eventArray[WSA_MAXIMUM_WAIT_EVENTS]; SOCKET sockArray[WSA_MAXIMUM_WAIT_EVENTS]; WSAEventSelect(SeverSocket,Event,FD_ACCEPT); eventArray[iEventTotal] = Event; sockArray[iEventTotal] = SeverSocket; iEventTotal++; //处理网络事件 SOCKADDR_IN addrClient; int addrClientlen = sizeof(SOCKADDR_IN); char recvbuf[DEFAULT_BUFLEN] ; int recvbuflen = DEFAULT_BUFLEN; while(1) { //在所有时间对象上等待 iIndex = WSAWaitForMultipleEvents(iEventTotal, eventArray,FALSE, WSA_INFINITE,FALSE); iIndex = iIndex - WSA_WAIT_EVENT_0; for(i=iIndex; i<iEventTotal;i++) { iResult = WSAWaitForMultipleEvents(1, &eventArray[i],TRUE,1000,FALSE); if(iResult =WSA_WAIT_FAILED || iResult == WSA_WAIT_TIMEOUT) { continue; } else { WSANETWORKEVENTS newevent; WSAEnumNetworkEvents(sockArray[i],eventArray[i],&newevent); if(newevent.lNetworkEvents & FD_ACCEPT) //handle FD_ACCEPT message { if(newevent.iErrorCode[FD_ACCEPT_BIT]==0) { if(iEventTotal>WSA_MAXIMUM_WAIT_EVENTS) { //too many link,ignore.... continue; } SOCKET AcceptSocket = accept(sockArray[i],(SOCKADDR FAR*)&addrClient,&addrClientlen); //"接收到新的连接" WSAEVENT newEvent1 = WSACreateEvent(); WSAEventSelect(AcceptSocket, newEvent1,FD_READ|FD_CLOSE|FD_WRITE); eventArray[iEventTotal] = newEvent1; sockArray[iEventTotal] = AcceptSocket; iEventTotal++; } } if(newevent.lNetworkEvents & FD_READ) { if(newevent.iErrorCode[FD_READ_BIT]==0) { //if data reach memset(recvbuf,0,recvbuflen); iResult = recv(sockArray[i],recvbuf,recvbuflen,0); if(iResult>0) { //seccess, deal with the data } else { //recv failed <span style="font-family: Arial, Helvetica, sans-serif;">closesocket(sockArray[i]);</span> <span style="font-family: Arial, Helvetica, sans-serif;"></span> } } } if(newevent.lNetworkEvents & FD_CLOSE) { //closing currect connection closesocket(sockArray[i]); } if(newevent.lNetworkEvents & FD_WRITE) { //do data send } } } } }
相关文章推荐
- WSAEventSelect模型基于TCP协议的控制台网络通信程序
- UNIX环境高级编程学习之第十六章网络IPC:套接字 - 非阻塞的Socket通信Select模型(多路复用), 实用Socket通信模板。
- 浅谈网络I/O多路复用模型 select & poll & epoll
- select模型使用例子
- Linux下select, poll和epoll IO模型的详解
- 网络编程之你真了解select模型??
- 深入探讨vc下C++模板编译模型
- html+js+PHP(使用了smarty模板技术)+mysql实现二级动态下拉列表(select)
- 多路IO复用模型 select epoll 等
- select ---IO 模型
- 基于select模型的udp客户端实现超时机制
- WinSock---WSAAsyncSelect IO模型和select模型的比较
- Select模型
- WSAEventSelect模型 用法介绍
- Winsock I/O模型之WSAAsyncSelect
- 非阻塞通信之select模型
- ACE的Select模型
- Windows Socket五种I/O模型(一)——选择模型(Select)
- C++基于该模型模板包括节目外实例
- python实现select和epoll模型socket网络编程