AcceptEx 以及 获取远程IP与port

#include <MSWSock.h>

const int     NET_BUFFER_SIZE = 1024;
char        tAcceptRecvBuf[NET_BUFFER_SIZE] = { 0 };

LPFN_ACCEPTEX    extract_AcceptEx();

LPFN_GETACCEPTEXSOCKADDRS    extract_GetAcceptExSockaddrs();

unsigned  int  post_accept()

unsigned  int __stdcall accept_callback(
    PTP_CALLBACK_INSTANCE    Instance,
    PVOID                    pvContext,
    PVOID                    pOverlapped,
    ULONG                    IoResult,
    ULONG_PTR                NumberOfBytesTransferred,
    PTP_IO                    pIo);

LPFN_ACCEPTEX    extract_AcceptEx()
{
    LPFN_ACCEPTEX    lpfnAcceptEx = NULL;
    GUID            tGuidAcceptEx = WSAID_ACCEPTEX;
    DWORD            dwBytes = 0;
    int                tResult = 0;

    tResult = WSAIoctl(
        listen_socket,
        SIO_GET_EXTENSION_FUNCTION_POINTER,
        &tGuidAcceptEx, sizeof(tGuidAcceptEx),
        &lpfnAcceptEx, sizeof(lpfnAcceptEx),
        &dwBytes, NULL, NULL);

    if (SOCKET_ERROR == tResult)
    {
        return nullptr;
    }

    return lpfnAcceptEx;
}

LPFN_GETACCEPTEXSOCKADDRS    extract_GetAcceptExSockaddrs()
{
    LPFN_GETACCEPTEXSOCKADDRS    lpfnGetAcceptExSockaddrs = NULL;
    GUID            tGuidGetAcceptExSockaddrs = WSAID_GETACCEPTEXSOCKADDRS;
    DWORD            dwBytes = 0;
    int                tResult = 0;

    tResult = WSAIoctl(
        listen_socket,
        SIO_GET_EXTENSION_FUNCTION_POINTER,
        &tGuidGetAcceptExSockaddrs, sizeof(tGuidGetAcceptExSockaddrs),
        &lpfnGetAcceptExSockaddrs, sizeof(lpfnGetAcceptExSockaddrs),
        &dwBytes, NULL, NULL);

    if (SOCKET_ERROR == tResult)
    {
        return nullptr;
    }

    return lpfnGetAcceptExSockaddrs;
}

unsigned  int  post_accept()
{
    LPFN_ACCEPTEX    lpfnAcceptEx = extract_AcceptEx();
    DWORD            dwBytes = 0;
    int                tResult = 0;

    if (nullptr == lpfnAcceptEx)
    {
        return false;
    }

    BOOL            tRtn = FALSE;

    overlapex    *overlap = new overlapex();
    overlap->sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    if (INVALID_SOCKET == overlap->sock)
    {
        WSACleanup();
        return false;
    }

    /*
    特别要注意,当dwReceiveDataLength设置为0后,
    在使用m_lpfnGetAcceptExSockaddrs方法取得客户端地址时,
    dwReceiveDataLength也要相应的写为0,
    否则取出的地址为0.0.0.0
    */

    tRtn = lpfnAcceptEx(
        listen_socket, overlap->sock,
        tAcceptRecvBuf, 0,    // 表示只接收连接,不接收数据
        sizeof(sockaddr_in)+16, sizeof(sockaddr_in)+16,
        &dwBytes, (LPOVERLAPPED)overlap);

    int        tErrorCode = WSAGetLastError();

    if ((FALSE == tRtn) && (ERROR_IO_PENDING != tErrorCode))
    {
        WSACleanup();
        return false;
    }

    return true;
}

unsigned  int __stdcall accept_callback(
    PTP_CALLBACK_INSTANCE    Instance,
    PVOID                    pvContext,
    PVOID                    pOverlapped,
    ULONG                    IoResult,
    ULONG_PTR                NumberOfBytesTransferred,
    PTP_IO                    pIo)
{
    overlapex    *overlap = static_cast<overlapex*>(pOverlapped);

    if (NO_ERROR != IoResult)
    {
        if (WSAENOTSOCK != IoResult)
        {
            printf("serious error in base_recv_callback(...) !!! IoResult return:%d. query System Error Code.", IoResult);
        }

        return 0;
    }

    struct    sockaddr_in    *local_addr = NULL;
    struct  sockaddr_in *remote_addr = NULL;
    int local_addr_len = sizeof(sockaddr_in);
    int remote_addr_len = sizeof(sockaddr_in);

    LPFN_GETACCEPTEXSOCKADDRS    GetAcceptExSockaddrs = extract_GetAcceptExSockaddrs();
    GetAcceptExSockaddrs(
        tAcceptRecvBuf, 0,
        sizeof(sockaddr_in)+16, sizeof(sockaddr_in)+16,
        (struct sockaddr**)&local_addr, &local_addr_len,
        (struct sockaddr**)&remote_addr, &remote_addr_len);

    /*
    如果不是使用的AcceptEx这个函数,  而是使用的同步函数的话, 应该使用getpeername() & gethostname() 来获取远程机和本机的IP与PORT
    */

    printf("对方 IP & PORT: %s  %d \n", inet_ntoa(local_addr->sin_addr), ntohs(local_addr->sin_port));
    printf("本机 IP & PORT: %s  %d \n", inet_ntoa(remote_addr->sin_addr), ntohs(remote_addr->sin_port));

    post_recv(overlap);
    post_accept();

    return 1;
}

