#define _CRT_SECURE_NO_WARNINGS
#include <WinSock2.h>
#include<string.h>
#include<stdlib.h>
#include<iostream>
#include<time.h>
#pragma comment(lib, "Ws2_32.lib")
fd_set allSocketSet;
struct fd_es_set ///自定义的socket,事务结构体
{
unsigned short count = 0;//记录该组的连接数。
SOCKET sockall[WSA_MAXIMUM_WAIT_EVENTS];//记录所有socket的数组。
WSAEVENT eventall[WSA_MAXIMUM_WAIT_EVENTS];///记录所有事务的数组。
};
fd_es_set esSet[20];///20组这样的事务Socket
BOOL WINAPI ServerEnd(DWORD dwCtrlType) //当控制台程序直接没掉的时候,会进行退出。
{
switch (dwCtrlType)
{
case CTRL_CLOSE_EVENT:
for (int i = 0; i < 20; i++)
{
for (int j = 0; j < esSet[i].count; j++)
{
WSACloseEvent(esSet[i].eventall[j]);
closesocket(esSet[i].sockall[j]);
}
}
break;
///释放事件句柄
}
return TRUE;
}
int main()
{
WORD wdVersion = MAKEWORD(2, 2);
WSADATA wdSockMeg;
SetConsoleCtrlHandler(ServerEnd, TRUE);///设置钩子发送请求。
int StartWSAStartup = WSAStartup(wdVersion, &wdSockMeg);
if (StartWSAStartup != 0) //打开失败
{
switch (StartWSAStartup)
{
case WSASYSNOTREADY:
std::cout << "重启电脑试试,或者检查网络库" << std::endl;
break;
case WSAVERNOTSUPPORTED:
std::cout << "请更新网络库" << std::endl;
break;
case WSAEINPROGRESS:
std::cout << "请重新启动" << std::endl;
break;
case WSAEPROCLIM:
std::cout << "请关掉一些软件为软件提供资源" << std::endl;
break;
}
}
if (2 != HIBYTE(wdSockMeg.wVersion) || 2 != LOBYTE(wdSockMeg.wVersion))
{
//说明版本不对
//清理网络库
std::cout << "版本号不对" << std::endl;
WSACleanup();
return -1;
}
SOCKET ServerSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (INVALID_SOCKET == ServerSocket) //创建出错
{
int a = WSAGetLastError();///检测错误码
//清理网络库
std::cout << "创建服务器Socket出错" << std::end
C++网络编程事务选择模型,服务端。
最新推荐文章于 2024-04-07 23:40:05 发布
![](https://img-home.csdnimg.cn/images/20240711042549.png)