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)


相关推荐

  • js获取当前年,月,日,时,分,秒「建议收藏」

    js获取当前年,月,日,时,分,秒「建议收藏」vardate=newDate();date.getYear();//获取当前年份(2位)date.getFullYear();//获取完整的年份(4位)date.getMon

  • 竞争性需求分析

    竞争性需求分析

    2021年11月18日
  • OpenWrt make menuconfig 构建过程「建议收藏」

    OpenWrt make menuconfig 构建过程「建议收藏」OpenWrtmakemenuconfig构建过程1.课题背景之前在《20190614OpenWrt如何添加驱动以及应用程序谢艺华-遗留问题解答》文档的问题7中,承诺要写一个关于makemenuconfig的构架过程。于是就决定花点时间熟悉一下流程,方便以后的工作。2.分析过程2.1OpenWrt目录下的Makefile分析makemenuconfig的过程也…

  • pythonwhile冒泡排序_python冒泡排序

    pythonwhile冒泡排序_python冒泡排序#冒泡法排序ListBubbleSort.pyfish_records=[18,8,7,2,3,6,1,1]#原始排序i=0#循环控制变量compare=0#比较元素初始值fish_len=len(fish_records)#获取列表长度whileij=1…

    2022年10月16日
  • 谈谈CompoundButton的OnCheckedChangeListener

    谈谈CompoundButton的OnCheckedChangeListenerCompoundButton相信大家都很熟悉了。OnCheckedChangeListener相信大家也很熟悉。不过不知道大家有没有碰到类似的问题:在某个CompoundButton.OnCheckedChangeListener中请求网络接口。在其他一些地方,例如onCreate/onCreateView/setUserVisableHint等等方法中,从另一个接口取得数据,

  • pycharm一键调整代码格式_pycharm community怎么改成中文

    pycharm一键调整代码格式_pycharm community怎么改成中文用pycharm真的很久了,一直是英文的IDE,还是感到不太方便。在网上找如何将pycharm汉化,结果搜出来的结果都是下载补丁?或者是激活成功教程版?风险很大。于是自己摸索出了这个官方汉化版的操作,绝对安全,绝对简便!!打开settings(设置),然后在里面搜索plugins(插件)。 进入界面之后,点击中上方的marketplace(市场),搜索”chinese”。 弹出来的第一个,作者是JetBrains官方出的插件,点击安装。 重启之后,界面就变成下图的汉化版了!!超级方便,超级安全!!

发表回复

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

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