AcceptEx 以及 获取远程IP与port

时间: 2024-07-29 04:30:09

AcceptEx 以及 获取远程IP与port的相关文章

获取远程IP

/**     * 获取远程IP     *      * @param request     * @return     * @author 杨旭     */    public static String getIpAddr(HttpServletRequest request) {        String ip = request.getHeader("x-forwarded-for");        if (ip == null || ip.length() == 0

获取远程IP、字符串解析

public class StringUtil { private static final Pattern IPV4_PATTERN = Pattern.compile( "^(25[0-5]|2[0-4]\\d|[0-1]?\\d?\\d)(\\.(25[0-5]|2[0-4]\\d|[0-1]?\\d?\\d)){3}$"); private static final Pattern IPV6_STD_PATTERN = Pattern.compile( "^(?:[0

IPUtil工具类,获取本机、远程IP

import java.net.InetAddress; import java.net.NetworkInterface; import java.net.SocketException; import java.util.Enumeration; import javax.servlet.http.HttpServletRequest; /** * IP工具类 * @author geeksun * 2011-9-23 */ public class IpUtil { /** * @para

C#获取局域网IP、MAC地址和端口的初学

首先非常感谢Melou的http://www.cnblogs.com/luoht/archive/2009/12/18/1627431.html的随笔,对于初学C#的我,参考你的随笔对我的学习真是有莫大帮助. C#遍历局域网的几种方法: 1.微软社区上介绍了使用Active Directory 来遍历局域网 首先我们来了解DirectoryEntry类是一个什么类. 命名空间:  System.DirectoryServices程序集:  System.DirectoryServices(在 S

MD5加密&获取用户IP、ID、系统时间

1.通常我们在数据库中保存用户信息的时候需要把密码和一些其他重要信息,用加密的方式保存,这就会用到下面的MD5加密程序段 MessageDigest md=MessageDigest.getInstance("MD5"); md.update("被加密的字符串".getBytes()); String md5sString =new BigInteger(1,md.digest()).toString(16); 2.获取用户IP,ID,系统时间语句 String u

同一域名对应多个IP时,PHP获取远程网页内容的函数

同一域名对应多个IP时,PHP获取远程网页内容的函数 [文章作者:张宴 本文版本:v1.0 最后修改:2008.12.15 转载请注明原文链接:http://blog.zyan.cc/post/389/] PHP获取远程网页内容有多种方式,例如用自带的file_get_contents.fopen等函数. 引用 <?php echo file_get_contents("http://blog.zyan.cc/abc.php"); ?> 但是,在DNS轮询等负载均衡中,同一

【php】利用新浪api接口与php获取远程数据的方法,获取IP地址,并获取相应的IP归属地

本文与<[Servlet]Javaweb中,利用新浪api接口,获取IP地址,并获取相应的IP归属地>(点击打开链接)为姊妹篇,只是后端编程语言换成了php. 做出同样的效果,打开页面,得到客户端的ip,并获取利用新浪api接口获取此ip的归属地. 可以看到,在IE6也是相当正常的. 目录结构如下,非常简单,同样就两个文件,其实如果你愿意,写成一个php文件也可以,但是显示层和逻辑业务层还是不混在一起为好吧? 唯一值得注意的是,这两个文件打死也不能一个叫ipGet.php,ipGet.html

从Http请求中获取客户端ip和端口

import javax.servlet.http.HttpServletRequest; import org.apache.log4j.Logger; public final class InternetProtocol { private static Logger log = Logger.getLogger(InternetProtocol.class); /**  * 构造函数.  */ private InternetProtocol() { } /**  * 获取客户端IP地址

【ASP.NET】#001 获取服务器IP

客户端ip: Request.ServerVariables.Get("Remote_Addr").ToString(); 客户端主机名: Request.ServerVariables.Get("Remote_Host").ToString(); 客户端浏览器IE: Request.Browser.Browser; 客户端浏览器 版本号: Request.Browser.MajorVersion; 客户端操作系统: Request.Browser.Platform