#include <QCoreApplication>
#include <winsock2.h>
#include <windows.h> //winsock.h
#include <iostream>
#include <QDebug>
using namespace std;
#define MAX_PAGE 4096
#define MAX_NUM 64
int m_nSocketNum=0;
SOCKET m_SocketEwaiter[MAX_NUM]; //作用:能够保证多个客户端有序与server交互,并且保证客户端不会丢。如果没有这个数组,那么server只处理最新的客户端。
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
//1.选择种类 火锅 韩餐 烤肉--
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD(2, 2);
err = WSAStartup(wVersionRequested, &wsaData);
if (err != 0) {
printf("WSAStartup failed with error: %d\n", err);
return 1;
}
if (LOBYTE(wsaData.wVersion) != 2 ||
HIBYTE(wsaData.wVersion) != 2)
{
printf("Could not find a usable version of Winsock.dll\n");
WSACleanup();
return 1;
}
else
printf("The Winsock 2.2 dll was found okay\n");
//2.雇个店长--
SOCKET sock = socket(AF_INET,SOCK_STREAM,0);
if(sock == INVALID_SOCKET)
{
WSACleanup();
return 1;
}
//将套接字的属性改为非阻塞
u_long uval = 1;
ioctlsocket(sock,FIONBIO,&uval);
//3.找个地方
sockaddr_in addrserver;
addrserver.sin_family = AF_INET;
addrserver.sin_port = htons(8899);
addrserver.sin_addr.S_un.S_addr = 0;
if(SOCKET_ERROR == bind(sock,( const sockaddr *)&addrserver,sizeof(addrserver)))
{
// int n = GetLastError();
closesocket(sock);
WSACleanup();
return 1;
}
//4.店长宣传
if( SOCKET_ERROR == listen(sock,10))
{
closesocket(sock);
WSACleanup();
return 1;
}
//5.拉着客人进店 ,将客人交给服务员
//同步阻塞+多线程模型:实现与多个客户端通信 浪费资源
//如何实现单线程与多个客户端进行通信:非阻塞模型 效率低
int nRecvNum;
char szbuf[1024] = {0};
while(1)
{
//阻塞 接收客户端连接,并且加入数组中记录下来
SOCKET sockWaiter = accept(sock,0,0);
if (sockWaiter!=INVALID_SOCKET){
m_SocketEwaiter[m_nSocketNum] = sockWaiter;
m_nSocketNum++;
}
//接收每个客户端发来的数据
for(int i = 0;i<m_nSocketNum;i++){
nRecvNum = recv(m_SocketEwaiter[i],szbuf,sizeof(szbuf),0);
if(nRecvNum > 0)
{
cout<<szbuf<<endl;
}
}
}
//6.服务员等待客人说话 --
/* s < r NORMAL
S > R 分次接*/
//8.下班--
//closesocket(sockWaiter);
closesocket(sock);
//9.关店--
WSACleanup();
return a.exec();
}
TCP-非阻塞模型
于 2022-04-04 20:26:48 首次发布