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

上海建站 seopc网站

上海建站 seo,pc网站,网站做一半能退吗,设计公司网站建设#include main.hVOID Server_write_error() {}/*1.打开网络库 * 2.校验网络库版本 * 3.创建SOCKET * 4.绑定IP地址和端口 * 5.开始监听 * 6.创建客户端socket/接受链接 * 7.与客户端收发消息 * 8.(6.7)两步的函数accept#xff0c;send,recv 有堵塞#xff0c;可…#include main.hVOID Server_write_error() {}/*1.打开网络库 * 2.校验网络库版本 * 3.创建SOCKET * 4.绑定IP地址和端口 * 5.开始监听 * 6.创建客户端socket/接受链接 * 7.与客户端收发消息 * 8.(6.7)两步的函数acceptsend,recv 有堵塞可以用select解决这种函数可以处理小型网络 */ int create(const char* IpAdress) {WORD wVersionRequested;WSADATA wsaData;int err;/* 使用Windef.h中声明的MAKEWORD低字节、高字节宏 */wVersionRequested MAKEWORD(2, 2);/*启用网络链接库调用的封装库命令*/err WSAStartup(wVersionRequested, wsaData);if (err ! 0) {/* Tell the user that we could not find a usable *//* Winsock DLL. */printf(WSAStartup failed with error: %d\n, err);return -1;}/*确认WinSock DLL支持2.2*/if (LOBYTE(wsaData.wVersion) ! 2 || HIBYTE(wsaData.wVersion) ! 2) {/* Tell the user that we could not find a usable *//* WinSock DLL. */printf(Could not find a usable version of Winsock.dll\n);//清理网络库WSACleanup();return -1;}//创建套接字。 创建网络类型 tcp或者updSOCKET socketServer socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);if (INVALID_SOCKET socketServer){string ret to_string(WSAGetLastError());MessageBoxA(0, error_socket,ret.c_str(), 0);//清理网络库WSACleanup();return -1;}//设置sockaddr结构sockaddr_in saServer;saServer.sin_family AF_INET;saServer.sin_addr.s_addr INADDR_ANY;saServer.sin_port htons(9999);// 绑定本机服务器IP和端口//sockaddr结构中的信息if (SOCKET_ERROR bind(socketServer, (SOCKADDR*)saServer, sizeof(saServer))){string ret to_string(WSAGetLastError());MessageBoxA(0, error_bind, ret.c_str(), 0);//释放stocketclosesocket(socketServer);//清理网络库WSACleanup();return -1;}/*监听本机(服务器)的套接字*/if (SOCKET_ERROR listen(socketServer, SOMAXCONN)){string ret to_string(WSAGetLastError());MessageBoxA(0, error_listen, ret.c_str(), 0);//释放stocketclosesocket(socketServer);//清理网络库WSACleanup();return -1;}fd_es_set setSockets;memset(setSockets,0,sizeof(setSockets));/*创建一个套接字 事件*/HANDLE eventSerevr WSACreateEvent();if (WSA_INVALID_EVENT eventSerevr){string ret to_string(WSAGetLastError());MessageBoxA(0, error_WSACreateEventServer, ret.c_str(), 0);//释放stocketclosesocket(socketServer);//清理网络库WSACleanup();return -1;}/*将服务器socket和事件绑定*/if (SOCKET_ERROR WSAEventSelect(socketServer, eventSerevr, FD_ACCEPT)){string ret to_string(WSAGetLastError());MessageBoxA(0, error_WSAEventSelecttServer, ret.c_str(), 0);//释放stocketclosesocket(socketServer);//清理网络库WSACleanup();return -1;}/*将服务器socket和事件对象句柄写进结构体*/setSockets.sockall[setSockets.count] socketServer;setSockets.eventall[setSockets.count] eventSerevr;setSockets.count;while (true){ /*为了防止一个用户死循环访问服务器造成事件一直处理同一个客户端进行优化循环遍历单个数组询问是否有事件信号*//*同时WSAWaitForMultipleEvents函数参数一每次只能处理64个事件数组而我们改成每次处理1个循环处理变相能处理无穷多的事件了*/DWORD RET 0;for (DWORD Index 0; Index setSockets.count; Index){/*等待事件有事件产生后返回对应事件的下标*/RET WSAWaitForMultipleEvents(1, setSockets.eventall[Index], false, 0, false);/*返回错误*/if (WSA_WAIT_FAILED RET){string ret to_string(WSAGetLastError());MessageBoxA(0, error_WSAWaitForMultipleEvents, ret.c_str(), 0);continue;}/*等待超时检测*/if (WSA_WAIT_TIMEOUT RET){continue;}// DWORD Index RET - WSA_WAIT_EVENT_0;/*枚举事件获取事件类型并重置其的信号*/WSANETWORKEVENTS GetlpNetworkEvents;if (SOCKET_ERROR WSAEnumNetworkEvents(setSockets.sockall[Index], setSockets.eventall[Index], GetlpNetworkEvents)){string ret to_string(WSAGetLastError());MessageBoxA(0, error_WSAEnumNetworkEvents, ret.c_str(), 0);continue;}/******** FD_ACCEPT 可能是组合指令故需要 判断*//*客户端connect会依次触发FD_ACCEPT 和 FD_WRITE*/if (GetlpNetworkEvents.lNetworkEvents FD_ACCEPT){if (0 GetlpNetworkEvents.iErrorCode[FD_ACCEPT_BIT]){//正常处理sockaddr_in clientMsg { 0 };int clientMsg_size sizeof(clientMsg);/*得到客户端信息并返回客户端socket*/SOCKET socketClient accept(setSockets.sockall[Index], (sockaddr*)clientMsg, clientMsg_size);printf(%d.%d.%d.%d.%d \n, clientMsg.sin_addr.S_un.S_un_b.s_b1,clientMsg.sin_addr.S_un.S_un_b.s_b2,clientMsg.sin_addr.S_un.S_un_b.s_b3,clientMsg.sin_addr.S_un.S_un_b.s_b4,clientMsg.sin_port);if (INVALID_SOCKET socketClient)continue;/*创建一个套接字 事件*/HANDLE eventClient WSACreateEvent();if (WSA_INVALID_EVENT eventClient){//释放stocketclosesocket(socketClient);continue;}/*将客户端socket和事件绑定*/if (SOCKET_ERROR WSAEventSelect(socketClient, eventClient, FD_READ | FD_WRITE | FD_CLOSE)){//释放stocketclosesocket(socketClient);//关闭事件对象WSACloseEvent(eventClient);continue;}/*完成上面步骤后将这个客户端数据放入结构体*/setSockets.sockall[setSockets.count] socketClient;setSockets.eventall[setSockets.count] eventClient;setSockets.count;}else{continue;}}/*********FD_WRITE 可能是组合指令故需要 判断*//*客户端connect会依次触发FD_ACCEPT 和 FD_WRITE*/if (GetlpNetworkEvents.lNetworkEvents FD_WRITE){if (0 GetlpNetworkEvents.iErrorCode[FD_WRITE_BIT]){//正常处理//accept会触发一次一般用于链接服务器后初始化char sendmsg[] connect_success;if (SOCKET_ERROR send(setSockets.sockall[Index], sendmsg, strlen(sendmsg), 0)){continue;}}else{continue;}}/*********FD_READ 可能是组合指令故需要 判断*/if (GetlpNetworkEvents.lNetworkEvents FD_READ){if (0 GetlpNetworkEvents.iErrorCode[FD_READ_BIT]){//正常处理char recvmsg[1024] { 0 };if (SOCKET_ERROR recv(setSockets.sockall[Index], recvmsg, sizeof(recvmsg), 0)){continue;}printf(read%s\n, recvmsg);char sendmsg[] recv_success;if (SOCKET_ERROR send(setSockets.sockall[Index], sendmsg, strlen(sendmsg), 0)){continue;}}else{continue;}}/*********FD_CLOSE 可能是组合指令故需要 判断*/if (GetlpNetworkEvents.lNetworkEvents FD_CLOSE){{//正常处理//sockaddr_in clientMsg { 0 };//int clientMsg_size sizeof(clientMsg);//getsockname(setSockets.sockall[Index], (sockaddr*)clientMsg, clientMsg_size);//printf(client下线%d.%d.%d.%d.%d \n, clientMsg.sin_addr.S_un.S_un_b.s_b1,// clientMsg.sin_addr.S_un.S_un_b.s_b2,// clientMsg.sin_addr.S_un.S_un_b.s_b3,// clientMsg.sin_addr.S_un.S_un_b.s_b4,// clientMsg.sin_port);printf(client下线);//释放stocketclosesocket(setSockets.sockall[Index]);//关闭事件对象WSACloseEvent(setSockets.eventall[Index]);/*将这个事件和socket移除数组取巧方法由于事件是无序的把数组最后一个数据放进移除的数据的位置并将数组大小-1*/setSockets.sockall[Index] setSockets.sockall[setSockets.count - 1];//数组从0开始,-1才是正确位置setSockets.eventall[Index] setSockets.eventall[setSockets.count - 1];//数组从0开始,-1才是正确位置setSockets.count--;}}} }system(pause);/*释放整个结构体可能有些事件和socket已经被释放过了不影响*/for (int i 0; i setSockets.count; i){//释放stocketclosesocket(setSockets.sockall[i]);//关闭事件对象WSACloseEvent(setSockets.eventall[i]);}//清理网络库WSACleanup(); }int main() {// create(127.0.0.1);return 0; } 利用windows的网络事件函数系统将自动用异步的方式帮我们查看socket消息接收到消息后我们将无序的查看接收到的消息比如我们有事件[5]先后接收到45321送来的消息事件只能接收到12345发来了消息并不能知道先后顺序故只能按12345的顺序处理消息而消息机制本质和事件差不多区别就是消息机制由系统的消息队列记录先后顺序会按45321的顺序处理处理更合理
http://www.dnsts.com.cn/news/56472.html

