diff --git a/Server/Debug/Server.log b/Server/Debug/Server.log new file mode 100644 index 0000000..533a010 --- /dev/null +++ b/Server/Debug/Server.log @@ -0,0 +1,5 @@ + Server.cpp +c:\users\geyouheng\source\repos\server\server\server.cpp(1): fatal error C1041: 无法打开程序数据库“C:\Users\GeYouheng\source\repos\Server\Server\Debug\vc141.idb”;如果要将多个 CL.EXE 写入同一个 .PDB 文件,请使用 /FS + main.cpp +c:\users\geyouheng\source\repos\server\server\main.cpp(4): fatal error C1041: 无法打开程序数据库“C:\Users\GeYouheng\source\repos\Server\Server\Debug\vc141.idb”;如果要将多个 CL.EXE 写入同一个 .PDB 文件,请使用 /FS + 正在生成代码... diff --git a/Server/Debug/Server.obj b/Server/Debug/Server.obj new file mode 100644 index 0000000..ea9b989 Binary files /dev/null and b/Server/Debug/Server.obj differ diff --git a/Server/Debug/Server.pch b/Server/Debug/Server.pch new file mode 100644 index 0000000..8cc6325 Binary files /dev/null and b/Server/Debug/Server.pch differ diff --git a/Server/Debug/Server.tlog/CL.command.1.tlog b/Server/Debug/Server.tlog/CL.command.1.tlog new file mode 100644 index 0000000..b7ce159 Binary files /dev/null and b/Server/Debug/Server.tlog/CL.command.1.tlog differ diff --git a/Server/Debug/Server.tlog/CL.read.1.tlog b/Server/Debug/Server.tlog/CL.read.1.tlog new file mode 100644 index 0000000..019a0c4 Binary files /dev/null and b/Server/Debug/Server.tlog/CL.read.1.tlog differ diff --git a/Server/Debug/Server.tlog/CL.write.1.tlog b/Server/Debug/Server.tlog/CL.write.1.tlog new file mode 100644 index 0000000..eadea8a Binary files /dev/null and b/Server/Debug/Server.tlog/CL.write.1.tlog differ diff --git a/Server/Debug/Server.tlog/Server.lastbuildstate b/Server/Debug/Server.tlog/Server.lastbuildstate new file mode 100644 index 0000000..bd9857c --- /dev/null +++ b/Server/Debug/Server.tlog/Server.lastbuildstate @@ -0,0 +1,2 @@ +#TargetFrameworkVersion=v4.0:PlatformToolSet=v141:EnableManagedIncrementalBuild=false:VCToolArchitecture=Native32Bit:WindowsTargetPlatformVersion=10.0.17134.0 +Debug|Win32|C:\Users\GeYouheng\source\repos\Server\| diff --git a/Server/Debug/Server.tlog/link.command.1.tlog b/Server/Debug/Server.tlog/link.command.1.tlog new file mode 100644 index 0000000..ee05e43 Binary files /dev/null and b/Server/Debug/Server.tlog/link.command.1.tlog differ diff --git a/Server/Debug/Server.tlog/link.read.1.tlog b/Server/Debug/Server.tlog/link.read.1.tlog new file mode 100644 index 0000000..b67d596 Binary files /dev/null and b/Server/Debug/Server.tlog/link.read.1.tlog differ diff --git a/Server/Debug/Server.tlog/link.write.1.tlog b/Server/Debug/Server.tlog/link.write.1.tlog new file mode 100644 index 0000000..a98ddc5 Binary files /dev/null and b/Server/Debug/Server.tlog/link.write.1.tlog differ diff --git a/Server/Debug/main.obj b/Server/Debug/main.obj new file mode 100644 index 0000000..099554d Binary files /dev/null and b/Server/Debug/main.obj differ diff --git a/Server/Debug/stdafx.obj b/Server/Debug/stdafx.obj new file mode 100644 index 0000000..fc5ee25 Binary files /dev/null and b/Server/Debug/stdafx.obj differ diff --git a/Server/Debug/vc141.idb b/Server/Debug/vc141.idb new file mode 100644 index 0000000..29de4d6 Binary files /dev/null and b/Server/Debug/vc141.idb differ diff --git a/Server/Debug/vc141.pdb b/Server/Debug/vc141.pdb new file mode 100644 index 0000000..a8d1b80 Binary files /dev/null and b/Server/Debug/vc141.pdb differ diff --git a/Server/Server.cpp b/Server/Server.cpp new file mode 100644 index 0000000..aceb358 --- /dev/null +++ b/Server/Server.cpp @@ -0,0 +1,6 @@ +#include "stdafx.h" +#include "Server.h" + +SOCKET Server::sListen = NULL, Server::sServer = NULL; //׽֣׽ +Client Server::clients[MaxClient] = { 0 }; +int Server::clientNum = 0; \ No newline at end of file diff --git a/Server/Server.h b/Server/Server.h new file mode 100644 index 0000000..810837d --- /dev/null +++ b/Server/Server.h @@ -0,0 +1,165 @@ +#pragma once +#include "msg.h" +#include +#include +#include +#include +#include +#include +#pragma comment(lib, "Ws2_32.lib") + +#define SERVER_PORT 6666 //˿ +#define MaxClient 10 +#define ServerName "Server1" + +struct Client { + char ip[20]; + int port; +}; + +class Server +{ +public: + Server() { + WORD wVersionRequested; + WSADATA wsaData; + wVersionRequested = MAKEWORD(2, 2);//ϣʹõWinSock DLLİ汾 + int ret = WSAStartup(wVersionRequested, &wsaData); + if (ret != 0) { + printf("WSAStartup() failed!\n"); + return; + } + + //ȷWinSock DLLְ֧汾2.2 + if (LOBYTE(wsaData.wVersion) != 2 || HIBYTE(wsaData.wVersion) != 2){ + WSACleanup(); + printf("Invalid Winsock version!\n"); + return; + } + + //socketʹTCPЭ飺 + sListen = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); + if (sListen == INVALID_SOCKET) { + WSACleanup(); + printf("socket() failed!\n"); + return; + } + + //صַϢ + struct sockaddr_in saServer;//ַϢ + saServer.sin_family = AF_INET;//ַ + saServer.sin_port = htons(SERVER_PORT);//עתΪֽ + saServer.sin_addr.S_un.S_addr = htonl(INADDR_ANY);//ʹINADDR_ANYָʾַ + + //󶨣 + ret = bind(sListen, (struct sockaddr *)&saServer, sizeof(saServer)); + if (ret == SOCKET_ERROR) { + printf("bind() failed! code:%d\n", WSAGetLastError()); + closesocket(sListen);//ر׽ + WSACleanup(); + return; + } + + // + ret = listen(sListen, 5); + if (ret == SOCKET_ERROR) { + printf("listen() failed! code:%d\n", WSAGetLastError()); + closesocket(sListen);//ر׽ + WSACleanup(); + return; + } + } + + ~Server() { + for (int i = 0; i < clientNum; i++) { + threads[i].join(); + } + closesocket(sListen);//ر׽ + closesocket(sServer); + WSACleanup(); + } + + void run() { + while (true) { + //printf("Waiting for client connecting!\n"); + //ȴܿͻӣ + struct sockaddr_in saClient; + int length = sizeof(saClient); + sServer = accept(sListen, (struct sockaddr *)&saClient, &length); + if (sServer == INVALID_SOCKET){ + printf("accept() failed! code:%d\n", WSAGetLastError()); + continue; + } + if (clientNum == MaxClient) { + printf("̳߳شﵽ"); + } + else { + Client client; + strcpy(client.ip, inet_ntoa(saClient.sin_addr)); + client.port = ntohs(saClient.sin_port); + clients[clientNum] = client; + threads[clientNum] = std::thread(trans, sServer, saClient, clientNum); + clientNum++; + printf("Accepted client: %s:%d\n", inet_ntoa(saClient.sin_addr), ntohs(saClient.sin_port)); + } + } + } + + static void trans(SOCKET arg, SOCKADDR_IN client_addr, int pos){ + request req; + int sen, ret; + while (true) { + ret = recv(sServer, (char*)&req, sizeof(request), 0); + if (ret == SOCKET_ERROR) { + printf("recv() failed! code:%d\n", WSAGetLastError()); + continue; + } + respond res; + switch (req.type) + { + TIME: + res.type = TIME; + time_t t; + time(&t); + strcpy(res.data, ctime(&t)); + sen = send(sServer, (char*)&res, sizeof(res), 0); + if (sen == SOCKET_ERROR) + printf("send() failed! code:%d\n", WSAGetLastError()); + break; + NAME: + res.type = TIME; + strcpy(res.data, ServerName); + sen = send(sServer, (char*)&res, sizeof(res), 0); + if (sen == SOCKET_ERROR) + printf("send() failed! code:%d\n", WSAGetLastError()); + break; + LIST: + res.type = LIST; + char list[300]; + for (int i = 0; i < clientNum; i++) { + char clinfo[30] = { 0 }; + sprintf(clinfo, "%d/t%s/t%d", i, clients[i].ip, clients[i].port); + strcpy(list + 30 * i, clinfo); + } + strcpy(res.data, list); + sen = send(sServer, (char*)&res, sizeof(res), 0); + if (sen == SOCKET_ERROR) + printf("send() failed! code:%d\n", WSAGetLastError()); + break; + SEND: + instruct ins; + + + default: + break; + } + } + } + +private: + static SOCKET sListen, sServer; //׽֣׽ + std::thread threads[MaxClient]; + static Client clients[MaxClient]; + static int clientNum; +}; + diff --git a/Server/Server.vcxproj b/Server/Server.vcxproj new file mode 100644 index 0000000..61a22a1 --- /dev/null +++ b/Server/Server.vcxproj @@ -0,0 +1,168 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + Debug + x64 + + + Release + x64 + + + + 15.0 + {F7E148AC-0720-452C-BA19-C25F4B894DCF} + Win32Proj + Server + 10.0.17134.0 + + + + Application + true + v141 + Unicode + + + Application + false + v141 + true + Unicode + + + Application + true + v141 + Unicode + + + Application + false + v141 + true + Unicode + + + + + + + + + + + + + + + + + + + + + true + + + true + + + false + + + false + + + + Use + Level3 + Disabled + false + WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + + + Console + true + + + + + Use + Level3 + Disabled + true + _DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + + + Console + true + + + + + Use + Level3 + MaxSpeed + true + true + true + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + + + Console + true + true + true + + + + + Use + Level3 + MaxSpeed + true + true + true + NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + + + Console + true + true + true + + + + + + + + + + + + + Create + Create + Create + Create + + + + + + \ No newline at end of file diff --git a/Server/Server.vcxproj.filters b/Server/Server.vcxproj.filters new file mode 100644 index 0000000..964af85 --- /dev/null +++ b/Server/Server.vcxproj.filters @@ -0,0 +1,42 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hh;hpp;hxx;hm;inl;inc;ipp;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + + + 头文件 + + + 头文件 + + + 头文件 + + + 头文件 + + + + + 源文件 + + + 源文件 + + + 源文件 + + + \ No newline at end of file diff --git a/Server/Server.vcxproj.user b/Server/Server.vcxproj.user new file mode 100644 index 0000000..6e2aec7 --- /dev/null +++ b/Server/Server.vcxproj.user @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/Server/main.cpp b/Server/main.cpp new file mode 100644 index 0000000..6580b85 Binary files /dev/null and b/Server/main.cpp differ diff --git a/Server/msg.h b/Server/msg.h new file mode 100644 index 0000000..498432a --- /dev/null +++ b/Server/msg.h @@ -0,0 +1,21 @@ +#pragma once + +enum mType { TIME,NAME,LIST,SEND,ERR }; + +struct request { + mType type; + int number; + char content[100]; +}; + +struct respond { + mType type; + char data[300]; +}; + +struct instruct { + mType type; + char content[100]; + int number; + char ip[20], port[20]; +}; \ No newline at end of file diff --git a/Server/stdafx.cpp b/Server/stdafx.cpp new file mode 100644 index 0000000..b43440e Binary files /dev/null and b/Server/stdafx.cpp differ diff --git a/Server/stdafx.h b/Server/stdafx.h new file mode 100644 index 0000000..a9b830a Binary files /dev/null and b/Server/stdafx.h differ diff --git a/Server/targetver.h b/Server/targetver.h new file mode 100644 index 0000000..e2da66c Binary files /dev/null and b/Server/targetver.h differ