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

📄 sever.cpp

📁 类似QQ的通信的简单服务器和客户端程序
💻 CPP
字号:
// Sever.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include "Sever.h"
#include <winsock.h>
#include "mytype.h"
#include "Userlist.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
#define MAX_PENDING_CONNECTS 10
#define PORTNUM         5000          // Port number
/////////////////////////////////////////////////////////////////////////////
// The one and only application object
// Local socket address

CWinApp theApp;
//	char ServerIP[20];
//	cout<<"Please input server ip:";
//	cin>>ServerIP;


UINT t_LNKRecv(LPVOID pParam);
void sendMsgToSock(const SOCKET ClientSock, const char* sMsg);
int GetUserBySocket(const SOCKET ClientSock);
int sendMsgToUser(const char* sUser, const char* sMsg);
int getUserByName(const char* sUser);
int dismessage(const char* recvmsg);
int SplitMsg(char * Msg,Struct_SplitMsg * splitResult);
using namespace std;

Userlist Userlist1;

int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
	if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0)) return 1;
	int index = 0;							// Integer index
									// Return value of recv function
   	//char szServerA[100];   
	TCHAR	szError[100];					// Error message string
	SOCKET	WinSocket = INVALID_SOCKET,		// Window socket
			ClientSock = INVALID_SOCKET;	// Socket for communicating 
											// between the server and client
	SOCKADDR_IN local_sin,					// Local socket address
				accept_sin;					// Receives the address of the 
											// connecting entity
	int accept_sin_len;						// Length of accept_sin
    
	WSADATA WSAData;						// Contains details of the Winsock
											// implementation
	// Initialize Winsock.
	if (WSAStartup (MAKEWORD(1,1), &WSAData) != 0) 
	{
		wsprintf (szError, TEXT("WSAStartup failed. Error: %d"), 
					WSAGetLastError ());
		printf("Have Error to Initialize Winsock.\n");
		return FALSE;
	}
	else 
		printf("Success to Initialize Winsock.\n");

	// Create a TCP/IP socket, WinSocket.
	if ((WinSocket = socket (AF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET) 
	{
		printf("Have Error to Creat a TCP/IP socket.\n");
		return FALSE;
	}
	else
	{
		printf("Success to Creat a TCP/IP socket.\n");
	}      
	// Fill out the local socket's address information.
	local_sin.sin_family = AF_INET;
	local_sin.sin_port = htons (PORTNUM);  
	local_sin.sin_addr.s_addr = htonl (INADDR_ANY);

	// Associate the local address with WinSocket.
	if (bind (WinSocket, 
				(struct sockaddr *) &local_sin, 
				sizeof (local_sin)) == SOCKET_ERROR) 
	{
		printf("Have Error to bind WinSlcket.\n");
		closesocket (WinSocket);
		return FALSE;
	}
	else
		printf("Success to bind Winsocket.\n");

	// Establish a socket to listen for incoming connections.
	if (listen (WinSocket, MAX_PENDING_CONNECTS) == SOCKET_ERROR) 
	{
		printf("Have Error to listen to the Winsocket.\n");
		closesocket (WinSocket);
		return FALSE;
	}
	else 
	{
		printf("Success to listen to the Winsocket.\n");
	} 
	
		CWinThread* ClientRecv;
		struct socket_info sockinfo;
		for(;;)
		{
			accept_sin_len = sizeof(accept_sin);
			// Accept an incoming connection attempt on WinSocket.
			ClientSock = accept (WinSocket, 
							(struct sockaddr *) &accept_sin, 
							(int *) &accept_sin_len);

			memcpy(&sockinfo.addr, &accept_sin, sizeof(accept_sin));
			sockinfo.socket = ClientSock;
			
			// Stop listening for connections from clients.
			if (ClientSock == INVALID_SOCKET) 
			{
				printf("Error to accept connection with client.\n");
				return FALSE;
			}
			else
			{  
				printf("Success to acccept connection with client. IP Addr:%s\n", inet_ntoa(accept_sin.sin_addr));
				ClientRecv	= AfxBeginThread(t_LNKRecv		,(LPVOID)&sockinfo,THREAD_PRIORITY_NORMAL,CREATE_SUSPENDED ,0, NULL );
			}
				
		}
	

		shutdown (ClientSock, 0x02);

	// Close ClientSock.
	closesocket (WinSocket);
	WSACleanup ();
	return TRUE;
}


int SplitMsg(char * Msg,Struct_SplitMsg * splitResult)//将收到的字符串拆分为两个字符串
{
	int i;
	int k;
	for(i=0;i<strlen(Msg);i++)                       //处理开头有空格的字符串
	{
		if(Msg[i]!=32)
		{
			break;
		}
	}
		
	k=0;
	for(i;i<strlen(Msg);i++)
	{
		if(Msg[i] != 32)
		{
			splitResult->fst[k++]=Msg[i];
		}
		else
		{
			break;
		}
	}
	splitResult->fst[k]='\0';
	if(strlen(splitResult->fst)==strlen(Msg))
	{	
		printf("error");
	}
	     
	k=0;
	for(;i<strlen(Msg);i++)
	{
		if(Msg[i]!=32)
		{
			break;
		}
	}
	for(;i<strlen(Msg);i++)
	{
		if(Msg[i]!=0)
		{
			splitResult->snd[k++]=Msg[i];
		}
		else
		{
			break;
		}
	}
	splitResult->snd[k]='\0';
		return 0;
}

/*t sendMsgToUser(const char* sUser, const char* sMsg)
{
	int t = -1;
	t = Userlist1.getUserSocketByName(sUser);
	if (t != -1)
	{
		if(send(t, sMsg, strlen (sMsg) + 1, 0)== SOCKET_ERROR) 
		{
			printf("\nHave error to send message to client.\n");
		}
		else
		{
			printf("\nSuccess to transfer message to client.\n");
		}
	}
	return 0;
}*/

/*int GetUserBySocket(const SOCKET ClientSock)
{
	int t = -1,i;
	for(i=0;i<10;i++)
	{
		if(s[i].socket==ClientSock)
		{
			 t = i;
			 break;
		}
		else if(i > 10)
		{
			printf("the user is disconnect");
			break;
		}
	}
	return t;
}*/
int sendMsgToUser(const char *sUser, const char *sMsg)
{
	int t = -1;
	t = Userlist1.getUserSocketByName(sUser);
	if (t != -1)
	{
		if(send(t, sMsg, strlen (sMsg) + 1, 0)== SOCKET_ERROR) 
		{
			printf("\nHave error to send message to client.\n");
		}
		else
		{
			printf("\nSuccess to transfer message to client.\n");
		}
	}
	return 0;
}

/*void sendMsgToSock(const SOCKET ClientSock, const char* sMsg)
{
	int t = -1;
	t =Userlist::GetUserBySocket(ClientSock);
	if (t == -1)
		return;

	if(send(s[t].socket,sMsg, strlen(sMsg), 0)== SOCKET_ERROR) 
	{
		printf("\nHave error to send message to client.\n");
	}
	else
	{
		printf("\nSuccess to send message to client.\n");
	}
}*/
UINT t_LNKRecv(LPVOID pParam)
{
	int	 iReturn;
	
	
	struct socket_info * sockinfo = (struct socket_info*)pParam;
	SOCKET	ClientSock=sockinfo->socket;
	char szServerA[100]; 
	Struct_SplitMsg splited;// ASCII string
	char ss[5000]="",*p;
	p=ss;
//	char *str =inet_ntoa(sockinfo->addr.sin_addr);
//    strcpy(s[m].name,sUser);
			
	
/*	char ss[1024]="";
	int j;
	struct user u;
	for (int i = 0; i < 10; i++)
	{
		if (s[i].used)
		{
			sprintf(ss, "user name:%s;user IP: %s; user socket%d;", s[i].name, s[i].IP,s[i].socket);
			//printf("user name:%s;user IP: %s; user socket%d;", s[i].name, s[i].IP,s[i].socket);
			ss[strlen(ss)] = '\0' ;
			for (int j = 0; j < 10; j++)
			{
				if (s[j].used)
					sendMsgToSock(s[j].socket, ss);
			}
		}
	}*/
	while (TRUE)
		// Receive data from the client.
	{	
		iReturn = recv (ClientSock, szServerA, sizeof (szServerA), 0);
		// Check if there is any data received. If there is, display it.
   		if (iReturn == SOCKET_ERROR)
		{
			printf("\n Error : Because of some reason the connect is failed.\n");
			break;
		}
		else  if(iReturn == 0)
		{
			printf("\nThe Client Has Disconnected");
			break;
		}
		else 
		{
			_struct_user u;
			printf("\nReceived From Client:\n%s",szServerA);
			SplitMsg(szServerA,&splited);
			printf("\nResult:\nfst=%s\nsnd=%s\n",splited.fst ,splited.snd);
	
			if(strcmp("login",splited.fst)==0)     //用户登录,登记用户信息
			{   
				strcpy(u.name,splited.snd);
				strcpy(u.IP,inet_ntoa(sockinfo->addr.sin_addr));
				u.socket=ClientSock;
			//	sprintf(u.name, "%d", m);
				Userlist1.Add(u);
			}
			else 
			{
				if(strcmp("logout",splited.fst)==0)
				{
					Userlist1.Remove(splited.snd);
					/*p=Userlist1.getUserinformation();
					if(send(ClientSock, p,strlen (p) + 1, 0)==SOCKET_ERROR)
					{
						printf("Error to send information to User");
					}
					else 
					{
						printf("Success to send information to User");
					}*/
				}
			
				else 
				{    
					if(strcmp("Userinf",splited.fst)==0)
					{
					
						p=Userlist1.getUserinformation();
						if(send(ClientSock, p,strlen (p) + 1, 0)==SOCKET_ERROR)
						printf("Error to send information to User");
						else 
							printf("Success to send information to User");
					}
					else
					{
						sendMsgToUser(splited.fst, splited.snd);   //转发消息
					}

				}
			}
			
		}
	}
	return 0;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -