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

柳州网站建设价格海南州公司网站建设

柳州网站建设价格,海南州公司网站建设,全国建筑四库一平台查询个人信息,360免费建站永久免费多线程 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://hyfvjVKf.Ldgfb.cn
http://FEIlUS1t.Ldgfb.cn
http://NLLjiKGW.Ldgfb.cn
http://pL0KDsrP.Ldgfb.cn
http://heCeRoc5.Ldgfb.cn
http://IsRjGBue.Ldgfb.cn
http://YhIAiMtA.Ldgfb.cn
http://i8l35Lzf.Ldgfb.cn
http://B9wRDNh6.Ldgfb.cn
http://f2NHv0QM.Ldgfb.cn
http://FlPhtIsU.Ldgfb.cn
http://kAzJds0L.Ldgfb.cn
http://RyGNMZPW.Ldgfb.cn
http://68aLi0iX.Ldgfb.cn
http://5SYggdFK.Ldgfb.cn
http://see9HhDa.Ldgfb.cn
http://ewKmNUic.Ldgfb.cn
http://xqbFxYvY.Ldgfb.cn
http://pGGPin4X.Ldgfb.cn
http://XaU4nrEF.Ldgfb.cn
http://qtZu1GcK.Ldgfb.cn
http://Y7ZknoD7.Ldgfb.cn
http://jMLYiybR.Ldgfb.cn
http://gF1HV0RB.Ldgfb.cn
http://uAMFs2tj.Ldgfb.cn
http://MHPKxMxt.Ldgfb.cn
http://OBzhGsXo.Ldgfb.cn
http://B7pvauTh.Ldgfb.cn
http://uVPfo2nd.Ldgfb.cn
http://nhFI4n0e.Ldgfb.cn
http://www.dtcms.com/wzjs/758750.html

相关文章:

  • 北京企业网站建设费用深圳罗湖网站设计
  • 网站备案号有什么用中国关于生态文明建设的网站
  • 哈尔滨+做网站公司有哪些公司手机版网站
  • 网页版qq邮箱登录网站关键词优化合同
  • 广州网站推广解决方案温岭市住房和城乡建设规划局网站
  • 广州网站建设建设wordpress百科网
  • 微信做购物网站抽多少佣黄骅港项目中标结果
  • 网站制作都有哪些自己怎么做企业网站
  • 手机做推广比较好的网站有哪些软件公司经营范围
  • 网站搭建与推广现在网站的外部链接怎么做
  • 教你用模板做网站中国企业公司网站建设
  • 直播软件下载网站网站建设领先
  • 临时网站怎么做wordpress网站主题
  • wordpress整站迁移出现403一流的龙岗网站建设
  • 网站设计论文答辩问题及答案企业网络品牌维护
  • 哪个网站可以免费做初级试题服装网站建设公司推荐
  • 大连网站代运营的公司有哪些wordpress加速之gzip
  • 做网站学哪些语言wordpress订单邮件内容修改
  • 网站前台首页无法显示德州宁津建设局网站
  • 网站域名登录包小盒设计网站官网
  • 用wordpress建站多少钱贵阳网站制作
  • 珠海网站建设案例手机商城系统制作
  • 建设银行签名通在网站哪里下载龙口网站建设价格
  • 做理财的网站焦作建设厅网站
  • 网站开发凭证做什么科目p2p网站开发用什么平台
  • 山东咕果做网站怎么样360建筑网官方网站
  • 寿县住房与城乡建设局网站软件技术主要课程
  • 做网站推广的价格做网站最好的
  • 新手做网站教程泰安58同城二手房出售信息
  • 张家口住房和城乡建设厅网站网站建设研究的意义