远程终端管理系统
- 格式:doc
- 大小:156.00 KB
- 文档页数:30
服务器端:
Lsd.h
#ifndef _LSD_H_
#define _LSD_H_
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define TYPE_LOGIN 0 //鐧诲綍鏁版嵁鍖?
#define TYPE_REG 1 //娉ㄥ唽鏁版嵁鍖?
#define TYPE_MSG 2 //娑堟伅鏁版嵁鍖?
#define TYPE_HEART 3 //蹇冭烦鏁版嵁鍖?
#define TYPE_CMD 4 //鍛戒护鏁版嵁鍖?
//#define TYPE_END 5
struct packet
{
int data_type;
int size;
char *data;
};
struct client
{
int state;
char client_name[9];
char passwd[9];
struct client *next;
};
int check_login(char *str);
struct sockaddr_in ip_port();
void client_pthread(int newsock);
void heart(char *ipbuf); void browse(int newsock, char *str);
struct client *creat_user(struct client *head);
void write_user(struct client *head);
void Free(struct client *head);
int login(int sockfd, char *str);
void regis_file(char *str);
void registion(int sockfd, char *str);
void writebuf(char *string);
struct packet unpack(int sockfd, struct packet server);
void signal();
int execmd(const char *cmd, int newsock);
#endif
Server.c:
#include "lsd.h"
time_t newtime;
time_t oldtime;
struct client *head = NULL; //鍏ㄥ眬閾捐〃澶存寚閽?
/* 涓诲嚱鏁?*/
int main()
{
int sockfd = -1;
int newsock = -1;
int ret = -1;
int len;
char ipbuf[20];
char buf[100];
pthread_t tid;
struct sockaddr_in serveraddr;
struct sockaddr_in cliaddr;
head = creat_user(head); //寤虹珛鍏ㄥ眬閾捐〃
newtime = time(NULL);
oldtime = time(NULL);
/* 寤虹珛濂楁帴瀛?*/
sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd < 0)
{
perror("socket");
exit(0); }
/* 缁欏鎺ュ瓧璧嬩簣鍦板潃鍜岀鍙?*/
serveraddr = ip_port();
ret = bind(sockfd, (struct sockaddr *)&serveraddr, sizeof(serveraddr));
if (ret < 0)
{
perror("bind");
exit(0);
}
/* 缁欓摼鎺ユ帓闃?*/
ret = listen(sockfd, 5);
if (ret < 0)
{
perror("listen");
exit(1);
}
/* 鎺ュ彈缃戠粶閾炬帴 */
while (1)
{
len = sizeof(cliaddr);
newsock = accept(sockfd, (struct sockaddr *)&cliaddr, &len);
if (newsock < 0)
{
perror("accept");
exit(0);
}
/* 灏?杩涘埗缃戠粶鍦板潃杞崲鎴愬瓧绗︿覆缃戣矾鍦板潃 */
inet_ntop(AF_INET, &cliaddr.sin_addr.s_addr, ipbuf, sizeof(ipbuf));
/* 鏈嶅姟鍣ㄦ樉绀哄苟鍐欏叆鏃ュ織鏂囦欢 */
time_t t;
time(&t);
char *tm = ctime(&t);
sprintf(buf, "IP:[%s] STATE: Connected TIME: %s", ipbuf, tm);
printf("%s", buf);
writebuf(buf);
ret = pthread_create(&tid, NULL, (void *)client_pthread, (void *)newsock); if (ret < 0)
{
perror("pthread_create tid");
exit(0);
}
ret = pthread_create(&tid, NULL, (void *)heart, (void *)ipbuf);
if (ret < 0)
{
perror("pthreat_creat heart");
exit(0);
}
}
close(sockfd);
close(newsock);
Free(head);
return 0;
}
/* 瀹㈡埛绔姛鑳界殑瀹炵幇 */
void client_pthread(int newsock)
{
int n = 0;
int ret = -1;
char buf[100];
time_t t;
char *tm;
int i = 0;
char name[9];
pthread_t tid;
struct packet server;
struct client *p = head;
/* 鐧诲綍鍚庢帴鍙楁暟鎹寘 */
while (1)
{
server = unpack(newsock, server);
switch (server.data_type)
{
case TYPE_LOGIN:
/* 鎺ユ敹鐧诲綍鏁版嵁鍖?*/
n = login(newsock, server.data);
if (n != 1) {
break;
}
time(&t);
tm = ctime(&t);
memset(name, 0, sizeof(name));
while (server.data[i] != '/')
{
name[i] = server.data[i];
i++;
}
sprintf(buf, "USER: %s STATE: Connected TIME: %s", name, tm);
printf("%s", buf);
writebuf(buf);
break;
case TYPE_REG:
/* 瀹炵幇娉ㄥ唽 */
registion(newsock, server.data);
break;
case TYPE_CMD:
/* 瀹炵幇鎸囦护 */
sprintf(buf, "USER: %s OPERATION: %s TIME: %s", name, server.data, tm);
writebuf(buf);
execmd(server.data, newsock);
break;
case TYPE_MSG:
/* 娴忚鍏朵粬鐢ㄦ埛 */
browse(newsock, server.data);
break;
case TYPE_HEART:
/* 蹇冭烦鍖?*/
oldtime = time(NULL);
writebuf(server.data);
break;
default:
break;
}
}
close(newsock);
/* 杩樺師鐢ㄦ埛鐨勭櫥褰曠姸鎬?*/
while (p != NULL)
{
if (strcmp(name, p->client_name) == 0)