2022
我们一起努力

bmfhost的简单介绍

目录:

  • 1、di**hostservicingprocess可以关闭吗
  • 2、Socket 问题,200分
  • 3、基于java的p2p实现文件共享和传输
  • 4、ADFS 3.0 + Oauth2.0
  • 5、什么是fontdrvhost.exe吗

di**hostservicingprocess可以关闭吗

di**hostservicingprocess不可以关闭。Di**HostServicingProcess他是win10系统中用户模式字体驱动UserModeFontDriverUMFD机制,用户模式字体驱动客户端宿主fontdrvhostexe启动后。

di**hostservicingprocess的特点

在系统启动完成并开始加载非本地的字体文件时,就开启用户模式字体引擎,通过Winlogon控制的用户模式字体引擎客户端fontdrvhostexe,利用NtGdiExtEscape同内核进行交互,为内核的UMFD部分实现字体文件的解析渲染工作,并给内核模式返回需要的接口。

在不影响功能消耗非常见情况下的较少性能的前提下,实现了字体数据解析和渲染的用户模式加受限权限隔离,用户模式字体驱动目前也都是编译在fontdrvhostexe这个进程的代码中的,主要有ttf字体驱动bmf字体驱动和vtf字体驱动等相关的处理代码。

Socket 问题,200分

1.简单服务器

//#include winsock2.h

//#pragma comment(lib,"WS2_32.lib")

WSADATA wsd;

static UINT port=%%1;

UINT Listen(LPVOID pParam)

{

SOCKET sServer,sClient;

char buf[1024];

int retVal;

if(WSAStartup(MAKEWORD(2,2),wsd)!=0)

{

return -1;//失败

}

sServer=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);

if(INVALID_SOCKET==sServer)

{

WSACleanup();

return -1;//创建套接字失败

}

SOCKADDR_IN addrServ;

addrServ.sin_family=AF_INET;

addrServ.sin_port=htons((short)pParam);

addrServ.sin_addr.s_addr=INADDR_ANY;

retVal=bind(sServer,(LPSOCKADDR)addrServ,sizeof(SOCKADDR_IN));

if(SOCKET_ERROR==retVal)

{

closesocket(sServer);

WSACleanup();

return -1;//绑定套接字失败

}

retVal=listen(sServer,1);

if(SOCKET_ERROR==retVal)

{

closesocket(sServer);

WSACleanup();

return -1;//开始监听失败

}

sockaddr_in addrClient;

int addrClientlen=sizeof(addrClient);

sClient=accept(sServer,(sockaddr FAR*)addrClient,addrClientlen);

if(INVALID_SOCKET==sClient)

{

closesocket(sServer);

WSACleanup();

return -1;//开始接受客户端连接失败

}

ZeroMemory(buf,sizeof(buf));

retVal=recv(sClient,buf,sizeof(buf),0);

if(SOCKET_ERROR==retVal)

{

closesocket(sServer);

closesocket(sClient);

WSACleanup();

return -1;//接收数据失败

}

CString %%2(buf);

closesocket(sServer);

closesocket(sClient);

WSACleanup();

return 0;

}

CWinThread *pThread=AfxBeginThread(Listen,port);

2.简单客户端

//#include winsock2.h

//#pragma comment(lib,"WS2_32.lib")

WSADATA wsd;

SOCKET sHost;

SOCKADDR_IN servAddr;

char buf[1024];

int retVal;

if(WSAStartup(MAKEWORD(2,2),wsd)!=0)

{

return -1;//失败

}

sHost=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);

if(INVALID_SOCKET==sHost)

{

WSACleanup();

return -1;//创建套接字失败

}

servAddr.sin_family=AF_INET;

servAddr.sin_addr.s_addr=inet_addr(%%3);

servAddr.sin_port=htons((short)%%2);

int nServAddlen=sizeof(servAddr);

retVal=connect(sHost,(LPSOCKADDR)servAddr,sizeof(servAddr));

if(SOCKET_ERROR==retVal) {

closesocket(sHost);

WSACleanup();

return -1;//连接服务器失败

}

ZeroMemory(buf,sizeof(buf));

strcpy(buf,%%3);

retVal=send(sHost,buf,sizeof(buf),0);

if(SOCKET_ERROR==retVal)

{

closesocket(sHost);

WSACleanup();

return -1;//向服务器发送数据失败

}

closesocket(sHost);

WSACleanup();

3.获得本机IP

//#include winsock2.h