相关文章:

  • 生活服务网站建设方案镇海seo专业优化平台
  • 乐清企业网站制作网站建设gzzctyi
  • 网站整体建设方案设计用mcu做灯光效果网站
  • 网站建设制作 优帮云网页打不开怎么解决方法
  • 网站建设lnmpwordpress首页怎么进入
  • 网站集约化建设会议议程网站模板 html5
  • 课题网站建设验收总结报告深圳宝安专业做网站公司
  • 宣传片制作要求说明seo案例分析方案
  • 临沂做网站优化上海企业网站建设公
  • asp.net网站网站建设主要流程图
  • 做分享网站山东优质校建设专题网站
  • 教育行业手机wap网站站长工具seo优化系统
  • wordpress培训类网站模板河南招标信息网
  • 怎样做淘宝商品链接导航网站wordpress需要vps多大内存
  • 自己做的网站怎么搜不到wordpress怎么添加语言包
  • 网站后台管理生成器有没有免费的小程序制作
  • wordpress成长记录网站模版盐山国外网站建设
  • 网站建设简介广州网站制作开发公司哪家好
  • 做网站的课题背景介绍wordpress侧边栏广告代码
  • 元做网站网站做404页面怎么做
  • 开发网站监控工具怎么做一个局域网站
  • 全免费建立自己的网站php网站培训
  • 泰安网站的建设连云港专业网站制作公司
  • 5个免费安全的资源网站重庆企业公司网站建设
  • 网页网站的制作过程创建一个网站需要多少钱
  • 网站的优化排名怎么做创建网站需要注意什么
  • wordpress二级栏济南网络优化推广
  • wordpress分页目录编辑seo外推上排名
  • php网站开发面试微信公众号做的网站
  • 广州网站建设的地方推荐人才招聘网站模板