提交 d0128aaf 编写于 作者: 龙的传人科龙's avatar 龙的传人科龙

作一个备份

上级 1a0e50bc
{
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "gcc - Build and debug active file",
"type": "cppdbg",
"request": "launch",
"program": "${fileDirname}/${fileBasenameNoExtension}",
"args": [
"9190",
"coderon"
],
"stopAtEntry": false,
"cwd": "${fileDirname}",
"environment": [],
"externalConsole": false,
"MIMode": "gdb",
"setupCommands": [
{
"description": "Enable pretty-printing for gdb",
"text": "-enable-pretty-printing",
"ignoreFailures": true
}
],
"preLaunchTask": "C/C++: gcc build active file",
"miDebuggerPath": "/usr/bin/gdb",
}
],
"sourceFileMap": {
"/build/glibc-eX1tMB": "/usr/src/glibc"
}
}
\ No newline at end of file
{
"tasks": [
{
"type": "cppbuild",
"label": "C/C++: gcc build active file",
"command": "/usr/bin/gcc",
"args": [
"-g",
"${file}",
"-o",
"${fileDirname}/${fileBasenameNoExtension}"
],
"options": {
"cwd": "${fileDirname}"
},
"problemMatcher": [
"$gcc"
],
"group": {
"kind": "build",
"isDefault": true
},
"detail": "Task generated by Debugger."
}
],
"version": "2.0.0"
}
\ No newline at end of file
文件已添加
......@@ -4,9 +4,11 @@
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <sys/select.h>
#include <sys/time.h>
#define BUF_SIZE 1024
#define SIZE 8 //每次发送文件的大小
#define buf_SIZE 1024
#define SIZE 1024 //每次发送文件的大小
//服务器信息
int serv_sock;
......@@ -17,20 +19,32 @@ fd_set reads;
fd_set cpy_reads;
int fd_max;
//缓存定义
char Recvbuf[buf_SIZE];
char Name[32]; //名字
void error_handling(char *message);
void Shell();
void Read_a_send(char *filename);
void Excute();
void ReturnFile(char *filename);
int main(int argc, char *argv)
int main(int argc, char *argv[])
{
if (argc != 3)
error_handling("Usage <Port> <Name>");
serv_sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
memset(&serv_adr, 0, sizeof(serv_adr));
serv_adr.sin_family = AF_INET;
serv_adr.sin_addr.s_addr = inet_addr("100.2.169.8");
serv_adr.sin_port = htons(9190);
serv_adr.sin_port = htons(atoi(argv[1]));
if (connect(serv_sock, (struct sockaddr *)&serv_adr, sizeof(serv_adr)) == -1)
error_handling("connect() error\n");
strcpy(Name, argv[2]);
printf("Name:%s", Name);
printf("Connect Ok ServerIp %s \t%d\n", inet_ntoa(serv_adr.sin_addr), ntohs(serv_adr.sin_port));
FD_ZERO(&reads);
......@@ -57,75 +71,137 @@ int main(int argc, char *argv)
return 0;
}
//
void Shell()
{
char buf[BUF_SIZE];
if (FD_ISSET(0, &cpy_reads)) //从屏幕读取数据
if (FD_ISSET(0, &cpy_reads)) //从键盘读取数据
{
memset(buf, 0, BUF_SIZE);
read(0, buf, BUF_SIZE - 1);
//write(serv_sock, buf, sizeof(buf));
write(serv_sock, buf, strlen(buf)); //这里测试用strlen();
// char Sendbuf[buf_SIZE + 32 + 1];
//memset(Sendbuf, 0, buf_SIZE);
memset(Recvbuf, 0, buf_SIZE);
read(0, Recvbuf, buf_SIZE - 1);
//sprintf(Sendbuf, "[%s]%s", Name, Recvbuf);
//write(serv_sock, Recvbuf, sizeof(Sendbuf));
write(serv_sock, Recvbuf, strlen(Recvbuf)); //这里测试用strlen();
}
if (FD_ISSET(serv_sock, &cpy_reads)) //接受数据,输出到屏幕
{
memset(buf, 0, sizeof(buf));
read(serv_sock, buf, BUF_SIZE);
//write(1, &buf[0], 1);
if (buf[0] == 'e')
memset(Recvbuf, 0, sizeof(Recvbuf));
int str_len = read(serv_sock, Recvbuf, buf_SIZE);
if (str_len == 0) //如果收到长度为0的数据,说明服务器没了
{
printf("Server Baboo over!\n");
close(serv_sock);
return;
}
//对字符串进行分解,提取命令,方便进行不同命令操作
char deliver[buf_SIZE];
memcpy(deliver, Recvbuf, sizeof(Recvbuf));
char *p;
p = strtok(deliver, " ");
for (int i = 0; i < 5; i++)
{
if (p != NULL)
p = strtok(NULL, " ");
if (p == NULL)
break;
}
puts(buf);
int ret = system(buf);
if (ret < 0)
printf("system() error\n");
//发送文件给Server
FILE *fp;
int totlen;
char sendBuf[BUF_SIZE];
if ((fp = fopen("cmd.txt", "rb")) == NULL)
puts("fopen() error\n");
fseek(fp, 0, SEEK_END);
totlen = ftell(fp);
//发送文件长度,方便服务器
memset(sendBuf, 0, sizeof(sendBuf));
//itoa(totlen, sendBuf, 10);
sprintf(sendBuf, "%d", totlen);
ret = send(serv_sock, sendBuf, strlen(sendBuf) + 1, 0);
//printf("cmd.txt大小%d字节\n", totlen);
int cnt = totlen / SIZE;
int len1 = SIZE;
int lenlast;
if (totlen % SIZE)
{
lenlast = totlen - cnt * SIZE;
cnt = cnt + 1;
}
rewind(fp);
// int count = 0;
for (int i = 0; i < cnt - 1; i++)
{
fread(sendBuf, SIZE, 1, fp);
send(serv_sock, sendBuf, SIZE, 0);
//write(1, buf, strlen(buf));
memset(sendBuf, 0, sizeof(sendBuf));
//++count;
}
fread(sendBuf, SIZE, 1, fp);
send(serv_sock, sendBuf, 8, 0);
//write(1, buf, strlen(buf));
//printf("发送次数%d\n", ++count);
fclose(fp);
// if (p != NULL)
// printf("Command :%s\n", p);
char cmd[32];
if (p != NULL)
sprintf(cmd, "%s", p);
if (0 == strcmp(cmd, "ls"))
{
Excute(); //执行命令
}
else if (0 == strcmp(cmd, "pwd"))
{
Excute(); //执行命令
}
else if (0 == strcmp(cmd, "fetch"))
{
p = strtok(NULL, " ");
if (p != NULL)
ReturnFile(p);
printf("fetch filename :%s\n", p);
}
else if (0 == strcmp(cmd, "touch") || 0 == strcmp(cmd, "mkdri"))
Excute();
else if (0 == strcmp(cmd, "echo"))
Excute();
else if (0 == strcmp(cmd, "push"))
;
else //默认为聊天
if (Recvbuf[0] != 'e')
write(1, Recvbuf, sizeof(Recvbuf));
else
write(1, buf, sizeof(buf));
Excute();
}
}
void Excute()
{
puts(Recvbuf);
int ret = system(Recvbuf);
if (ret < 0)
printf("system() error\n");
//发送文件给Server
Read_a_send("cmd.txt");
system("cat cmd.txt");
}
void Read_a_send(char *p)
{
char filename[32];
sprintf(filename, "%s", p);
FILE *fp;
int totlen;
char Recvbuf[buf_SIZE];
if ((fp = fopen(filename, "rb")) == NULL)
puts("fopen() error\n");
fseek(fp, 0, SEEK_END);
totlen = ftell(fp);
//发送文件长度,方便服务器
memset(Recvbuf, 0, sizeof(Recvbuf));
sprintf(Recvbuf, "%d", totlen);
send(serv_sock, Recvbuf, strlen(Recvbuf) + 1, 0);
int cnt = totlen / SIZE;
int len1 = SIZE;
int lenlast;
if (totlen % SIZE)
{
lenlast = totlen - cnt * SIZE;
cnt = cnt + 1;
}
rewind(fp);
for (int i = 0; i < cnt - 1; i++)
{
fread(Recvbuf, SIZE, 1, fp);
sleep(0.1);
send(serv_sock, Recvbuf, SIZE, 0);
memset(Recvbuf, 0, sizeof(Recvbuf));
}
fread(Recvbuf, lenlast, 1, fp);
fclose(fp);
send(serv_sock, Recvbuf, lenlast, 0);
}
void ReturnFile(char *filename)
{
char cmd[32];
memset(cmd, 0, sizeof(cmd));
strcpy(cmd, "return fetch");
send(serv_sock, cmd, strlen(cmd), 0);
Read_a_send(filename);
}
void error_handling(char *message)
{
printf("%s", message);
......
文件已添加
......@@ -5,14 +5,15 @@
#include <arpa/inet.h>
#include <sys/socket.h>
#include <sys/select.h>
#include <sys/time.h>
#define Max_clnt_cnt 100
#define BUF_SIZE 1024
#define SIZE 1024
int clnt_cnt = 0;
int clnt_cnt = 0; //客户端连接数
socklen_t socklen_IPV4;
int clnt_socks[Max_clnt_cnt];
struct sockaddr_in clnt_adrs[Max_clnt_cnt];
int clnt_socks[Max_clnt_cnt]; //客户端的socket数组
struct sockaddr_in clnt_adrs[Max_clnt_cnt]; //客户端socket数组对应的ip地址
int telnet_data[Max_clnt_cnt];
/*要连接的服务器信息*/
......@@ -29,7 +30,10 @@ char buf[BUF_SIZE];
void error_handling(char *message);
void socket_handling();
void Execute(int sock);
void Execute(int sock, int cmd_len);
void Message_handle(int sock);
void Command_ls(int sock);
void Recv_a_Send(int sock, char *filename);
int main(int argc, char *argv[])
{
......@@ -38,7 +42,8 @@ int main(int argc, char *argv[])
memset(&serv_adr, 0, sizeof(serv_adr));
serv_adr.sin_family = AF_INET;
serv_adr.sin_addr.s_addr = inet_addr("100.2.169.8");
serv_adr.sin_port = htons(9190);
serv_adr.sin_port = htons(atoi(argv[1]));
//serv_adr.sin_port = htons(9991);
if (bind(serv_sock, (struct sockaddr *)&serv_adr, sizeof(serv_adr)) == -1)
error_handling("bind() error\n");
......@@ -55,7 +60,7 @@ int main(int argc, char *argv[])
/* SELECT 处理连接 */
cpy_reads = reads;
struct timeval time_out;
time_out.tv_sec = 1;
time_out.tv_sec = 2;
time_out.tv_usec = 0;
int ret = select(fd_max + 1, &cpy_reads, NULL, NULL, &time_out);
if (ret == -1)
......@@ -85,7 +90,9 @@ void socket_handling()
Recvtimeout.tv_sec = 3;
Recvtimeout.tv_usec = 0;
setsockopt(tongxunsock, SOL_SOCKET, SO_RCVTIMEO, &Recvtimeout, sizeof(Recvtimeout));
clnt_adrs[++clnt_cnt] = tmp_cln_adr;
clnt_adrs[clnt_cnt++] = tmp_cln_adr;
clnt_socks[clnt_cnt - 1] = tongxunsock;
FD_SET(tongxunsock, &reads);
if (fd_max < tongxunsock)
fd_max = tongxunsock;
......@@ -93,73 +100,120 @@ void socket_handling()
}
else
{
sleep(1); //睡1秒确保一次性收取所有信息
sleep(0.2); //睡1秒确保一次性收取所有信息
int str_len;
memset(buf, 0, BUF_SIZE);
str_len = read(i, buf, BUF_SIZE); //TODO 数据太长,要接受完再发送
str_len = read(i, buf, BUF_SIZE);
if (str_len == 0)
{
printf("client:%d 断开连接\n", i);
FD_CLR(i, &reads);
close(i);
int location;
for (int k = 0; k < sizeof(clnt_socks); k++) //TODO 这里只是将某个数组上的位置置0,可以做到移动数组
{
if (clnt_socks[k] == i)
{
clnt_socks[k] = -1;
clnt_adrs[k].sin_addr.s_addr = 0;
clnt_adrs[k].sin_port = 0;
}
}
}
else //对客户端的数据进行处理
{
printf("buf[0] = %c\n", buf[0]);
// char *p;
// p = strtok(buf, " ");
// char retcmd[32];
// if (p != NULL)
// sprintf(retcmd, "%s", p);
if (buf[0] == ':') //执行客户端命令
Execute(i);
else if (buf[0] == '$') //执行命令
Execute(i, str_len);
else if (buf[0] == '$') //执行服务端命令
{
if (buf[1] == 'l' && buf[2] == 's')
Command_ls(i); //处理 服务端「$ls」 命令
}
// else if (0 == strcmp(retcmd, "return"))
// { //TODO 服务端要把文件接受下来,再发送
// char filename[32];
// memset(filename, 0, sizeof(filename));
// recv(i, filename, sizeof(filename), 0);
// Recv_a_Send(i - 1, filename);
// }
else
for (int j = serv_sock + 1; j < fd_max + 1; j++)
{
if (j != i)
{
write(j, buf, strlen(buf));
printf("返回数据给client:%d-->%s", j, buf);
}
}
Message_handle(i);
}
}
}
}
}
void Execute(int sock)
void Message_handle(int sock)
{
for (int j = serv_sock + 1; j < fd_max + 1; j++)
{
if (j != sock)
{
write(j, buf, strlen(buf));
printf("返回数据给client:%d-->%s", j, buf);
}
}
}
void Execute(int sock, int cmd_len)
{
char prefix[] = "echo 8002904 | sudo -S";
char backfix[] = "> cmd.txt 2>&1";
//char backfix[] = "> cmd.txt 2>&1";
char backfix[] = "";
char cmd_buf[BUF_SIZE + 40];
char tmp[BUF_SIZE];
memset(tmp, 0, sizeof(tmp));
strncpy(tmp, buf + 1, sizeof(buf));
strncpy(tmp, buf + 1, strlen(buf));
//tmp[str_len - 2] = '\0';
tmp[strlen(tmp) - 1] = '\0';
tmp[cmd_len - 2] = '\0';
printf("tmp == %s\n", tmp);
sprintf(cmd_buf, "%s %s %s", prefix, tmp, backfix);
puts(cmd_buf);
write(sock + 1, cmd_buf, strlen(cmd_buf));
//printf("return cmd result\n");
Recv_a_Send(sock, "Temp.txt");
}
void Recv_a_Send(int sock, char *p)
{
char filename[32];
if (p != NULL)
sprintf(filename, "%s", p);
char recvBuf[BUF_SIZE];
int ret = recv(sock + 1, recvBuf, BUF_SIZE, 0);
int Total = atoi(recvBuf); //先接收,文件大小
//接受
FILE *fp;
fp = fopen("Temp.txt", "wb");
if (fp == NULL)
error_handling("fopen() error\n");
char recvBuf[8];
int ret = recv(sock + 1, recvBuf, 8, 0);
int Total = atoi(recvBuf); //先接收,文件大小
int cnt = 0;
sleep(1);
while (1)
{
memset(recvBuf, 0, sizeof(recvBuf));
ret = recv(sock + 1, recvBuf, 8, 0);
ret = recv(sock + 1, recvBuf, SIZE, 0);
fwrite(recvBuf, ret, 1, fp);
if (recvBuf[0] == '\0')
{
printf("recvBuf[0] == 0\n");
printf("ret == %d\n", ret);
}
else
{
printf("recvBuf[0] = %c\n", recvBuf[0]);
}
write(sock, recvBuf, ret); //接完就发
//fflush(NULL);
cnt += ret;
if (cnt >= Total || ret == -1)
break;
......@@ -168,8 +222,27 @@ void Execute(int sock)
fclose(fp);
}
void Command_ls(int sock)
{
for (int k = 0; k < clnt_cnt; k++)
{
char hostMess[50];
strcpy(hostMess, inet_ntoa(clnt_adrs[k].sin_addr));
char port[8];
sprintf(port, "%d", ntohs(clnt_adrs[k].sin_port));
strcat(hostMess, "\t");
strcat(hostMess, port);
strcat(hostMess, "\tsockNum\t");
char sockNum[8];
sprintf(sockNum, "%d", clnt_socks[k]);
strcat(hostMess, sockNum);
strcat(hostMess, "\n");
send(sock, hostMess, strlen(hostMess), 0);
}
}
void error_handling(char *message)
{
printf("%s", message);
exit(0);
}
\ No newline at end of file
}
total 80
drwxr-xr-x 1 coderon coderon 512 May 18 21:06 .
drwxr-xr-x 1 coderon coderon 512 May 16 23:56 ..
-rw-r--r-- 1 coderon coderon 0 May 18 20:42 123.txt
-rwxr-xr-x 1 coderon coderon 18304 May 18 21:03 Client
-rw-r--r-- 1 coderon coderon 5216 May 18 21:02 Client.c
-rwxrwxrwx 1 root root 0 May 18 21:15 cmd.txt
drwxr-xr-x 1 coderon coderon 512 May 17 11:38 .git
-rw-r--r-- 1 coderon coderon 430 May 16 23:56 .gitignore
-rw-r--r-- 1 coderon coderon 496 May 16 23:56 LICENSE
-rw-r--r-- 1 coderon coderon 903 May 16 23:56 README.en.md
-rw-r--r-- 1 coderon coderon 992 May 16 23:56 README.md
-rwxr-xr-x 1 coderon coderon 22592 May 18 21:03 Server
-rw-r--r-- 1 coderon coderon 7507 May 18 21:02 Server.c
-rw-r--r-- 1 coderon coderon 0 May 18 21:14 Temp.txt
文件已添加
#include <stdio.h>
#include <string.h>
int main(void)
{
char buf[1024];
fgets(buf, sizeof(buf), stdin);
printf("%s", buf);
printf("-------------------\n");
printf("sizeof(buf) == %d\n", sizeof(buf));
printf("strlen(buf)==%d\n", strlen(buf));
return 0;
}
/*
输出
hello world
-------------------
sizeof(buf) == 1024
strlen(buf)==12
结果:strlen() 包括 空格和斜杠
*/
\ No newline at end of file
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册