//#pragma comment(lib,"WS2_32.lib")

WSADATA wsd;

if(WSAStartup(MAKEWORD(2,2),wsd)!=0)

{

return -1;//失败

}

char szHostname[100],szHostaddress[200];

if(gethostname(szHostname,sizeof(szHostname))!=SOCKET_ERROR)

{

HOSTENT *pHostEnt=gethostbyname(szHostname);

if(pHostEnt!=NULL){

sprintf(szHostaddress,"%d.%d.%d.%d",

( pHostEnt-h_addr_list[0][0]0x00ff ),

( pHostEnt-h_addr_list[0][1]0x00ff ),

( pHostEnt-h_addr_list[0][2]0x00ff ),

( pHostEnt-h_addr_list[0][3]0x00ff ));

}

}

else

return;

CString %%1(szHostaddress);

4.端对端通信

//#include winsock2.h

//#pragma comment(lib,"WS2_32.lib")

WSADATA wsd;

SOCKET s;

char buf[1024];

if(WSAStartup(MAKEWORD(2,2),wsd)!=0)

{

return -1;//失败

}

s=socket(AF_INET,SOCK_DGRAM,0);

if(s==INVALID_SOCKET)

{

WSACleanup();

return -1;//创建套接字失败

}

SOCKADDR_IN servAddr;

servAddr.sin_family=AF_INET;

servAddr.sin_addr.s_addr=inet_addr(%%1);

servAddr.sin_port=htons(INADDR_ANY);

if(bind(s,(SOCKADDR*)servAddr,sizeof(SOCKADDR_IN))==SOCKET_ERROR)

{

closesocket(s);

WSACleanup();

return -1;//绑定套接字失败

}

int nServAddrlen=sizeof(servAddr);

ZeroMemory(buf,sizeof(buf));

if(recvfrom(s,buf,sizeof(buf),0,(SOCKADDR*)servAddr,nServAddrlen)==SOCKET_ERROR)

{

closesocket(s);

WSACleanup();

return -1;//接收数据失败

}

CString %%2(buf);

ZeroMemory(buf,sizeof(buf));

strcpy(buf,%%3);

SOCKADDR_IN clientAddr;

clientAddr.sin_family=AF_INET;

clientAddr.sin_addr.s_addr=inet_addr(%%4);

clientAddr.sin_port=htons((short)%%5);

int nClientlen=sizeof(clientAddr);

if(sendto(s,buf,sizeof(buf),0,(SOCKADDR*)clientAddr,nClientlen)==SOCKET_ERROR)

{

closesocket(s);

WSACleanup();

return -1;//向服务器发送数据失败

}

closesocket(s);

WSACleanup();

5.点对点通信

//#include winsock2.h

//#pragma comment(lib,"WS2_32.lib")

WSADATA wsd;

SOCKADDR_IN addrServ,addrServ2;

SOCKET sServer,sClient,sHost;

int retVal;

sockaddr_in addrClient;

char buf[1024];

static UINT port=%%2;

BOOL listenerRun=TRUE;

UINT Listen(LPVOID pParam)

{

addrServ.sin_family=AF_INET;

addrServ.sin_port=htons((UINT)pParam);

addrServ.sin_addr.s_addr=INADDR_ANY;

retVal=bind(sServer,(LPSOCKADDR)addrServ,sizeof(SOCKADDR_IN));

if(SOCKET_ERROR==retVal)

{

closesocket(sServer);

WSACleanup();

return -1;//绑定套接字失败

}

retVal=listen(sServer,1);

if(SOCKET_ERROR==retVal)

{

closesocket(sServer);

WSACleanup();

return -1;//开始监听失败

}

int addrClientlen=sizeof(addrClient);

sClient=accept(sServer,(sockaddr FAR*)addrClient,addClientlen);

if(INVALID_SOCKET==sClient)

{

closesocket(sServer);

WSACleanup();

return -1;//接收客户端请求失败

}

while(listenerRun)

{

ZeroMemory(buf,sizeof(buf));

retVal=recv(sClient,buf,sizeof(buf));

if(SOCKET_ERROR==retVal)

{

closesocket(sServer);

closesocket(sClient);

WSACleanup();

return -1;//接收客户端数据失败

}

CString %%4(buf);

}

}

if(WSAStartup(MAKEWORD(2,2),wsd)!=0)

{

return -1;//失败

}

sServer=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);

if(INVALID_SOCKET==sServer)

{

WSACleanup();

return -1;//创建套接字失败

}

