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

中国建设银行手机银行家网站如何做网站优化

中国建设银行手机银行家网站,如何做网站优化,系统开发需求,专业做国际网站多线程 socket 编程 服务端的设计: 1、每来一条消息,服务端起一个线程(安排一个工人)维护 2、将收到的消息转发给所有的客户端 3、某个连接断开,需要处理断开的连接 //多线程socket编程的一个联合使用 //用互斥体…

多线程 + socket 编程

服务端的设计:

1、每来一条消息,服务端起一个线程(安排一个工人)维护

2、将收到的消息转发给所有的客户端

3、某个连接断开,需要处理断开的连接

//多线程+socket编程的一个联合使用
//用互斥体进行线程同步	socket编程	临界区	全局变量#include <WinSock2.h>
#include <iostream>
#include <windows.h>
#include <process.h>#pragma comment(lib, "ws2_32.lib")#define MAX_CLNT 256
#define MAX_BUF_SIZE 256SOCKET clntSocks[MAX_CLNT];	//所有的连接的客户端socket 
HANDLE hMutex;
int clntCnt = 0;  //最大连接数// 服务端的设计:
// 
// 1、每来一条消息,服务端起一个线程(安排一个工人)维护
// 
// 2、将收到的消息转发给所有的客户端
// 
// 3、某个连接断开,需要处理断开的连接//发送给所有的客户端
void SendMsg(char* szMsg, int iLen)
{WaitForSingleObject(hMutex, INFINITE);int i = 0;for (i = 0; i < clntCnt; i++){send(clntSocks[i], szMsg, iLen, 0);}ReleaseMutex(hMutex);
}//处理客户端连接的函数
unsigned WINAPI HandleClient(void* arg)
{//接收传递过来的参数SOCKET hClntSock = *((SOCKET*)arg);int iLEN = 0, i;char szMsg[MAX_BUF_SIZE] = { 0 };//进行数据的收发  循环接收//接收到客户端的数据while ((iLEN = recv(hClntSock, szMsg, sizeof(szMsg),0)) != 0){SendMsg(szMsg, iLEN);}// 3、某个连接断开,需要处理断开的连接WaitForSingleObject(hMutex, INFINITE);for (i = 0; i < clntCnt; i++){if (hClntSock == clntSocks[i]){//移位while (i < clntCnt){clntSocks[i] = clntSocks[i + 1];i++;}break;}}clntCnt--;printf("此时连接数目:%d", clntCnt);ReleaseMutex(hMutex);closesocket(hClntSock);return 0;
}
int main()
{// 加载套接字库WORD wVersionRequested;WSADATA wsaData;int err;HANDLE hThread;wVersionRequested = MAKEWORD(1, 1);// 初始化套接字库err = WSAStartup(wVersionRequested, &wsaData);if (err != 0){return err;}if (LOBYTE(wsaData.wVersion) != 1 || HIBYTE(wsaData.wVersion) != 1){WSACleanup();return -1;}//---创建一个互斥对象hMutex = CreateMutex(NULL, FALSE, NULL);// 新建套接字SOCKET sockSrv = socket(AF_INET, SOCK_STREAM, 0);SOCKADDR_IN addrSrv;addrSrv.sin_addr.S_un.S_addr = htonl(INADDR_ANY);addrSrv.sin_family = AF_INET;addrSrv.sin_port = htons(9190);// 绑定套接字到本地IP地址,端口号9190if (bind(sockSrv, (SOCKADDR*)&addrSrv, sizeof(SOCKADDR)) == SOCKET_ERROR){printf("bind ERRORnum = %d\n", GetLastError());return -1;}// 开始监听if(listen(sockSrv, 5) == SOCKET_ERROR)//队列容量5,当这五个没有被accept的时候,再来一个就会报错{printf("listen ERRORnum = %d\n", GetLastError());return -1;}printf("start listen\n");SOCKADDR_IN addrCli;int len = sizeof(SOCKADDR);while (true){// 接收客户连接 sockConn此时来的客户端连接SOCKET sockConn = accept(sockSrv, (SOCKADDR*)&addrCli, &len);//1、每来一条消息,服务端起一个线程(安排一个工人)维护客户端的连接//每来一个连接,全局数组应该加一个成员,最大连接数加1WaitForSingleObject(hMutex, INFINITE);clntSocks[clntCnt++] = sockConn;ReleaseMutex(hMutex);//死锁 必须等待上一条语句结束才能进行下一条语句hThread = (HANDLE)_beginthreadex(NULL, 0, HandleClient,(void*)&sockConn, 0, NULL);printf("Connect client IP; %s \n", inet_ntoa(addrCli.sin_addr));printf("Connect client num; %d \n", clntCnt);}closesocket(sockSrv);WSACleanup();return 0;
}

客户端的设计:

1、连接服务器

2、与服务器进行通信

3、下线机制

