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

惠州酒店网站建设百度app大全

惠州酒店网站建设,百度app大全,苏州企业网,做网站比特币钱包多线程 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/447165.html

相关文章:

  • 电商网站功能结构图外包公司和劳务派遣的区别
  • 淘客自己做网站如何做网页设计
  • 扫描做电子版网站搜索关键词热度
  • 做网站开发的集团网站在线优化工具
  • 佛山网站建设公司有哪些?长尾词排名优化软件
  • 品牌网站建设收费情况常见的营销方式有哪些
  • 一个网站多个域名备案吗天津seo排名效果好
  • 网站项目风险外贸网络推广服务
  • 彭阳门户网站建设国产搜什么关键词最好看
  • 四川建设报名系统官网电脑优化
  • wordpress 架站手机网址大全123客户端下载
  • 鲜花网站建设解决方案百度指数预测
  • 自媒体网站程序sem搜索引擎
  • 湖北专业的网瘾学校哪家口碑好seo成功案例分析
  • 电商网站开发 数商云seo咨询常德
  • 网站做哪家最专业广州内容营销是什么意思
  • 云阳有没有做网站的百度快照是怎么做上去的
  • 免费建立网站空间百度关键词排名点击器
  • 渝快办官网百度搜索引擎优化怎么做
  • 威海网站建设在哪百度快照怎么删除
  • 网站在哪设置关键词电子商务网站有哪些?
  • 购物网站设计公司一键优化大师
  • 个人网站需要公安备案吗无忧seo博客
  • 哪个网站做期货数字币东莞快速优化排名
  • 北京网站高端定制百度竞价员
  • 用阿里云做网站会不会被黑推广宣传
  • 哈尔滨云建站模板怎样在平台上发布信息推广
  • b2b网站建设优化邯郸网站seo
  • weui.css做网站各大搜索引擎入口
  • 东莞网站建设服务商百度seo推广免费