CWinThread *pThread=AfxBeginThread(Listen,port);

sHost=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);

if(INVALID_SOCKET==sHost)

{

WSACleanup();

return -1;//创建套接字失败

}

servAddr2.sin_family=AF_INET;

servAddr2.sin_addr.s_addr=inet_addr(%%1);

servAddr.sin_port=htons((short)%%3);

int nServerAddrlen=sizeof(servAddr2);

retVal=connect(sHost,(LPSOCKADDR)servAddr2,sizeof(servAddr2));

if(SOCKET_ERROR==retVal)

{

closesocket(sHost);

WSACleanup();

return -1;//连接失败

}

zeroMemory(buf,sizeof(buf));

strcpy(buf,%%5);

retVal=send(sHost,buf,sizeof(buf),0);

if(SOCKET_ERROR==retVal)

{

closesocket(sHost);

WSACleanup();

return -1;//向发送数据失败

}

listenerRun=FALSE;

DWORD dwExitCode;

::GetExitCodeThread(pThread-m_hThread,dwExitCode);

pThread=null;

closesocket(sServer);

closesocket(sClient);

closesocket(sHost);

WSACleanup();

6.UDP对时服务器端

//#include winsock2.h

//#pragma comment(lib,"WS2_32.lib")

WSADATA wsd;

SOCKET s;

char buf[1024];

if(WSAStartup(MAKEWORD(2,2),wsd)!=0)

{

return -1;//失败

}

s=socket(AF_INET,SOCK_DGRAM,0);

if(s==INVALID_SOCKET)

{

WSACleanup();

return -1;//创建套接字失败

}

SOCKADDR_IN servAddr;

servAddr.sin_family=AF_INET;

servAddr.sin_addr.s_addr=inet_addr("127.0.0.1");

servAddr.sin_port=htons(5000);

if(bind(s,(SOCKADDR*)servAddr,sizeof(SOCKADDR_IN))==SOCKET_ERROR)

{

closesocket(s);

WSACleanup();

return -1;//绑定套接字失败

}

int nServAddrlen=sizeof(servAddr);

ZeroMemory(buf,sizeof(buf));

if(recvfrom(s,buf,sizeof(buf),0,(SOCKADDR*)servAddr,nServAddrlen)==SOCKET_ERROR)

{

closesocket(s);

WSACleanup();

return -1;//接收数据失败

}

CString str(buf);

if(str=="TimeNow")

{

SOCKADDR_IN clientAddr;

clientAddr.sin_family=AF_INET;

clientAddr.sin_addr.s_addr=inet_addr("127.0.0.1");

clientAddr.sin_port=htons((short)2000);

int nClientlen=sizeof(clientAddr);

SYSTEMTIME systime;

GetLocalTime(systime);

if(sendto(s,(char *)systime,sizeof(SYSTEMTIME),0,(SOCKADDR*)clientAddr,nClientlen)==SOCKET_ERROR)

{

closesocket(s);

WSACleanup();

return -1;//向服务器发送数据失败

}

}

closesocket(s);

WSACleanup();

7.UDP对时客户端

//#include winsock2.h

//#pragma comment(lib,"WS2_32.lib")

WSADATA wsd;

SOCKET s;

char buf[1024];

if(WSAStartup(MAKEWORD(2,2),wsd)!=0)

{

return -1;//失败

}

s=socket(AF_INET,SOCK_DGRAM,0);

if(s==INVALID_SOCKET)

{

WSACleanup();

return -1;//创建套接字失败

}

SOCKADDR_IN servAddr;

servAddr.sin_family=AF_INET;

servAddr.sin_addr.s_addr=inet_addr("127.0.0.1");

servAddr.sin_port=htons(2000);

if(bind(s,(SOCKADDR*)servAddr,sizeof(SOCKADDR_IN))==SOCKET_ERROR)

{

closesocket(s);

WSACleanup();

return -1;//绑定套接字失败

}

int nServAddrlen=sizeof(servAddr);

ZeroMemory(buf,sizeof(buf));

CString ss="TimeNow";

strcpy(buf,ss);

SOCKADDR_IN clientAddr;

clientAddr.sin_family=AF_INET;

clientAddr.sin_addr.s_addr=inet_addr("127.0.0.1");

clientAddr.sin_port=htons((short)5000);

int nClientlen=sizeof(clientAddr);

if(sendto(s,buf,sizeof(buf),0,(SOCKADDR*)clientAddr,nClientlen)==SOCKET_ERROR)

