客户端发送文件到服务器 ,服务器接收后加密文件并备份源文件,发送加密后文件至客户端
//客户端
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<errno.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#define MAXLINE 50
/*
void sendstring(int sockfd)
{
int n, sum = 0;
char sendline[MAXLINE] = {'\0'};
while (1) {
printf("input data:\n");
fgets(sendline, MAXLINE, stdin);
sendline[strlen(sendline)-1]='\0';
if ( send(sockfd, sendline, strlen(sendline), 0) < 0)
{
printf("send msg error: %s(errno: %d)\n", strerror(errno), errno);
exit(0);
}
printf("%d\n",strlen(sendline));
memset(sendline, 0, MAXLINE);
}
}
*/
void sendfile(int sockfd)
{
int n = 0, sum = 0, len, t;
char sendline[MAXLINE] = {0};
char filename[50] = {0};
printf("input filename:");
scanf("%s", filename);
int srcfd = open(filename, O_RDONLY);
printf("filename=%s,size=%d\n", filename, strlen(filename) );
//发送要加密的文件名
//filename[strlen(filename)]='\n';
if ( send(sockfd, filename, strlen(filename), 0) < 0)
{
printf("send msg error: %s(errno: %d)\n", strerror(errno), errno);
exit(0);
}
memset(filename, 0, 50);
len = recv(sockfd, sendline, MAXLINE, 0);
sprintf(filename, "%s_%s", sendline, "srv_enc");
printf("jiamihou filename:%s\n", filename );
//发送要加密的文件
len = 0;
int clientfd = open(filename, O_WRONLY | O_CREAT | O_TRUNC | O_APPEND, 0777);
while ((n = read(srcfd, sendline, MAXLINE)) > 0)
{
if ( send(sockfd, sendline, n , 0) < 0)
{
printf("send msg error: %s(errno: %d)\n", strerror(errno), errno);
exit(0);
}
sum += n;
printf("send==%s\n", sendline);
memset(sendline, 0, MAXLINE);
n = recv(sockfd, sendline, MAXLINE, 0); //向客户端发送回应数据
write(clientfd, sendline, n );
printf("client==%s\n", sendline);
memset(sendline, 0, MAXLINE);
len += n;
}
if(len>50)
{
n = recv(sockfd, sendline, MAXLINE, 0); //向客户端发送回应数据
write(clientfd, sendline, n );
close(clientfd);
len += n;
}
printf("send ok!==sum=%d \n", sum);
send(sockfd, "ok", 2, 0);
//创建加密后的文件
printf("receive ok,lrn=%d\n", len);
close(clientfd);
close(srcfd);
}
int main(int argc, char** argv)
{
int sockfd, n, rec_len;
char recvline[MAXLINE], sendline[MAXLINE];
char buf[MAXLINE];
struct sockaddr_in servaddr;
if ( argc != 2) {
printf("usage: ./client <ipaddress>\n");
exit(0);
}
if ( (sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
printf("create socket error: %s(errno: %d)\n", strerror(errno), errno);
exit(0);
}
memset(&servaddr, 0, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(8000);
if ( inet_pton(AF_INET, argv[1], &servaddr.sin_addr) <= 0) {
printf("inet_pton error for %s\n", argv[1]);
exit(0);
}
if ( connect(sockfd, (struct sockaddr*)&servaddr, sizeof(servaddr)) < 0) {
printf("connect error: %s(errno: %d)\n", strerror(errno), errno);
exit(0);
}
printf("send msg to server: \n");
sendfile(sockfd);
//sendstring(sockfd);
/* fgets(sendline, 4096, stdin);
if ( send(sockfd, sendline, strlen(sendline), 0) < 0)
{
printf("send msg error: %s(errno: %d)\n", strerror(errno), errno);
exit(0);
}
int len = strlen(sendline);
sendline[len - 1] = '\0';
printf("%s\n", sendline );
if (strcmp(sendline, "exit") == 0) exit(0);
if ((rec_len = recv(sockfd, buf, MAXLINE, 0)) == -1) {
perror("recv error");
exit(1);
}
buf[rec_len] = '\0';
printf("Received : %s ", buf); */
close(sockfd);
exit(0);
}
//服务器
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<errno.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <signal.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <ctype.h>
#include <pthread.h>
#define DEFAULT_PORT 8000
#define MAXLINE 50
struct sockaddr_in servaddr, cliaddr;
/*
void* receivefile(void *arg)
{
int connect_fd = *((int *)arg);
int n;
char buff[MAXLINE] = {'\0'};
while (1)
{
//接受客户端传过来的数据
n = recv(connect_fd, buff, MAXLINE, 0);
//向客户端发送回应数据
if (send(connect_fd, "Hello,you are connected!\n", 26, 0) == -1)
perror("send error");
printf("recv msg from client n=%d :%s\n", n, buff);
if(strcmp(buff,"exit")==0) exit(0);
memset(buff, 0, MAXLINE);
}
close(connect_fd);
free(arg);
return (void *)0;
}
*/
void* receivefile(void *arg)
{
int connect_fd = *((int *)arg);
int n = 0, sum = 0, len, i = 0;
char buff[MAXLINE] = {0};
char str[30] = {0};
char enc[30] = {0};
//接收要加密的文件名
len = recv(connect_fd, buff, MAXLINE, 0);
//printf("--%s--%d\n", buff, len);
printf("filename=%s,size=%d\n", buff, len );
sprintf(str, "%s_%s", buff, "bck_enc");
sprintf(enc, "%s_%s", buff, "src");
int dstfd = open(enc, O_WRONLY | O_CREAT | O_TRUNC | O_APPEND, 0777);
int encryptfd = open( str, O_WRONLY | O_CREAT | O_TRUNC | O_APPEND, 0777);
memset(buff, 0, MAXLINE);
send(connect_fd, str, len, 0);
while (1)
{
//接受客户端传过来的数据
n = recv(connect_fd, buff, MAXLINE, 0); //向客户端发送回应数据
if (strcmp(buff, "ok") == 0)break;
write(dstfd, buff, n );
i = 0;
while (i < n )
{
buff[i] ^= 0x88;
i++;
}
write(encryptfd, buff, n );
send(connect_fd, buff, n, 0);
memset(buff, 0, MAXLINE);
sum += n;
}
close(dstfd);
close(encryptfd);
//encrypt();
printf("recv msg from client sum=%d\n", sum);
//发送加密后的文件名
//send(connect_fd,str,len,0);
//发送加密后的文件
//不能发送
/* sum=0;
lseek(encryptfd,0L,SEEK_SET);
while ((n = read(encryptfd,buff, MAXLINE)) > 0)
{
if ( send(connect_fd,buff,n , 0) < 0)
{
printf("send msg error: %s(errno: %d)\n", strerror(errno), errno);
exit(0);
}
memset(buff, 0, MAXLINE);
sum+=n;
}
*/
printf("send ok sum=%d\n", sum);
send(connect_fd, "ok", 2, 0);
close(encryptfd);
//close(connect_fd);
getchar();
free(arg);
return (void *)0;
}
int main(int argc, char** argv)
{
int socket_fd, connect_fd;
struct sockaddr_in servaddr;
char buff[4096];
//初始化Socket
int i, n;
pid_t pid;
socklen_t cliaddr_len;
//pthread
int *lptr;
pthread_t clid;
pthread_attr_t attr;
//初始化
pthread_attr_init(&attr);
//设置分离属性
pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
if ( (socket_fd = socket(AF_INET, SOCK_STREAM, 0)) == -1 ) {
printf("create socket error: %s(errno: %d)\n", strerror(errno), errno);
exit(0);
}
//初始化
memset(&servaddr, 0, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);//IP地址设置成INADDR_ANY,让系统自动获取本机的IP地址。
servaddr.sin_port = htons(DEFAULT_PORT);//设置的端口为DEFAULT_PORT
//将本地地址绑定到所创建的套接字上
if ( bind(socket_fd, (struct sockaddr*)&servaddr, sizeof(servaddr)) == -1) {
printf("bind socket error: %s(errno: %d)\n", strerror(errno), errno);
exit(0);
}
//开始监听是否有客户端连接
if ( listen(socket_fd, 10) == -1) {
printf("listen socket error: %s(errno: %d)\n", strerror(errno), errno);
exit(0);
}
printf("======waiting for client's request======\n");
//阻塞直到有客户端连接,不然多浪费CPU资源。
while (1)
{
cliaddr_len = sizeof(cliaddr);
lptr = (int *)malloc(sizeof(int));
*lptr = accept(socket_fd, (struct sockaddr *)&cliaddr, &cliaddr_len);
pthread_create(&clid, &attr, receivefile, (void *)lptr);
}
close(socket_fd);
}