热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

windows网络编程C++类

木马程序C类#pragmaonce是一个比较常用的CC杂注,只要在头文件的最开始加入这条杂注,就能够保证头文件只被编译一次。头文件#if!defi

 


木马程序C++类

#pragma once是一个比较常用的C/C++杂注,只要在头文件的最开始加入这条杂注,就能够保证头文件只被编译一次。


头文件

#if !defined(_MYTCPTRAN_H_)

#define _MYTCPTRAN_H_

#endif

#if _MSC_VER> 1000

#pragma once

#endif

#include

#include

#pragma  comment(lib,"ws2_32.lib")

using namespacestd;

//.........................

#define SOCKETBIND1

#define  SOCKETNOBIND2

#define  SOCKET_TIMEOUT-100

//自己的代码

class CMyTcpTran 

{

public:

    CMyTcpTran();

    virtual~CMyTcpTran();

public:

    staticBOOL InitSocketLibray(intlower,int higver);//初始化winsocke api链接库文件

public:

    //初始化socket操作

    SOCKET InitSocket(intSocketType,string strBindIp,u_shortBindPort,int opt);

    //针对本地监听的程序

    SOCKET myaccept(SOCKET s,structsockaddr* addr,int*addrlen);

    //接受

    intmysend(SOCKET sock,constchar*buf,int len,intflag,int overtime);

    //发送

    intmyrecv(SOCKET sock,char*buf,int len,intflag,int overtime,char*EndMark,BOOL soonflag=FALSE);

private:

    SOCKET m_Socket;

};


文件本身

// MyTcpTran.cp______________p: implementation ofthe CMyTcpTran class.

//

//

 

#include

#include

#include "MyTcpTran.h"

#ifdef _DEBUG

#undef THIS_FILE

static charTHIS_FILE[]=__FILE__;

#define newDEBUG_NEW

#endif

 

//

// Construction/Destruction

//

CMyTcpTran::CMyTcpTran()

{

    m_Socket=INVALID_SOCKET;//初始化套接字为无效套接字

}

CMyTcpTran::~CMyTcpTran()

{

    //暂时不需要

}

BOOL CMyTcpTran::InitSocketLibray(intlower,inthigver)

{

    WORD wVersion=0;

    interret=-1;

    WSADATA wsaData;

    //wVersion=MAKEWORD(2,1); //makeword 将两个8位的字节。。合成一个16位的字so..又理解了

    wVersion=MAKEWORD(lower,higver);

    erret=WSAStartup(wVersion,&wsaData);

    if(LOBYTE(wsaData.wVersion)!=2 || HIBYTE(wsaData.wVersion)!=2)  //makeword   lobyte hibyte

    {

        MessageBox(NULL,_T("版本太低了"),_T("提示"),MB_OK);

        returnFALSE;

    }

    returnTRUE;

}

SOCKET CMyTcpTran::InitSocket(intSocketType,string strBindIp,u_short BindPort,intopt)

{

    SOCKET socketid = INVALID_SOCKET;

    socketid=socket(PF_INET,SOCK_STREAM,0);

    SOCKADDR_IN sockStruct;

    sockStruct.sin_family=AF_INET;

    if(strBindIp.empty())//绑定任意IP

    {

        sockStruct.sin_addr.S_un.S_addr=INADDR_ANY;

    }

    else

    {

        sockStruct.sin_addr.S_un.S_addr=inet_addr(strBindIp.c_str());//又学到一个函数c_str

    }

    sockStruct.sin_port=htons(BindPort);//htons  以及u_short(16bit)正好65535fuck....!!!

    if(SocketType==SOCKETBIND)

    {

        //主动连

        if(connect(socketid,(sockaddr*)&sockStruct,sizeof(sockStruct))==SOCKET_ERROR)

        {

            OutputDebugString(_T("链接错误"));

            closesocket(socketid);

            shutdown(socketid,2);

            socketid=INVALID_SOCKET;

        }

        m_Socket=socketid;

    }

    //监听端口 等待链接

    elseif(SocketType==SOCKETNOBIND)

    {

        if(bind(socketid,(sockaddr*)&sockStruct,sizeof(sockStruct))==INVALID_SOCKET) //绑定

        {

            closesocket(socketid);

            socketid=INVALID_SOCKET;

        }

        else

        {

            if(listen(socketid,SOMAXCONN)==SOCKET_ERROR)   //监听

            {

                closesocket(socketid);

                socketid=INVALID_SOCKET;

            }

        }

        m_Socket=socketid;

    }

    returnsocketid; //完美封装

}