{

closesocket(s);

WSACleanup();

return -1;//向服务器发送数据失败

}

memset(buf,0,1024);

if(recvfrom(s,buf,sizeof(buf),0,(SOCKADDR*)servAddr,nServAddrlen)==SOCKET_ERROR)

{

closesocket(s);

WSACleanup();

return -1;//接收数据失败

}

SYSTEMTIME systime;

memcpy(systime,buf,16);

SetLocalTime(systime);//设置本地与服务器时间同步。

closesocket(s);

WSACleanup();

8.点对点传输文件

9.发送邮件

/*

#import cdonts.dll

#include "tchar.h"

#include "stdio.h"

*/

CoInitialize(NULL);

try

{

CDONTS::INewMailPtr spNewMail(__uuidof(CDONTS::NewMail));

spNewMail-From = _T("YourName");

spNewMail-To = _T("zxgdata@21cn.com");

spNewMail-Subject = _T("Testing");

spNewMail-Body = _T("Put your message here");

spNewMail-AttachFile(_variant_t(_bstr_t("C:\\tmp\\test\\mail\\mail.cpp")),_variant_t((long)DISP_E_PARAMNOTFOUND, VT_ERROR),_variant_t((long)DISP_E_PARAMNOTFOUND, VT_ERROR));

spNewMail-Send();

printf("send ok");

}

catch(_com_error ComError)

{

printf("%s\n",ComError.Description());

}

CoUninitialize();

10.接收邮件

利用JMail组件快速构建邮件程序

11.多线程阻塞通信

12.多线程非阻塞通信

13.多线程文件断点续传

14.多线程多文件断点续传

15.截取屏幕

HBITMAP CopyScreenToBitmap(LPRECT lpRect)

//lpRect 代表选定区域

{

HDC hScrDC, hMemDC;

// 屏幕和内存设备描述表

HBITMAP hBitmap, hOldBitmap;

// 位图句柄

int nX, nY, nX2, nY2;

// 选定区域坐标

int nWidth, nHeight;

// 位图宽度和高度

int xScrn, yScrn;

// 屏幕分辨率

// 确保选定区域不为空矩形

if (IsRectEmpty(lpRect))

return NULL;

//为屏幕创建设备描述表

hScrDC = CreateDC("DISPLAY", NULL, NULL, NULL);

//为屏幕设备描述表创建兼容的内存设备描述表

hMemDC = CreateCompatibleDC(hScrDC);

// 获得选定区域坐标

nX = lpRect- left;

nY = lpRect- top;

nX2 = lpRect- right;

nY2 = lpRect- bottom;

// 获得屏幕分辨率

xScrn = GetDeviceCaps(hScrDC, HORZRES);

yScrn = GetDeviceCaps(hScrDC, VERTRES);

//确保选定区域是可见的

if (nX 〈0)

nX = 0;

if (nY 〈 0)

nY = 0;

if (nX2 xScrn)

nX2 = xScrn;

if (nY2 yScrn)

nY2 = yScrn;

nWidth = nX2 - nX;

nHeight = nY2 - nY;

// 创建一个与屏幕设备描述表兼容的位图

hBitmap = CreateCompatibleBitmap

(hScrDC, nWidth, nHeight);

// 把新位图选到内存设备描述表中

hOldBitmap = SelectObject(hMemDC, hBitmap);

// 把屏幕设备描述表拷贝到内存设备描述表中

BitBlt(hMemDC, 0, 0, nWidth, nHeight,

hScrDC, nX, nY, SRCCOPY);

//得到屏幕位图的句柄

hBitmap = SelectObject(hMemDC, hOldBitmap);

//清除

DeleteDC(hScrDC);

DeleteDC(hMemDC);

// 返回位图句柄

return hBitmap;

}

得到屏幕位图句柄以后,我们

可以把屏幕内容粘贴到剪贴板上.

if (OpenClipboard(hWnd))

//hWnd为程序窗口句柄

{

//清空剪贴板

EmptyClipboard();

//把屏幕内容粘贴到剪贴板上,

hBitmap 为刚才的屏幕位图句柄

SetClipboardData(CF_BITMAP, hBitmap);

//关闭剪贴板

CloseClipb

oard();

}

我们也可以把屏幕内容以位图格式存到磁盘文件上.

int SaveBitmapToFile(HBITMAP hBitmap ,

LPSTR lpFileName) //hBitmap 为刚才的屏幕位图句柄

{ //lpFileName 为位图文件名

HDC hDC;

//设备描述表

int iBits;

//当前显示分辨率下每个像素所占字节数

WORD wBitCount;

//位图中每个像素所占字节数

//定义调色板大小, 位图中像素字节大小 ,

位图文件大小 , 写入文件字节数

DWORD dwPaletteSize=0,

dwBmBitsSize,

dwDIBSize, dwWritten;

BITMAP Bitmap;

//位图属性结构

BITMAPFILEHEADER bmfHdr;

//位图文件头结构

BITMAPINFOHEADER bi;

//位图信息头结构

LPBITMAPINFOHEADER lpbi;

//指向位图信息头结构

HANDLE fh, hDib, hPal,hOldPal=NULL;

//定义文件,分配内存句柄,调色板句柄

//计算位图文件每个像素所占字节数

hDC = CreateDC("DISPLAY",NULL,NULL,NULL);

iBits = GetDeviceCaps(hDC, BITSPIXEL) *

GetDeviceCaps(hDC, PLANES);

DeleteDC(hDC);

if (iBits 〈 = 1)

wBitCount = 1;

else if (iBits 〈 = 4)

wBitCount = 4;

else if (iBits 〈 = 8)

wBitCount = 8;

else if (iBits 〈 = 24)

wBitCount = 24;

//计算调色板大小

if (wBitCount 〈 = 8)

dwPaletteSize = (1 〈 〈 wBitCount) *

sizeof(RGBQUAD);

//设置位图信息头结构

GetObject(hBitmap, sizeof(BITMAP), (LPSTR)Bitmap);

bi.biSize = sizeof(BITMAPINFOHEADER);

bi.biWidth = Bitmap.bmWidth;

bi.biHeight = Bitmap.bmHeight;

bi.biPlanes = 1;

bi.biBitCount = wBitCount;

bi.biCompression = BI_RGB;

bi.biSi

zeImage = 0;

bi.biXPelsPerMeter = 0;

bi.biYPelsPerMeter = 0;

bi.biClrUsed = 0;

bi.biClrImportant = 0;

dwBmBitsSize = ((Bitmap.bmWidth *

wBitCount+31)/32)* 4

*Bitmap.bmHeight ;

//为位图内容分配内存

hDib = GlobalAlloc(GHND,dwBmBitsSize+

dwPaletteSize+sizeof(BITMAPINFOHEADER));

lpbi = (LPBITMAPINFOHEADER)GlobalLock(hDib);

*lpbi = bi;

// 处理调色板

hPal = GetStockObject(DEFAULT_PALETTE);

if (hPal)

{

hDC = GetDC(NULL);

hOldPal = SelectPalette(hDC, hPal, FALSE);

RealizePalette(hDC);

}

// 获取该调色板下新的像素值

GetDIBits(hDC, hBitmap, 0, (UINT) Bitmap.bmHeight,

(LPSTR)lpbi + sizeof(BITMAPINFOHEADER)

+dwPaletteSize,

(BITMAPINFOHEADER *)

lpbi, DIB_RGB_COLORS);

//恢复调色板

if (hOldPal)

{

SelectPalette(hDC, hOldPal, TRUE);

RealizePalette(hDC);

ReleaseDC(NULL, hDC);

}

//创建位图文件

fh = CreateFile(lpFileName, GENERIC_WRITE,

0, NULL, CREATE_ALWAYS,

FILE_ATTRIBUTE_NORMAL FILE_

FLAG_SEQUENTIAL_SCAN, NULL);

if (fh == INVALID_HANDLE_VALUE)

return FALSE;

// 设置位图文件头

bmfHdr.bfType = 0x4D42; // "BM"

dwDIBSize = sizeof(BITMAPFILEHEADER)

+ sizeof(BITMAPINFOHEADER)

+ dwPaletteSize + dwBmBitsSize;

bmfHdr.bfSize = dwDIBSize;

bmfHdr.bfReserved1 = 0;

bmfHdr.bfReserved2 = 0;

bmfHdr.bfOffBits = (DWORD)sizeof

(BITMAPFILEHEADER)

+ (DWORD)sizeof(BITMAPINFOHEADER)

+ dwPaletteSize;

// 写入位图文件头

WriteFile(fh, (LPSTR)bmfHdr, sizeof

(BITMAPFILEHEADER), dwWritten, NULL);

// 写入位图文件其余内容

WriteFile(fh, (LPSTR)lpbi, dwDIBSize,

dwWritten, NULL);

//清除

GlobalUnlock(hDib);

GlobalFree(hDib);

CloseHandle(fh);

}

