⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 server.cpp

📁 基于C/S结构的Socket程序设计 即通信双方一方作为服务器等待客户提出请求并予以响应。客户则在需要服务时向服务器提出申请。服务器一般作为守护进程始终运行
💻 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 + -