📄 sever.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 + -