当前位置: 首页 > news >正文

高端网站建设的方案搜索关键词排名一般按照什么收费

高端网站建设的方案,搜索关键词排名一般按照什么收费,医院如何做网站策划,Wordpress修改主页网址写在前面 此前的回声服务器/客户端都是在主线程中阻塞交互,本文将使用多线程方式实现服务器/客户端。 互斥量相关接口 使用多线程,自然避免不了线程同步问题。 因本文使用互斥量实现线程同步,因此仅介绍互斥量相关接口,其他实…

写在前面

此前的回声服务器/客户端都是在主线程中阻塞交互,本文将使用多线程方式实现服务器/客户端。

互斥量相关接口

使用多线程,自然避免不了线程同步问题。

因本文使用互斥量实现线程同步,因此仅介绍互斥量相关接口,其他实现线程同步的方式(如关键代码段、事件以及信号量等)可自行查阅MSDN帮助文档。

创建互斥量

使用CreateMutex创建互斥量,原型如下:

#include <windows.h>
HANDLE CreateMutex(LPSECURITY_ATTRIBUTES lpMutexAttributes, BOOL bInitialOwner, LPCTSTR lpName);

成功时返回创建的互斥量对象句柄,失败返回NULL
lpMutexAttributes:传递安全相关的配置信息,使用默认安全设置时可以传递NULL
bInitialOwner:如果为TRUE,则创建出的互斥量对象属于调用该函数的线程,同时进入non-signaled状态;
如果为FALSE,则创建出的互斥量对象不属于任何线程,此时状态为signaled
lpName: 用于命名互斥量对象。传入NULL时创建无名的互斥量对象。

销毁互斥量

互斥量属于系统内核资源,使用完后需要手动释放。使用CloseHandle函数释放互斥量资源,原型如下:

BOOL CloseHandle(HANDLE hObject);

成功时返回TRUE,失败时返回FALSE
hObject 要销毁的内核对象的句柄

获取互斥量

通过WaitForSingleObject接口获取互斥量,原型如下:

DWORD WaitForSingleObject(HANDLE hHandle, DWORD dwMilliseconds);

hHandle:对象的句柄。 如果等待仍在等待时关闭此句柄,则函数的行为未定义。
dwMilliseconds:超时间隔(以毫秒为单位)。 如果指定了非零值,该函数将等待对象发出信号或间隔。 如果 dwMilliseconds 为零,则如果对象未发出信号,则函数不会输入等待状态;它始终会立即返回。 如果 dwMilliseconds 为 INFINITE,则仅当发出对象信号时,该函数才会返回。

释放互斥量

使用ReleaseMutex释放互斥量,使其转变为signaled状态。

BOOL ReleaseMutex(HANDLE hMutex);

成功时返回TRUE,失败时返回FALSE
hMutex: 需要释放(解除拥有)的互斥量对象句柄

多线程服务器

多线程服务器使用一个全局的socket数组维护连接的客户端socket,在主线程中等待客户端的连接,每有一个客户端连接时就单独开启一个线程提供回声服务,使用一个全局的互斥量对象实现各提供回声服务线程的线程同步。

代码如下:

// MultiThread_Server.cpp : 定义控制台应用程序的入口点。
//#include "stdafx.h"
#include <process.h>
#include <WinSock2.h>
#include <string>
#pragma comment(lib, "ws2_32.lib")using namespace std;#define BUF_SIZE 100
#define MAX_CLNT 256unsigned WINAPI HandleClnt(void* arg);
void SendMsg(char* arg, int len);HANDLE hMutex;
int clntCnt = 0;
SOCKET clntSocks[MAX_CLNT];void WriteRunLog(LPCSTR lpszLog, int len);int _tmain(int argc, _TCHAR* argv[])
{if (argc != 2){printf("argc error!\n");return -1;}WSADATA wsaData;if (0 != WSAStartup(MAKEWORD(2, 2), &wsaData)){printf("WSAStartup error!\n");return -1;}SOCKET srvSock = socket(PF_INET, SOCK_STREAM, 0);if (INVALID_SOCKET == srvSock){printf("socket error!\n");WSACleanup();return -1;}SOCKADDR_IN srvAddr;memset(&srvAddr, 0, sizeof(srvAddr));srvAddr.sin_family = PF_INET;srvAddr.sin_addr.s_addr = htonl(ADDR_ANY);srvAddr.sin_port = htons(_ttoi(argv[1]));if (SOCKET_ERROR == bind(srvSock, (sockaddr*)&srvAddr, sizeof(srvAddr))){printf("bind error!\n");closesocket(srvSock);WSACleanup();return -1;}if (SOCKET_ERROR == listen(srvSock, 5)){printf("listen error!\n");closesocket(srvSock);WSACleanup();return -1;}SOCKADDR_IN cltAddr;memset(&cltAddr, 0, sizeof(cltAddr));int nCltAddrSize = sizeof(cltAddr);hMutex = CreateMutex(NULL, FALSE, NULL);while (true){//接受连接线程nCltAddrSize = sizeof(cltAddr);puts("wait for client connect...");SOCKET cltSock = accept(srvSock, (sockaddr*)&cltAddr, &nCltAddrSize);if (cltSock == INVALID_SOCKET){printf("accept error\n");continue;}//等待操作互斥量数组WaitForSingleObject(hMutex, INFINITE);clntSocks[clntCnt++] = cltSock;ReleaseMutex(hMutex);//最后开启该套接字的消息处理线程HANDLE hThread = (HANDLE)_beginthreadex(NULL, 0, HandleClnt, (void*)&cltSock, 0, NULL);printf("Connected Client IP: %s \n", inet_ntoa(cltAddr.sin_addr));}CloseHandle(hMutex);closesocket(srvSock);WSACleanup();puts("main thread end.");puts("任意键继续...");getchar();return 0;
}unsigned WINAPI HandleClnt(void* arg)
{SOCKET cltSock = *((SOCKET*)arg);int nRecvLen = 0;char Msg[BUF_SIZE] = {};char Log[2*BUF_SIZE] = {};while ( (nRecvLen = recv(cltSock, Msg, BUF_SIZE, 0)) != 0 ){Msg[nRecvLen] = 0;//sprintf(Log, "recv msg from client《%d》: %s\n", cltSock, Msg);//WriteRunLog(Log, strlen(Log));SendMsg(Msg, nRecvLen);}//若客户端断开连接,则在套接字数组中清除对应socketWaitForSingleObject(hMutex, INFINITE);//找到要清除的套接字,从该位置开始,后续元素前移覆盖删除//双指针实现覆盖删除int slow = 0;int fast = 0;for (; fast < clntCnt; fast++){if (clntSocks[fast] == cltSock){continue;}clntSocks[slow++] = clntSocks[fast];}clntSocks[slow] = INVALID_SOCKET;clntCnt--;ReleaseMutex(hMutex);closesocket(cltSock);//sprintf(Log, "Client %d Disconnected...\n", cltSock);//WriteRunLog(Log, strlen(Log));return 0;}void SendMsg(char* arg, int len)
{//回复所有客户端WaitForSingleObject(hMutex, INFINITE);char Log[2*BUF_SIZE] = {};for (int i = 0; i < clntCnt; i++){//sprintf(Log, "Send to client 《%d》 msg: %s\n", clntSocks[i], len);//WriteRunLog(Log, strlen(Log));send(clntSocks[i], arg, len, 0);}ReleaseMutex(hMutex);
}

多线程客户端

此前的回声客户端均在主线程中进行读写操作,在多线程客户端中使用两个线程分别处理读写操作。

代码如下:

// MultiThread_Client.cpp : 定义控制台应用程序的入口点。
//#include "stdafx.h"
#include <process.h>
#include <WinSock2.h>
#pragma comment(lib, "ws2_32.lib")#define BUF_SIZE 100
#define NAME_SIZE 20unsigned WINAPI SendMsg(void* arg);
unsigned WINAPI RecvMsg(void* arg);char name[NAME_SIZE] = "[DEFAULT]";
char msg[BUF_SIZE] = {};int _tmain(int argc, _TCHAR* argv[])
{if (argc != 4){printf("argc error!\n");return -1;}WSADATA wsaData;if (0 != WSAStartup(MAKEWORD(2, 2), &wsaData)){printf("WSAStartup error!\n");return -1;}printf("server ip: %s, port: %s, client name: %s\n", argv[1], argv[2], argv[3]);sprintf(name, "[%s]", argv[3]);SOCKET cltSock = socket(PF_INET, SOCK_STREAM, 0);if (INVALID_SOCKET == cltSock){puts("socket error!");WSACleanup();return -1;}SOCKADDR_IN srvAddr;memset(&srvAddr, 0, sizeof(srvAddr));srvAddr.sin_family = PF_INET;srvAddr.sin_addr.s_addr = inet_addr(argv[1]);srvAddr.sin_port = htons(_ttoi(argv[2]));if (connect(cltSock, (sockaddr*)&srvAddr, sizeof(srvAddr)) == SOCKET_ERROR){puts("connect error!");closesocket(cltSock);WSACleanup();return -1;}//开启客户端的接收和发送线程HANDLE hSendThread = (HANDLE)_beginthreadex(NULL, 0, SendMsg, (void*)&cltSock, 0, NULL);HANDLE hRecvThread = (HANDLE)_beginthreadex(NULL, 0, RecvMsg, (void*)&cltSock, 0, NULL);WaitForSingleObject(hSendThread, INFINITE);WaitForSingleObject(hRecvThread, INFINITE);closesocket(cltSock);WSACleanup();puts("任意键继续...");getchar();return 0;
}unsigned WINAPI SendMsg(void* arg)
{SOCKET cltSock = *((SOCKET*)arg);char nameMsg[NAME_SIZE + BUF_SIZE] = {};while (true){//printf("Input Msg: ");fgets(msg, BUF_SIZE, stdin);if ( !strcmp(msg, "q\n") || !strcmp(msg, "Q\n") ){puts("Disconnect...");break;}sprintf(nameMsg, "%s %s", name, msg);send(cltSock, nameMsg, strlen(nameMsg), 0);}//exit(0);closesocket(cltSock);printf("client %d thread end.\n", cltSock);return 0;
}unsigned WINAPI RecvMsg(void* arg)
{SOCKET cltSock = *((SOCKET*)arg);char nameMsg[NAME_SIZE + BUF_SIZE] = {};int nRecvLen = 0;while (true){nRecvLen = recv(cltSock, nameMsg, NAME_SIZE + BUF_SIZE - 1, 0);if (nRecvLen == -1){puts("server disconnected!");return -1;}nameMsg[nRecvLen] = 0;printf("nameMsg from server: %s\n", nameMsg);}return 0;
}

运行结果如下:
运行结果

总结

虽然使用互斥量实现了简单的多线程服务器/客户端,但也只是借此熟悉下线程及线程同步相关的接口,可以明显的看到效率还是比较低下的。

要想使用高效的Windows服务器客户端,可以使用IOCP完成端口实现。


文章转载自:
http://dinncodimethylmethane.tqpr.cn
http://dinncorarotonga.tqpr.cn
http://dinncoramayana.tqpr.cn
http://dinncodamascene.tqpr.cn
http://dinncobegonia.tqpr.cn
http://dinncoommatidium.tqpr.cn
http://dinncorollpast.tqpr.cn
http://dinncotache.tqpr.cn
http://dinnconevadan.tqpr.cn
http://dinncomary.tqpr.cn
http://dinncodaubster.tqpr.cn
http://dinncomalang.tqpr.cn
http://dinncomilimeter.tqpr.cn
http://dinncocustard.tqpr.cn
http://dinncoindustrial.tqpr.cn
http://dinncopuritanism.tqpr.cn
http://dinncopersonation.tqpr.cn
http://dinncotristful.tqpr.cn
http://dinncomarabunta.tqpr.cn
http://dinncomaryknoller.tqpr.cn
http://dinncoautosome.tqpr.cn
http://dinncoedgeless.tqpr.cn
http://dinncomarquee.tqpr.cn
http://dinncomultitudinous.tqpr.cn
http://dinncosamsoe.tqpr.cn
http://dinncoflow.tqpr.cn
http://dinncorecoilless.tqpr.cn
http://dinncoformulise.tqpr.cn
http://dinncoamatol.tqpr.cn
http://dinncounstrained.tqpr.cn
http://dinncointerrobang.tqpr.cn
http://dinnconeolite.tqpr.cn
http://dinncotribunitian.tqpr.cn
http://dinncolongicaudal.tqpr.cn
http://dinncodamocles.tqpr.cn
http://dinncopolyconic.tqpr.cn
http://dinncocuboidal.tqpr.cn
http://dinncoviron.tqpr.cn
http://dinncohutchie.tqpr.cn
http://dinncoforbiddance.tqpr.cn
http://dinncosemiweekly.tqpr.cn
http://dinncopolka.tqpr.cn
http://dinncowhetter.tqpr.cn
http://dinncoprotonephridium.tqpr.cn
http://dinncobribee.tqpr.cn
http://dinncoazonic.tqpr.cn
http://dinncogusset.tqpr.cn
http://dinncoaffectionate.tqpr.cn
http://dinncoemergencies.tqpr.cn
http://dinncoantiestrogen.tqpr.cn
http://dinncoratissage.tqpr.cn
http://dinncosponsor.tqpr.cn
http://dinncoperspective.tqpr.cn
http://dinncoenglishness.tqpr.cn
http://dinncosexagenary.tqpr.cn
http://dinncocancha.tqpr.cn
http://dinncolepidopterological.tqpr.cn
http://dinncominable.tqpr.cn
http://dinncobeaconage.tqpr.cn
http://dinncosensitisation.tqpr.cn
http://dinncojudicator.tqpr.cn
http://dinncocorer.tqpr.cn
http://dinncoprocession.tqpr.cn
http://dinncotelestereoscope.tqpr.cn
http://dinncoapolitical.tqpr.cn
http://dinncoatmometry.tqpr.cn
http://dinncomantle.tqpr.cn
http://dinncona.tqpr.cn
http://dinncoferial.tqpr.cn
http://dinncoinion.tqpr.cn
http://dinncounappealable.tqpr.cn
http://dinncobiotypology.tqpr.cn
http://dinncodespoliation.tqpr.cn
http://dinncocondolence.tqpr.cn
http://dinncooutwatch.tqpr.cn
http://dinncodebouche.tqpr.cn
http://dinncopuckish.tqpr.cn
http://dinncotelethermoscope.tqpr.cn
http://dinncobassoonist.tqpr.cn
http://dinncoevening.tqpr.cn
http://dinncoconvulsively.tqpr.cn
http://dinncoopposed.tqpr.cn
http://dinncoundismayed.tqpr.cn
http://dinncotrisubstituted.tqpr.cn
http://dinncoarchdiocese.tqpr.cn
http://dinncowestphalia.tqpr.cn
http://dinncoamphitheater.tqpr.cn
http://dinncosafrol.tqpr.cn
http://dinncomafia.tqpr.cn
http://dinncooncostman.tqpr.cn
http://dinncosimulate.tqpr.cn
http://dinncohatbox.tqpr.cn
http://dinncoimpot.tqpr.cn
http://dinncocupferron.tqpr.cn
http://dinncobloomy.tqpr.cn
http://dinncoimploration.tqpr.cn
http://dinncogooey.tqpr.cn
http://dinncoqube.tqpr.cn
http://dinncohouselet.tqpr.cn
http://dinncoconditioning.tqpr.cn
http://www.dinnco.com/news/102300.html

相关文章:

  • 内江网站开发专业做网络推广的公司
  • 燕郊网站制作seo站内优化
  • 北京好的做网站公司快速排名精灵
  • 深圳网站建设价格多少武汉百度推广优化
  • 鸣蝉小程序制作平台seo网页优化平台
  • 做网站用centos还是ubuntu网络营销中的seo与sem
  • 去除 做网站就用建站之星谷歌三件套一键安装
  • 在线游戏网页版廊坊seo管理
  • 建设部网站资质升级公示建网站软件
  • 四川省建设厅门户网站营销网站设计
  • 智慧团建网站登陆平台百度指数在线查询小程序
  • 删除网站死链精准大数据获客系统
  • 企业网络服务长沙专业竞价优化首选
  • 深圳哪家网站建设好网络营销推广方案怎么写
  • wordpress企业魔板seo外链网
  • app store怎么调回中文福州seo技术培训
  • 外包网站设计产品营销推广
  • 用明星名字做网站最有效的恶意点击
  • 深圳flash网站建设内容营销平台有哪些
  • 极路由 做网站太原网站建设方案优化
  • 网站地图是怎么做的长沙网站优化公司
  • 外围网站怎么做艾滋病阻断药
  • 国内网站做得好的公司网络营销平台排名
  • 乌鲁木齐做网站优化小说引流推广
  • 梧州网站建设厂家站长工具seo优化
  • 做公司网站首页bt磁力搜索器
  • 湖北网站推广策略营销咨询服务
  • 网站首页做了一下调整会被k吗百度推广开户
  • 本地网站搭建软件sem推广外包
  • 哪些网站是503错误代码网络推广都有哪些平台