SOCKET CMyTcpTran::myaccept(SOCKET s,structsockaddr* addr,int*addrlen)

{

    SOCKET acpsocket=INVALID_SOCKET;

    acpsocket=accept(s,addr,addrlen);

    returnacpsocket;  //创建一个新的套接字,处理链接

}

int CMyTcpTran::myrecv(SOCKET sock,char*buf,intlen,intflag,intovertime,char*EndMark,BOOL soonflag)

{

    intret;

    intnleft=len;

    intidx=0;

    intnCount=0;

    fd_set readfds; //文件描述符集合

    structtimeval timeout;  //

    timeout.tv_sec=0;

    timeout.tv_usec=500;//

    DWORD s_stime=GetTickCount(); //开机后的秒数

    while(nleft>0)

    {

        MSG msg;

        PeekMessage(&msg,NULL,0,0,PM_REMOVE); //压力泵。。然后压一个删一个。。嘎嘎。。

        if(msg.message==WM_QUIT)

            return0;

        FD_ZERO(&readfds);//0

        FD_SET(sock,&readfds);//加入。。。虽然以前不知道FD_SET 不过今天知道了

        if(select(0,&readfds,NULL,NULL,&timeout)==SOCKET_ERROR)

        {

            returnSOCKET_ERROR;

        }

        DWORD e_time=GetTickCount();

        if(!FD_ISSET(sock,&readfds))

        {

            if(e_time-s_stime>overtime*1000)  //超时

                returnSOCKET_ERROR;

            else

                continue;

        }

        ret=recv(sock,&buf[idx],nleft,flag);//nleft:Length of buf. 接受缓存区

        if(soonflag==TRUE)

        {

            returnret;

            //立即返回接受到的字节

        }

        s_stime=e_time;

        if(ret<&#61;0)  //错误处理

        {

            intLastError&#61;GetLastError();

            if((-1 &#61;&#61; ret) && (WSAETIMEDOUT &#61;&#61; LastError))

                continue;

            if((-1 &#61;&#61; ret) && (WSAEWOULDBLOCK&#61;&#61; LastError)) //没找到这个错误类型的定义。。

            {

                if(nCount<2000)

                {

                    Sleep(10);

                    nCount&#43;&#43;;

                    continue;

                }

            }

            returnret;

        }

        nCount&#61;0;

        nleft-&#61;ret;

        idx&#43;&#61;ret;

        if(EndMark!&#61;NULL && idx>5)

        {

            if(strstr(buf&#43;(idx-5),EndMark)!&#61;NULL//应该是查找EndMark

            {

                break;

            }

        }

 

    }

    returnidx;

}

int CMyTcpTran::mysend(SOCKET sock,constchar*buf,intlen,intflag,intovertime)   //发送了

{

    intret;

    intnLeft&#61;len;

    intidx;

    fd_set readfds;

    structtimeval timeout;

    timeout.tv_sec&#61;0;

    timeout.tv_usec&#61;500;

    DWORD s_time &#61; GetTickCount();

    while(nLeft>0)

    {

        MSG msg;

        PeekMessage(&msg,NULL,0,0,PM_REMOVE);

        if(msg.message&#61;&#61;WM_QUIT)

            return0;

        FD_ZERO(&readfds);

        FD_SET(sock,&readfds);

        interrorret&#61;select(0,NULL,&readfds,NULL,&timeout);

        if(errorret&#61;&#61;SOCKET_ERROR)

        {

            OutputDebugString(_T("mysendEx socket 错误"));

            returnSOCKET_ERROR;

        }

        DWORD e_time&#61;GetTickCount();

        if(!FD_ISSET(sock,&readfds))

        {

            if(e_time-s_time>overtime*1000)

            {

                OutputDebugString(_T("超时"));

                return0;

            }

            else

            {

                continue;

            }

        }

        ret&#61;send(sock,&buf[idx],nLeft,flag);

        if(ret<&#61;0)

        {

            returnret;

        }

        nLeft-&#61;ret;

        idx&#43;&#61;ret;

    }

    returnlen;

}


类说明

头文件定义了一个类&#xff0c;包括构造函数&#xff0c;析构函数。和5个主要函数。

InitSocketLibray返回BOOL

InitSocket返回SOCKET

Myaccept返回SOCKET

Mysend返回INT

Myrecv返回INT

此外还有私有变量m_Socket;


InitSocketLibray函数

比较简单入参为两个整型&#xff0c;表示winsock版本号。

版本低于2.2就弹出报错。返回FALSE


InitSocket函数

支持4个参数&#xff1a;int SocketType,string strBindIp,u_short BindPort,int opt

第1个参数是连接类型&#xff0c;确定是服务端还是客户端。

如果是SOCKETBIND说明是服务端&#xff0c;如果是SOCKETNOBIND,那么就是客户端。

第2个参数strBindIp是绑定的IP地址。

第3个参数BindPort是绑定的端口

第4个参数Opt是保留参数&#xff0c;暂时没有用处。

如果是服务端则返回一个服务端的SOCKET&#xff0c;如果是客户端则返回一个客户端的SOCKET。


Myaccept函数

输入3个参数&#xff0c;套接字&#xff0c;sockaddr指针和,addrlen.

返回一个新的套接字用户处理链接。


Mysend函数

接受5个参数&#xff0c;分别是套接字&#xff0c;接受缓冲区&#xff0c;长度&#xff0c;flag和overtime.

最后返回发送的字节数&#xff0c;如果发送失败返回负数。

超时或退出返回0.


Myrecv函数

输入参数7个&#xff0c;有服务端套接字&#xff0c;接受缓存区&#xff0c;长度&#xff0c;flag,overtime, EndMark&#xff0c;soonflag

其中soonflag表示立即返回接受到的字节。

如果soonflag为false,返回接受的字节数idx。

如果soonflag为true&#xff0c;则返回指定长度的字节数。

如果出错返回负数。

此外&#xff0c;如果EndMark不会NULL&#xff0c;则会判断是否有EndMark存在&#xff0c;存在则也函数结束。


TIPS


fd_set

select()机制中提供一fd_set的数据结构&#xff0c;实际上是一long类型的数组&#xff0c;每一个数组元素都能与一打开的文件句柄&#xff08;不管是socket句柄&#xff0c;还是其他文件或命名管道或设备句柄&#xff09;建立联系&#xff0c;建立联系的工作由程序员完成&#xff0c;当调用select()时&#xff0c;由内核根据IO状态修改fd_set的内容&#xff0c;由此来通知执行了select()的进程哪一socket或文件发生了可读或可写事件。

FD_ZERO(&set); /*将set清零使集合中不含任何fd*/

FD_SET(fd, &set); /*将fd加入set集合*/

FD_CLR(fd, &set); /*将fd从set集合中清除*/

FD_ISSET(fd, &set); /*在调用select()函数后&#xff0c;用FD_ISSET来检测fd是否在set集合中&#xff0c;当检测到fd在set中则返回真&#xff0c;否则&#xff0c;返回假&#xff08;0&#xff09;*/


select

select()的机制中提供一fd_set的数据结构&#xff0c;实际上是一long类型的数组&#xff0c; 每一个数组元素都能与一打开的文件句柄&#xff08;不管是Socket句柄&#xff0c;还是其他 文件或命名管道或设备句柄&#xff09;建立联系&#xff0c;建立联系的工作由程序员完成&#xff0c; 当调用select()时&#xff0c;由内核根据IO状态修改fd_set的内容&#xff0c;由此来通知执 行了select()的进程哪一Socket或文件可读或可写。主要用于Socket通信当中!


PeekMessage

PeekMessage是一个Windows API函数。该函数为一个消息检查线程消息队列&#xff0c;并将该消息&#xff08;如果存在&#xff09;放于指定的结构。

BOOL PeekMessage(

LPMSG IpMsg,

HWND hWnd,

UINT wMSGfilterMin,

UINT wMsgFilterMax,

UINT wRemoveMsg

);

lpMsg

接收消息信息的MSG结构指针。

hWnd

其消息被检查的窗口句柄

wMsgFilterMin

指定被检查的消息范围里的第一个消息。

wMsgFilterMax

指定被检查的消息范围里的最后一个消息。

wRemoveMsg

确定消息如何被处理。此参数可取下列值之一&#xff1a;


推荐阅读
  • VScode格式化文档换行或不换行的设置方法
    本文介绍了在VScode中设置格式化文档换行或不换行的方法,包括使用插件和修改settings.json文件的内容。详细步骤为:找到settings.json文件,将其中的代码替换为指定的代码。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • CF:3D City Model(小思维)问题解析和代码实现
    本文通过解析CF:3D City Model问题,介绍了问题的背景和要求,并给出了相应的代码实现。该问题涉及到在一个矩形的网格上建造城市的情景,每个网格单元可以作为建筑的基础,建筑由多个立方体叠加而成。文章详细讲解了问题的解决思路,并给出了相应的代码实现供读者参考。 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • Nginx使用(server参数配置)
    本文介绍了Nginx的使用,重点讲解了server参数配置,包括端口号、主机名、根目录等内容。同时,还介绍了Nginx的反向代理功能。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • Linux重启网络命令实例及关机和重启示例教程
    本文介绍了Linux系统中重启网络命令的实例,以及使用不同方式关机和重启系统的示例教程。包括使用图形界面和控制台访问系统的方法,以及使用shutdown命令进行系统关机和重启的句法和用法。 ... [详细]
  • 本文讨论了在Windows 8上安装gvim中插件时出现的错误加载问题。作者将EasyMotion插件放在了正确的位置,但加载时却出现了错误。作者提供了下载链接和之前放置插件的位置,并列出了出现的错误信息。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • 本文介绍了九度OnlineJudge中的1002题目“Grading”的解决方法。该题目要求设计一个公平的评分过程,将每个考题分配给3个独立的专家,如果他们的评分不一致,则需要请一位裁判做出最终决定。文章详细描述了评分规则,并给出了解决该问题的程序。 ... [详细]
  • 本文介绍了C++中省略号类型和参数个数不确定函数参数的使用方法,并提供了一个范例。通过宏定义的方式,可以方便地处理不定参数的情况。文章中给出了具体的代码实现,并对代码进行了解释和说明。这对于需要处理不定参数的情况的程序员来说,是一个很有用的参考资料。 ... [详细]
  • c语言\n不换行,c语言printf不换行
    本文目录一览:1、C语言不换行输入2、c语言的 ... [详细]
  • 本文介绍了一种划分和计数油田地块的方法。根据给定的条件,通过遍历和DFS算法,将符合条件的地块标记为不符合条件的地块,并进行计数。同时,还介绍了如何判断点是否在给定范围内的方法。 ... [详细]
  • 本文介绍了为什么要使用多进程处理TCP服务端,多进程的好处包括可靠性高和处理大量数据时速度快。然而,多进程不能共享进程空间,因此有一些变量不能共享。文章还提供了使用多进程实现TCP服务端的代码,并对代码进行了详细注释。 ... [详细]
  • 《数据结构》学习笔记3——串匹配算法性能评估
    本文主要讨论串匹配算法的性能评估,包括模式匹配、字符种类数量、算法复杂度等内容。通过借助C++中的头文件和库,可以实现对串的匹配操作。其中蛮力算法的复杂度为O(m*n),通过随机取出长度为m的子串作为模式P,在文本T中进行匹配,统计平均复杂度。对于成功和失败的匹配分别进行测试,分析其平均复杂度。详情请参考相关学习资源。 ... [详细]
author-avatar
记忆里的Angle
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有