16.聊天室服务器端逻辑

17.聊天室客户端逻辑

18.克隆对象

class Test

{

public:

Test(int temp)

{

p1=temp;

}

Test(Test c_t)//这里就是自定义的拷贝构造函数

{

cout"进入copy构造函数"endl;

p1=c_t.p1;//这句如果去掉就不能完成**工作了,此句**过程的核心语句

}

public:

int p1;

};

void main()

{

Test a(99);

Test b=a;

coutb.p1;

cin.get();

}

//========================================

#include iostream

using namespace std;

class Internet

{

public:

Internet(char *name,char *address)

{

cout"载入构造函数"endl;

strcpy(Internet::name,name);

strcpy(Internet::address,address);

cname=new char[strlen(name)+1];

if(cname!=NULL)

{

strcpy(Internet::cname,name);

}

}

Internet(Internet temp)

{

cout"载入COPY构造函数"endl;

strcpy(Internet::name,temp.name);

strcpy(Internet::address,temp.address);

cname=new char[strlen(name)+1];//这里注意,深拷贝的体现!

if(cname!=NULL)

{

strcpy(Internet::cname,name);

}

}

~Internet()

{

cout"载入析构函数!";

delete[] cname;

cin.get();

}

void show();

protected:

char name[20];

char address[30];

char *cname;

};

void Internet::show()

{

coutname":"addresscnameendl;

}

void test(Internet ts)

{

cout"载入test函数"endl;

}

void main()

{

Internet a("中国软件开发实验室","");

Internet b = a;

b.show();

test(b);

}

/*

RUMTIME_CLASS

运行时动态识别

RTTI

class base

{

virtual base* clone() = 0;

}

class A: public base

{

virtual base* clone() { return new A;}

}

class B: public base

{

virtual base* clone() { return new B;}

}

int main()

{

base* p1 = new A;

base* p2 = p1- clone();

return 0;

}

*/

19.XML属性文件解析

//#include string

//using namespace std;

char sRead[5192];

CFile mFile(_T(%%1),CFile::modeRead);

mFile.Read(sRead,5192);

if(sRead!=null)

