accept函数的用法_requestscope用法

accept函数的用法_requestscope用法这是在学《Windows网络编程(第二版)》第六章时制作的一个例子由于书中没有给出简洁的例子,本人在学这里时就费了很多时间。现在把完成的代码贴出来,供大家参考。下面包括了主程序部分,工作线程在(2)中贴出,由于代码太长。本程序在VS2003编译器编译运行。在6.0下可能需要稍加修改。#include#include#include#include    //微软扩展的类库

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

这是在学《Windows网络编程(第二版)》第六章时制作的一个例子
由于书中没有给出简洁的例子,本人在学这里时就费了很多时间。
现在把完成的代码贴出来,供大家参考。
下面包括了主程序部分,工作线程在(2)中贴出,由于代码太长。
本程序在VS2003编译器编译运行。在6.0下可能需要稍加修改。
#include <iostream>
#include <winsock2.h>
#include <ws2tcpip.h>
#include <mswsock.h>    //微软扩展的类库
using namespace std;
#define SEND 0
#define RECV 1
#define ACCEPT 2
#define DATA_LENGTH 1000
//单句柄数据定义
typedef struct _PER_HANDLE_DATA
{
    SOCKET socket;    //相关的套接字
    SOCKADDR_STORAGE clientAddr;    //客户端的地址
}PER_HANDLE_DATA,*LPPER_HANDLE_DATA;
//但IO操作数据
typedef struct{
    OVERLAPPED overlapped;
    WSABUF buffer;    //一个数据缓冲区,用于WSASend/WSARecv中的第二个参数
    char dataBuffer[DATA_LENGTH];    //实际的数据缓冲区
    int dataLength;                    //实际的数据缓冲区长度
    int operatorType;                //操作类型,可以为SEND/RECV两种
    SOCKET client;                    //分别表示发送的字节数和接收的字节数
}PER_IO_DATA,*LPPER_IO_DATA;
void main()
{
    HANDLE CompletionPort;
    WSADATA data;
    SYSTEM_INFO info;
    SOCKADDR_IN addr;
    SOCKET Listen;
    unsigned int i;
    WSAStartup(MAKEWORD(2,2),&data);
    //创建一个IO完成端口
    CompletionPort = CreateIoCompletionPort(INVALID_HANDLE_VALUE,NULL,0,0);
    //确定处理器的数量
    GetSystemInfo(&info);    //创建线城
    for(i=0;i<info.dwNumberOfProcessors * 2;i++)
    {
        //根据处理器的数量创建相应多的处理线程
        HANDLE thread = CreateThread(NULL,0,ServerThread,CompletionPort,0,NULL);
        CloseHandle(thread);
    }
    //创建一个监听套接字(进行重叠操作)
    Listen = WSASocket(AF_INET,SOCK_STREAM,0,NULL,0,WSA_FLAG_OVERLAPPED);
    //将监听套接字与完成端口绑定
    LPPER_HANDLE_DATA perDandleData;
    perDandleData = (LPPER_HANDLE_DATA)GlobalAlloc(GPTR,sizeof(PER_HANDLE_DATA));
    perDandleData->socket = Listen;
    CreateIoCompletionPort((HANDLE)Listen,CompletionPort,(ULONG_PTR)perDandleData,0);
    addr.sin_family = AF_INET;
    addr.sin_addr.s_addr = htonl(INADDR_ANY);
    addr.sin_port = htons(5500);
    bind(Listen,(PSOCKADDR)&addr,sizeof(addr));
    listen(Listen,5);
    LPFN_ACCEPTEX lpfnAcceptEx = NULL;    //AcceptEx函数指针
    //Accept function GUID
    GUID guidAcceptEx = WSAID_ACCEPTEX;
    //get acceptex function pointer
    DWORD dwBytes = 0;
    if(WSAIoctl(Listen,SIO_GET_EXTENSION_FUNCTION_POINTER,
        &guidAcceptEx,sizeof(guidAcceptEx),&lpfnAcceptEx,sizeof(lpfnAcceptEx),
        &dwBytes,NULL,NULL)==0)
        cout<<"WSAIoctl success..."<<endl;
    else{
        cout<<"WSAIoctl failed..."<<endl;
        switch(WSAGetLastError())
        {
        case WSAENETDOWN:
            cout<<""<<endl;
            break;
        case WSAEFAULT:
            cout<<"WSAEFAULT"<<endl;
            break;
        case WSAEINVAL:
            cout<<"WSAEINVAL"<<endl;
            break;
        case WSAEINPROGRESS:
            cout<<"WSAEINPROGRESS"<<endl;
            break;
        case WSAENOTSOCK:
            cout<<"WSAENOTSOCK"<<endl;
            break;
        case WSAEOPNOTSUPP:
            cout<<"WSAEOPNOTSUPP"<<endl;
            break;
        case WSA_IO_PENDING:
            cout<<"WSA_IO_PENDING"<<endl;
            break;
        case WSAEWOULDBLOCK:
            cout<<"WSAEWOULDBLOCK"<<endl;
            break;
        case WSAENOPROTOOPT:
            cout<<"WSAENOPROTOOPT"<<endl;
            break;
        }
        return;
    }
    //while(true)
    //{
        //准备调用 AcceptEx 函数,该函数使用重叠结构并于完成端口连接
        LPPER_IO_DATA perIoData = (LPPER_IO_DATA)GlobalAlloc(GPTR,sizeof(PER_IO_DATA));
        memset(&(perIoData->overlapped),0,sizeof(OVERLAPPED));    
        perIoData->operatorType = ACCEPT;
        //在使用AcceptEx前需要事先重建一个套接字用于其第二个参数。这样目的是节省时间
        //通常可以创建一个套接字库
        perIoData->client = WSASocket(AF_INET,SOCK_STREAM,IPPROTO_TCP,0,0,WSA_FLAG_OVERLAPPED);
        perIoData->dataLength = DATA_LENGTH;
        DWORD flags = 0;
        
        //调用AcceptEx函数,地址长度需要在原有的上面加上16个字节
        //注意这里使用了重叠模型,该函数的完成将在与完成端口关联的工作线程中处理
        cout<<"Process AcceptEx function wait for client connect..."<<endl;
        int rc = lpfnAcceptEx(Listen,perIoData->client,perIoData->dataBuffer,
            perIoData->dataLength-((sizeof(SOCKADDR_IN)+16)*2),
            sizeof(SOCKADDR_IN)+16,sizeof(SOCKADDR_IN)+16,&dwBytes,
            &(perIoData->overlapped));
        if(rc == FALSE)
        {
            if(WSAGetLastError()!=ERROR_IO_PENDING)
                cout<<"lpfnAcceptEx failed.."<<endl;
        }
        cin>>i;
    closesocket(Listen);
    WSACleanup();
}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/187913.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • HDU5432-Pyramid Split[通俗易懂]

    HDU5432-Pyramid Split[通俗易懂]最近以各种借口偷懒了,上次BC的题一直也没补,今天才补完第一题,非常好过,可当时就是想不通~#include#include#include#defineeps1e-5doublea[10005],b[10005];intn;intbSearch(doublebegin,doubleend,doublee){doublemid,left=begi

  • 银行家算法C++实现

    银行家算法C++实现网上有很多银行家算法的源代码,下面是本人自己写的,基本算法模型参考教材。介绍银行家算法(Banker’sAlgorithm)是一个避免死锁(Deadlock)的著名算法,是由艾兹格·迪杰斯特拉(EdsgerWybeDijkstra)在1965年为T.H.E系统设计的一种避免死锁产生的算法。它以银行借贷系统的分配策略为基础,判断并保证系统的安全运行。背景简介在银行中…

  • SpringSecurity(十六)—退出登录

    SpringSecurity(十六)—退出登录

    2020年11月12日
  • SpringBoot面试题整理,常问SpringBoot面试题汇总(2020版)

    SpringBoot面试题整理,常问SpringBoot面试题汇总(2020版)找工作的历程太艰难,面试的过程很心烦,在没着落的每一天,心情都不太美妙,这时的我们唯一能做的就是多总结,多做准备,这样,起码心里会好受些!所以我准备了一点SpringBoot的面试题,为还正在找工作的小伙伴多增加些成功的筹码!1、什么是SpringBoot?SpringBoot是Spring开源组织下的子项目,是Spring组件一站式解决方案,主要是简化了使用Spring的难度,简省了繁重的配置,提供了各种启动器,开发者能快速上手。2、SpringBoot有哪些优点?.

  • 计算机学生选课系统毕业论文,学生选课管理系统论文「建议收藏」

    计算机学生选课系统毕业论文,学生选课管理系统论文「建议收藏」摘要本学生选课信息管理系统是选课信息展现与管理的系统,能够解决学生的选课问题,提高教务处管理学生选课的效率,降低人力物力财力的开销,具有重要的社会研究价值和研究意义。论文介绍了学生选课信息管理系统的研究背景、项目意义和目前的研究与应用现状,明确了论文研究的内容和主要工作:在业务分析中,论文对系统存在的问题、学生选课信息管理系统进行了细致的需求分析,涵括系统业务、功能、数据,对原有业务流程进…

    2022年10月15日
  • Ubuntu使用vdbench批量创建目录和文件「建议收藏」

    Ubuntu使用vdbench批量创建目录和文件「建议收藏」Vdbench是一个命令行实用程序,旨在生成用于验证存储性能和存储数据完整性的磁盘I/O负载。还可通过输入文本文件指定Vdbench执行参数,下面是使用vdbench批量创建目录和文件的示例1.先利用wget下载vdbench,比如当前版本为:vdbench503.zip2.再使用unzip命令解压缩,$unzipvdbench503.zip-d/data/

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号