📄 server.cpp
字号:
//**********头文件************************************************
#include "..\include\functions.h"
//**********全局变量**********************************************
bool ServerDown=false;
//**********线程函数**********************************************
void Thread_ServeAClient(LPVOID lpv);
void Thread_TCP_Server(LPVOID lpv);
void Thread_UDP_Server(LPVOID lpv);
//****************************************************************
int main(int argc, char* argv[])
{
u_short port;
port = (argc >= 2) ? atoi(argv[1]) : 54103;
system("cls");
WSADATA wsaData;
if(WSAStartup(MAKEWORD(2,1),&wsaData)!=0){
PrintTime(); printf("WSAStartup failed!\n"); return -1;}
char* HOSTIP=GetHostIP(); //本机IP地址
if (HOSTIP==NULL){
PrintTime();printf("Can't get host address!\n");}
//********************开启TCP服务************************
SOCKET TCP_Sock_listen;
if(InitSocket(TCP_Sock_listen,HOSTIP,port,SOCK_STREAM)==SOCKET_ERROR) return -1;
if(listen(TCP_Sock_listen, SOMAXCONN)== INVALID_SOCKET) {
PrintTime();printf("listen failed\n");return -1;}
DWORD Thread_TCP_ID;
HANDLE tcp_handle=CreateThread(NULL, 1000,(LPTHREAD_START_ROUTINE)Thread_TCP_Server,(LPVOID)TCP_Sock_listen, 0, &Thread_TCP_ID);
if (tcp_handle==NULL)
{
printf("****************************************************************\n");
PrintTime();printf("Start TCP Server %s:%d failed\n",HOSTIP,port);
printf("****************************************************************\n");
return -1;
}
else
{
printf("****************************************************************\n");
PrintTime();printf("Start Server %s:%d\n",HOSTIP,port);
printf("\t\tPress ESC to stop the server!\n");
printf("****************************************************************\n");
}
//********************开启UDP服务**********************
SOCKET UDP_Sock;
if(InitSocket(UDP_Sock,HOSTIP,UDP_PORT,SOCK_DGRAM)!=SOCKET_ERROR)
{
DWORD Thread_UDP_ID;
HANDLE udp_handle=CreateThread(NULL, 1000,(LPTHREAD_START_ROUTINE)Thread_UDP_Server,(LPVOID)UDP_Sock, 0, &Thread_UDP_ID);
if (tcp_handle==NULL)
{
printf("****************************************************************\n");
PrintTime();printf("Start UDP Server %s:%d failed\n",HOSTIP,port);
printf("****************************************************************\n");
return -1;
}
while(_getch()!=27); //用户按ESC键则退出
ServerDown=true;
}
closesocket(TCP_Sock_listen);
closesocket(UDP_Sock);
printf("\n****************************************************************\n");
PrintTime();printf("Server %s:%d Stop!\n",HOSTIP,port);
printf("****************************************************************\n");
WSACleanup();
return 0;
}
//*******************************************************************
//***函数声明: void Thread_TCP_Server(LPVOID lpv)
//***函数说明: TCP服务器线程函数。当一个客户端建立TCP连接后,新建
//*** 一个线程为客户端服务
//***参数说明: LPVOID lpv,TCP服务器监听的套接字
//*******************************************************************
void Thread_TCP_Server(LPVOID lpv)
{
SOCKET sock_listen=(SOCKET)lpv;
SOCKET sock_accept;
sockaddr_in client_addr;
int nSize=sizeof(sockaddr_in);
DWORD ThreadID;
while (!ServerDown)
{
sock_accept = accept(sock_listen, (struct sockaddr *)&client_addr, &nSize);
if (sock_accept == INVALID_SOCKET) continue;
THREAD_PARAMETER* lpv=new THREAD_PARAMETER;
lpv->sock_accept=sock_accept;
lpv->ip=inet_ntoa(client_addr.sin_addr);
PrintTime();
printf("Connection from TCP client %s:%d accepted\n",inet_ntoa(client_addr.sin_addr),client_addr.sin_port);
HANDLE handle= CreateThread(NULL, 1000,(LPTHREAD_START_ROUTINE)Thread_ServeAClient,(LPVOID)lpv, 0, &ThreadID);
}
closesocket(sock_accept);
return ;
}
//*******************************************************************
//***函数声明: void Thread_UDP_Server(LPVOID lpv)
//***函数说明: UDP服务器线程函数。用于为多个UDP客户端服务,完成
//*** 回显功能
//***参数说明: LPVOID lpv,UDP服务器的套接字
//*******************************************************************
void Thread_UDP_Server(LPVOID lpv)
{
SOCKET udp_sock=(SOCKET)lpv;
sockaddr_in client_addr;
int nSize=sizeof(sockaddr_in);
char msg[MAX_MSG_SIZE];
memset(msg, 0, MAX_MSG_SIZE);
while (!ServerDown)
{
int len=recvfrom(udp_sock,msg,MAX_MSG_SIZE,0,(struct sockaddr *)&client_addr, &nSize);
if (len==SOCKET_ERROR) continue;
PrintTime();printf("\"%s\" received from %s:%d by UDP\n",msg,inet_ntoa(client_addr.sin_addr),ntohs(client_addr.sin_port));
sendto(udp_sock,msg,strlen(msg)+1,0,(struct sockaddr *)&client_addr,nSize);
PrintTime();printf("Send \"%s\" to %s:%d by UDP\n",msg,inet_ntoa(client_addr.sin_addr),ntohs(client_addr.sin_port));
PrintTime();printf("Finished service, close connection of %s\n",inet_ntoa(client_addr.sin_addr));
}
closesocket(udp_sock);
return ;
}
//*******************************************************************
//***函数声明: void Thread_ServeAClient(LPVOID lpv)
//***函数说明: 为一个客户端提供面向连接的服务。包括发送UDP服务器
//*** 端口号,以及发送服务器时间。
//***参数说明: LPVOID lpv,结构体THREAD_PARAMETER的一个变量
//*** struct THREAD_PARAMETER
//*** {
//*** SOCKET sock_accept; //服务器套接字
//*** char* ip; //服务器IP地址
//*** };
//*******************************************************************
void Thread_ServeAClient(LPVOID lpv)
{
THREAD_PARAMETER tp=*(THREAD_PARAMETER*)lpv;
SOCKET sock_accept = tp.sock_accept;
char* client_ip=tp.ip;
char msg[MAX_MSG_SIZE];
memset(msg, 0, MAX_MSG_SIZE);
if(recv(sock_accept,msg, MAX_MSG_SIZE,0)==SOCKET_ERROR) return;
if(WSAGetLastError()==WSAECONNRESET){
PrintTime();printf("Client %s has closed connection!\n");return;}
if (!strcmp(msg,"GET UDP PORT"))
{
PrintTime();printf("Request for UDP Port from %s by TCP\n",client_ip);
PrintTime();printf("Send UDP Port %d to client %s by TCP\n",UDP_PORT,client_ip);
char str_port[6];
sprintf(str_port,"%d",UDP_PORT);
if(send(sock_accept,str_port,strlen(str_port)+1,0)==SOCKET_ERROR ){
PrintTime();printf("Send to %s failed!\n",client_ip);return;}
}
memset(msg, 0, MAX_MSG_SIZE);
if(recv(sock_accept,msg, MAX_MSG_SIZE,0)==SOCKET_ERROR) return;
if(WSAGetLastError()==WSAECONNRESET){
PrintTime();printf("Client %s has closed connection!\n");return;}
if (!strcmp(msg,"GET CUR TIME"))
{
PrintTime();printf("Request for Current time from %s by TCP\n",client_ip);
char t_str[9];
_strtime(t_str);
PrintTime();printf("Send Current time %s to client %s by TCP\n",t_str,client_ip);
if(send(sock_accept,t_str,9,0)==SOCKET_ERROR ){
PrintTime();printf("Send to %s failed!\n",client_ip);return;}
PrintTime();printf("Finished service, close connection of %s\n",client_ip);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -