c++ accept_怎么把汇编语言转化为c语言

c++ accept_怎么把汇编语言转化为c语言AcceptEx函数的定义如下:BOOLAcceptEx(SOCKETsListenSocket,SOCKETsAcceptSocket,PVOIDlpOutputBuffer,DWORDdwReceiveDataLength,DWORDdwLocalAddressLength,DWORDdwRemoteAddressLength,LPDWORDlpdwBytesReceived,…

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

Jetbrains全系列IDE稳定放心使用

AcceptEx函数的定义如下:

BOOL AcceptEx (

SOCKET

sListenSocket, SOCKET

sAcceptSocket, PVOID

lpOutputBuffer, DWORD

dwReceiveDataLength, DWORD

dwLocalAddressLength, DWORD

dwRemoteAddressLength, LPDWORD

lpdwBytesReceived, LPOVERLAPPED

lpOverlapped );

参数1–sListenSocket, accept前绑定到本地地址的监听socket,一般由listen()得到

参数2–sAcceptSocket, 用于接受连接的socket,本人理解应该更主要是的一个out参数。

参数3–lpOutputBuffer,一块内存,当Accept成功时,会有本地(server)的地址信息,

远端地址信息(client),可能还有数据(当dwReceiveDataLength!=0时)将得到。此参数将存放这

3种信息,其中,它们是这样存放的:开始dwReceiveDataLength个大小,用于存放Accept时接到

到的数据,后面接着存放server的地址,接着是client的地址信息。该参数比较重要,如果使用

不当,可能会引起内存溢出。

参数4–dwReceiveDataLength,lpOutputBuffer中用于存放数据的空间大小。如果此参数=0,则Accept时

将不会待数据到来,而直接返回,所以通常当Accept有数据时,该参数设成为:

sizeof(lpOutputBuffer)(实参的实际空间大小) – 2*(sizeof

sockaddr_in +16)。

参数5–dwLocalAddressLength,存放本地址地址信息的空间大小

参数6–dwRemoteAddressLength,存放本远端地址信息的空间大小

参数7–lpdwBytesReceived,out参数,用于存放接收到的数据长度。该参数只是在同步IO的时候会有效

返回,如果是异步的重叠IO,需从完成通知信息里面得到。(详见MSDN)

参数8–lpOverlapped,标识异步操作时的重叠IO结构信息。

使用此函数时,要包含头文:Mswsock.h,同时要链接:Mswsock.lib。可在源程序中加入下面的语句,这样在编译时,将自动链接Mswsock.lib。

#pragma comment(lib,” Mswsock.lib”)

下面是使用AcceptEx函数的示例代码:

#define STRICT

#define _WIN32_WINNT 0x0500 // Windows 2000 or later

#define WIN32_LEAN_AND_MEAN

#include

#include

#include

#pragma comment(lib,”Ws2_32.lib”)

#pragma comment(lib,”Mswsock.lib”)

int main()

{

const int BUFSIZE = 48;

LPFN_ACCEPTEX lpfnAcceptEx = NULL;

GUID GuidAcceptEx = WSAID_ACCEPTEX;

DWORD dwBytes = 0;

SOCKET ListenSocket = INVALID_SOCKET;

SOCKET ClientSocket = INVALID_SOCKET;

HANDLE hCompPort = INVALID_HANDLE_VALUE;

OVERLAPPED ol;

char buf[BUFSIZE];

// Init WinSock Lib ….

ListenSocket = WSASocket(AF_IPX, SOCK_STREAM, NSPROTO_SPX,

NULL, 0, WSA_FLAG_OVERLAPPED);

ClientSocket = WSASocket(AF_IPX, SOCK_STREAM, NSPROTO_SPX,

NULL, 0, WSA_FLAG_OVERLAPPED);

// Bind && Listen ….

// Associate the listening socket with the completion port

CreateIoCompletionPort((HANDLE)ListenSocket, hCompPort,

(u_long)0, 0);

// Get AccpetEx Function

WSAIoctl(ListenSocket,

SIO_GET_EXTENSION_FUNCTION_POINTER,

&GuidAcceptEx,

sizeof(GuidAcceptEx),

&lpfnAcceptEx,

sizeof(m_WorkInfo.AcceptInfo.lpfnAcceptEx),

&dwBytes,

NULL,

NULL

);

ZeroMemory(buf,BUFSIZE);

ZeroMemory(&ol,sizeof(OVERLAPPED));

// Post Accept Message

lpfnAcceptEx(ListenSocket,

ClientSocket,

buf,

0,

sizeof(SOCKADDR_IN) + 16,

sizeof(SOCKADDR_IN) + 16,

&dwBytes,

&ol

);

}

需要注意的是,通过WSAIoctl获取AcceptEx函数指针时,只需要传递给WSAIoctl一个有效的SOCKET即可,该Socket的类型不会影响获取的AcceptEx函数指针。

如果不希望AcceptEx建立连接后等待用户发送数据,那么必须将第四个参数设为0。第5、6参数必须是对应SOCKET的地址类型的大小再加上16个字节。

为了使服务器能较好的处理用户连接请求,可采取如下两种策略:

A.设定两个界限值,使系统未处理的Accept操作保持在一个固定水平。推荐上限为10;

B.通过WSAEventSelect函数监听ListenSocket上的FD_ACCEPT事件。

当关闭完成端口时,如果还有未处理的Accepte操作,应该先关闭ListenSocket,然后在IOCP中,处理这些Accept操作(进行资源释放等),切记不要强行终止那些没有处理的Accept操作,否则会造成内存泄漏。

为防止恶意用户(建立连接后,不发送数据),可设置ListenSocket的SO_CONNECT_TIME属性。

如果希望ClientSocket具有和ListenSocket相同的属性,需要对ClientSocket调用SO_UPDATE_ACCEPT_CONTEXT。

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

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/187947.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • C语言模拟银行家算法

    C语言模拟银行家算法银行家算法需求:一个程序对资源的最大需求量不超过系统的最大资源程序可以分多次申请资源,但是申请资源的总量不能超过最大需求量当系统现有资源不能满足程序的需求时,可以推迟分配资源,但是总能满足程序对资源的需求当程序获得了全部的资源后,要在有限的时间内归还资源系统的安全/不安全状态:在程序申请资源时,当系统的拥有的资源不能满足程序剩余所需的全部资源时,则处于不安全状态C代码实现:头文件的导入和预定义#include<stdio.h>#include<stdli

    2022年7月22日
    4
  • mt4平台如何下载_mt4交易平台

    mt4平台如何下载_mt4交易平台当前我们若要顺势进场交易,除了要选择一个好的交易平台,一个实用的投资软件也必不可少。虽然目前市面上流行着多种mt4平台,优质型的不少,但也不乏“山寨版”,后者多为不法平台为了恶意操纵显示的行情以坑骗投资者的资金而自主研发的,危害性极大。那mt4平台哪个比较好用更安全呢?务必要留意其下载渠道的正规性,通常,正规安全有监管的平台具有好的市场口碑,能提供更可靠的投资环境,其专有的mt4平台是为安全的下载渠道。投资者除了要知道mt4平台哪个比较好用更好之外,还应充分了解下载何种软件更利于我们顺畅交易。考虑到当前

    2022年8月15日
    4
  • 关于SOAP调用返回对象的写法 wsdl webservice

    关于SOAP调用返回对象的写法 wsdl webservice

    2021年5月4日
    141
  • HDU 4836 The Query on the Tree lca || 欧拉序列 || 动态树

    HDU 4836 The Query on the Tree lca || 欧拉序列 || 动态树

    2022年1月25日
    38
  • docker dockerfile详解_进入docker容器命令

    docker dockerfile详解_进入docker容器命令前言Dockerfile是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明。Dockerfile简介Dockerfile是用来构建Docker镜像的构建文件,是由一系列

    2022年7月29日
    3
  • DNS负载均衡与负载均衡器两种方案的选择[通俗易懂]

    DNS负载均衡与负载均衡器两种方案的选择[通俗易懂]DNS负载均衡与负载均衡器两种方案的选择  web应用服务器集群系统,是由一群同时运行同一个web应用的服务器组成的集群系统,在外界看来,就像是一个服务器一样。为了均衡集群服务器的负载,达到优化系统性能的目的,集群服务器将众多的访问请求,分散到系统中的不同节点进行处理。从而实现了更高的有效性和稳定性,而这也正是基于Web的企业应用所必须具备的特性。    高可靠

    2022年7月14日
    15

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

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