{

string tmp;

while(sRead!=null)

{

tmp.append(sRead);

mFile.Read(sRead,5192);

}

//%%2="Logs" //%%4="ID" //%%6="Content"

//%%3="Log" //%%5="Time"

//%%7 code %%8 time %%9 content

string target(%%7),globalTag(""+%%2+"");

string propTag1(""+%%5+"",endTag1("/"+%%5+"");

string propTag2(""+%%6+"",endTag1("/"+%%6+"");

int offset=tmp.find_first_of(globalTag);

while(offset)

{

offset=tmp.find_first_of(globalTag);

string description;

tmp.copy(description.begin(),tmp.find_first_of("\"",offset+1)-offset);

if(target.compare(description)==0)

{

string prop,prop2;

offset=tmp.find_first_of(propTag1,offset)+strlen(%%5)+2;

tmp.copy(prop.begin(),tmp.find_first_of(endTag1,offset)-

offset,offset);

offset=tmp.find_first_of(propTag2,offset)+strlen(%%6)+2;

tmp.copy(prop2.begin(),tmp.find_first_of(endTag2,offset)-

offset,offset);

CString %%8(prop),%%9(prop2);

%%10

return 0;

}

}

}

else

return -1;

20.XML属性文件构造

//#include string

//using namespace std;

char sRead[5192];

string description;

CFile mFile(_T(%%1),CFile::modeRead);

mFile.Read(sRead,5192);

int no;

if(sRead!=null)

{

string tmp;

while(sRead!=null)

{

tmp.append(sRead);

mFile.Read(sRead,5192);

}

//%%2="Logs" //%%4="ID" //%%6="Content"

//%%3="Log" //%%5="Time"

//%%7 code %%8 time %%9 content

int offset=tmp.find_last_of(""+%%3+" "+%%4)+strlen(%%3) +strlen(%%4)+4;

tmp.copy(description.begin(),tmp.find_last_of("\""+%%5)- offset,offset);

bo=atoi(description.c_str())+1;

mFile.Close();

tmp.insert(tmp.find_last_of("/"+%%2+""),""+%%3+" "+%%

4+"=\""+itoa(no)+"\""+%%5+""+%%8+"/"+%%5+""+%%6+""+%%

9+"/"+%%6+"");

CFile file(_T(%%1),CFile::modeWrite);

file.Write(tmp.c_str()):

file.Flush();

file.Close();

}

else

{

CFile file(_T(%%1),CFile::modeWrite|CFile::modeCreate);

file.Write("?xml version=\"1.0\" encoding=\"gb2312\"?"+%%

2+""+%%3+" "+%%4+"=\"0\""+%%5+""+%%8+"/"+%%5+""+%%

6+""+%%9+"/"+%%6+"/"+%%3+"/"+%%2+"");

file.Flush();

file.Close();

}

基于java的p2p实现文件共享和传输

在JAVA中,发送和接收多播信息的方法: 

发送多播信息需经历步骤 

确定发送的具体信息内容 

String msg = "Hello"; 

选用专门为多播指定的D类IP地址(224.0.0.1到239.255.255.255),创建一个多播组 

InetAddress group = InetAddress.getByName("228.5.6.7"); 

使用指定的端口(一般选1024以上的端口号)建立多播套接字 

MulticastSocket s = new MulticastSocket(6789); 

加入多播组 

s.joinGroup(group); 

创建一个数据报封装多播信息 

DatagramPacket hi = new DatagramPacket(msg.getBytes(), msg.length(), 

group, 6789); 

发送 

s.send(hi); 

接收多播信息的步骤 

开辟接收缓冲区 

byte[] buf = new byte[1000]; 

创建接收数据报 

DatagramPacket recv = new DatagramPacket(buf, buf.length); 

接收 

s.receive(recv); 

注意:以上发送和接收程序在同一个文件中实现,若在不同文件中实现则应分别定义多播套接字并加入多播组。 

3.与已知IP和端口的端点通信 

在互联网上主要采用TCP和UDP来实现两点之间的通信。采用TCP可可靠传送信息,但花费时间较多;采用UDP可快速传递信息,但不能保证可靠传递。

JAVA实现TCP通信的方法 :

利用Socket(InetAddress addr, int port)和 Socket(String host, int port),创建客户端套接字,利用ServerSocket(int port)创建服务器端套接字,port端口就是服务器监听连接请求的端口,通过调用accept()返回一个最近创建的Socket对象,该Socket对象绑定了客户程序的IP地址或端口号。通过调用Socket的 getInputStream()方法获得输入流读传送来的信息,也可能通过调用Socket的 getOutputStream()方法获得输出流来发送消息。 

 

JAVA实现UDP通信的方法 :

使用DatagramPacket(byte [] buffer, int length, InetAddress addr, int port) 确定数据包数组、数组的长度、数据包的地址和端口信息。使用DatagramSocket()创建客户端套接字,而服务器端则采用DatagramSocket(int port),调用send(DatagramPacket dgp)和 receive(DatagramPacket dgp)来发送和接收数据包。本文设计的程序采用UDP。

P2P(Peer-to-Peer 端到端)模型是与C/S(客户/服务器)模型相对应。基于C/S的用户间通信需要由服务器中转,在C/S中的服务器故障将导致整个网络通信的瘫痪。。而基于P2P的用户间通信则是直接通信,去掉了服务器这一层,带来的显著优点是通信时没有单一的失败点,一个用户的故障不会影响整个P2P网络。本文提供了一种用JAVA实现P2P网络通信的方法。   

ADFS 3.0 + Oauth2.0

搭建 ADFS 之后,默认已经开启了 Oauth2.0.

注意添加或者使用已有的 信赖方信任 , 增加一个自己的标识符

参考

如果遇到:

error=invalid_resourceerror_description=MSIS9602%3a+The+received+%27resource%27+parameter+is+invalid.+The+authorization+server+can+not+find+a+registered+resource+with+the+specified+identifier.

说明 未信任 或者 标识符传错了

以下为具体的实验过程:

发送

POST /adfs/oauth2/token HTTP/1.1

Content-Type: application/x-www-form-urlencoded

Host: your.adfs.server

Content-Length: some number

grant_type=authorization_codeclient_id=some-uid-or-otherredirect_uri=http%3A%2F%2Flocalhost%3A3000%2FgetATokencode=thecode

遇到错误:

{

"error": "invalid_request",

"error_description": "MSIS9609: The 'redirect_uri' parameter is invalid. No redirect uri with the specified value is registered for the received 'client_id'. "

}

特么的 竟然是因为 URL encode 了 redirect_uri . 因为是 POST,不用encode 这个参数.

5.获取Token:

{

"access_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsIng1dCI6IjBzTVZIOXlVdFlyaFhCd0hOcTdRejZrRm5XZyJ9.eyJhdWQiOiJ1cm46cmVseWluZzpwYXJ0eTp0cnVzdDppZGVudGlmaWVyIiwiaXNzIjoiaHR0cDovL1dJTi1SOUpOVU5LQ0VMSi5yaW5zeXMuY29tL2FkZnMvc2VydmljZXMvdHJ1c3QiLCJpYXQiOjE1NjE0NTQzOTQsImV4cCI6MTU2MTQ1Nzk5NCwidXBuIjoiQWRtaW5pc3RyYXRvckByaW5zeXMuY29tIiwidWlkIjoiQWRtaW5pc3RyYXRvciIsInN1YiI6ImFkbWluaXN0cmF0b3JAcmluc3lzLmNvbSIsImF1dGhfdGltZSI6IjIwMTktMDYtMjVUMDk6MDA6MzAuMTAyWiIsImF1dGhtZXRob2QiOiJ1cm46b2FzaXM6bmFtZXM6dGM6U0FNTDoyLjA6YWM6Y2xhc3NlczpQYXNzd29yZFByb3RlY3RlZFRyYW5zcG9ydCIsInZlciI6IjEuMCIsImFwcGlkIjoidG9kZCJ9.R7YOyp986M6sYPrjyCI5JAVEZ0XTat9i89Hi8PeV4xQbe5NLrjO6CqpN2v_C_sCj5PgGyBMkAHKX4Bgyf3s4eisilrsU7t08td2nYU05rzHL8IHF_Emv0B2s0O**Y5kkACI8iYAW0rQ7ZpfUitWgygTR-GtvBnZfAfn65OpEX87Gt_x6hXL88Oacia9Le1tBFX3MiK3ShrsIv4LrSaFw5HxfN_yfieZqxndmuXOL3tcna1jyamUdmMa4WcfdNwSRlxwVlUZvbGYxSHXgSwfUvak_zkekAEFI5QtNup85ZBp1JPehlXePOBLJ_ZGErIbt-5lmHT6uX2H--qKGEFbYeg",

"token_type": "bearer",

"expires_in": 3600,

"refresh_token": "_bhAioyNOFP-uPNqFdMUf3SW4RIyMaRcW1uFsnTohr4AAQAAKHBS9_LiM8OMqOH7mNv6JT_D1fm3LilU-bJGPi-6uHvW-mSkDHqgqy2JhdAocmsNZ08Duzcf6PV5pO9Z-CX-4EvuYTC7silc043QLXl1MOOxhw2V5sC6hrjO5BsUWXLRoGKerWrCAaW1TwS1bb9G1XtTgGigX2UjvcN8Z0u9_RV-"

}

什么是fontdrvhost.exe吗

进程名:fontdrvhost.exe

产品属于归宿:Microsoft® Windows® Operating System

文件描述:Di** Host Servicing Process

他是win10系统中“用户模式字体驱动”(User Mode Font Driver,UMFD)机制。用户模式字体驱动客户端宿主fontdrvhost.exe启动后,则会建立一个ServerRequestLoop线程,该线程通过NamedEscape(NtGdiExtEscape)(Dispatch id = 0 )来同内核交互。

这些用户模式字体驱动目前也都是编译在fontdrvhost.exe这个进程的代码中的,主要有ttf字体驱动、bmf字体驱动和vtf字体驱动等相关的处理代码。

在系统启动完成并开始加载非本地的字体文件时,就开启用户模式字体引擎。通过Winlogon控制的用户模式字体引擎客户端fontdrvhost.exe,利用NtGdiExtEscape同内核进行交互,为内核的UMFD部分实现字体文件的解析、渲染工作,并给内核模式返回需要的接口。

在不影响功能、消耗非常见情况下的较少性能的前提下,实现了字体数据解析和渲染的用户模式+受限权限隔离。

所以该进程是系统自带的字体驱动管理进程,我们无须担心。

赞(0)
文章名称:《bmfhost的简单介绍》
文章链接:https://www.fzvps.com/187284.html
本站文章来源于互联网,如有侵权,请联系管理删除,本站资源仅供个人学习交流,请于下载后24小时内删除,不允许用于商业用途,否则法律问题自行承担。
图片版权归属各自创作者所有,图片水印出于防止被无耻之徒盗取劳动成果的目的。

评论 抢沙发

评论前必须登录!