// 1、接收服务端的消息  安排一个工人(起一个线程接收消息)
// 2、发送消息给服务端  安排一个工人(起一个线程发送消息)
// 3、退出机制
#include <WinSock2.h>
#include <iostream>
#include <windows.h>
#include <process.h>#pragma comment(lib, "ws2_32.lib")#define NAME_SIZE 20
#define BUF_SIZE 256char szName[NAME_SIZE] = "[DEFAULT]";
char szMsg[BUF_SIZE];//发送消息给服务端
unsigned WINAPI SendMsg(void* arg)
{//接收传递过来的参数SOCKET hClntSock = *((SOCKET*)arg);char szNameMsg[NAME_SIZE + BUF_SIZE]; //名字 + 消息 //循环接收来自于控制台的消息while (1){fgets(szMsg, BUF_SIZE, stdin);//阻塞在这一句//退出机制 当收到Q\q 退出if (!strcmp(szMsg, "Q\n") || !strcmp(szMsg, "q\n")){closesocket(hClntSock);exit(0);}sprintf(szNameMsg, "%s %s", szName, szMsg);//字符串拼接send(hClntSock, szNameMsg, (int)strlen(szNameMsg), 0);//发送}return 0;
}
//接收来自服务端的消息
unsigned WINAPI RecvMsg(void* arg)
{//接收传递过来的参数SOCKET hClntSock = *((SOCKET*)arg);char szNameMsg[NAME_SIZE + BUF_SIZE]; //名字 + 消息 int iLen = 0;while (1){iLen = recv(hClntSock, szNameMsg, NAME_SIZE + BUF_SIZE - 1, 0);//服务端断开if (iLen == -1){return -1;}//szNameMsg的0到iLen-1都是收到的数据 iLen个szNameMsg[iLen] = 0;///接收到消息的输出到控制台fputs(szNameMsg, stdout);}return 0;
}
//带参数的main函数,用命令行启动,在当前目录按下 shift + 鼠标右键 cmd
int main(int argc, char* argv[])
{// 加载套接字库WORD wVersionRequested;WSADATA wsaData;int err;SOCKET hSock;SOCKADDR_IN servAdr;HANDLE hSendThread,hRecvThread;wVersionRequested = MAKEWORD(1, 1);// 初始化套接字库err = WSAStartup(wVersionRequested, &wsaData);if (err != 0){return err;}if (LOBYTE(wsaData.wVersion) != 1 || HIBYTE(wsaData.wVersion) != 1){WSACleanup();return -1;}sprintf(szName, "[%s]", argv[1]);//1、建立sockethSock = socket(PF_INET, SOCK_STREAM, 0);//2、配置端口和地址memset(&servAdr, 0, sizeof(servAdr));servAdr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");servAdr.sin_port = htons(9190);servAdr.sin_family = AF_INET;//3、连接服务器if (connect(hSock, (SOCKADDR*)&servAdr, sizeof(servAdr)) == SOCKET_ERROR){printf("connect error error code = %d\n", GetLastError());return -1;}// 4、发送消息给服务端  安排一个工人(起一个线程发送消息)hSendThread = (HANDLE)_beginthreadex(NULL, 0, SendMsg, (void*)&hSock, 0, NULL);// 5、接收服务端的消息  安排一个工人(起一个线程接收消息)hRecvThread = (HANDLE)_beginthreadex(NULL, 0, RecvMsg, (void*)&hSock, 0, NULL);//等待内核对象的信号发送变化WaitForSingleObject(hSendThread, INFINITE);WaitForSingleObject(hRecvThread, INFINITE);// 6、关闭套接字closesocket(hSock);WSACleanup();return 0;}
http://www.dtcms.com/wzjs/404566.html

相关文章:

  • 建行网上银行登录入口官网搜索引擎优化seo论文
  • 做国外服务器网站今日头条网页版入口
  • 自己做的网站怎样弄网上怎么制作网页设计
  • 网站开发工作流程今日新闻
  • 购物网站推广怎么做优化落实防控措施
  • 山东省建设执业资格注册管理中心网站站长工具域名
  • 免费网站空间 推荐佣金高的推广平台
  • 苏州公司网站设计网站模板平台资源
  • 了解网站开发的背景百度账号申请注册
  • 大连疫情最新通报抖音搜索seo代理
  • 资讯类网站建设资质要求厦门seo代运营
  • 河北企业自助建站最新国际足球世界排名
  • 推荐做那个的电影网站淘宝指数入口
  • 国外室内设计网站推荐网站推广排名服务
  • 深圳网站开发公推广下载app拿佣金
  • 香港MB网站电商网络推广是什么
  • 公司网站建设多少钱怎么推广销售
  • 清远市住房与城乡建设局的网站查网站开发的公司
  • 哪个网站做恒生指数最安全上海百度推广公司排名
  • 厦门专业网站营销联盟营销平台
  • 济南公司建站模板网络营销推广平台有哪些
  • 看男女做那个视频网站seo效果检测步骤
  • 中国住房和城乡建设网官网青岛seo服务
  • 深圳建网站的专业公司孔宇seo
  • 浅谈中兴电子商务网站建设广东疫情最新资讯
  • 网站备案包括哪些东西免费网站alexa排名查询
  • 怎么攻击phpweb网站关键词优化资讯
  • 网站板块的策划方案网页制作软件推荐
  • 网站改用绝对地址的好处市场营销八大营销模式
  • 手机投注网站建设今日国内新闻头条新闻