1、客户端
1.1 头文件 tcp_client.h
#ifndef UNTITLED_TCP_CLIENT_H
#define UNTITLED_TCP_CLIENT_H
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <string.h>
#include <sys/stat.h>
#include <fcntl.h>
class TcpLient
{
public:
TcpLient(){};
void clientSend(int argc, char* argv[]);
private:
int clientSocket;
};
#endif //UNTITLED_TCP_CLIENT_H
1.2 cpp文件 tcp_client.cpp
#include "tcp_client.h"
void TcpLient::clientSend(int argc, char* argv[])
{
//1 create socket param1:
clientSocket = socket(AF_INET, SOCK_STREAM, 0);
if(-1 == clientSocket) printf("create socket error: %m\n"), exit(-1);
printf("create socket sucess !\n");
//2 create server agreement adresses
struct sockaddr_in cAddr = {0};
cAddr.sin_family = AF_INET;
cAddr.sin_addr.s_addr = inet_addr("127.0.0.1");
cAddr.sin_port = htons(9527);
//3 connect server
int r = connect(clientSocket, (struct sockaddr*)&cAddr, sizeof cAddr);
if(-1 == r) printf("connect server is faile :%m ]\n"), close(clientSocket), exit(-2);
printf("connect server is sucess! \n");
// 4 communication
//4.1 open file
int fd = open(argv[1],O_RDONLY, 0666);
if(-1 == fd) printf("open file faile:%m\n"), close(clientSocket), exit(-3);
printf("open file sucess!\n");
//4.2 get file size
struct stat st = {0};
stat(argv[1], &st);
printf(" the file size : %d\n", (int)st.st_size);
printf(" the file name : %s\n",argv[1]);
sleep(2);
//4.3 send file name and file size to server
send(clientSocket, argv[1], strlen(argv[1]), 0);
sleep(2);
send(clientSocket, (char*)&st.st_size, 4,0);
//4.4 read file' data and send
sleep(2);
char buff[1024] = {0};
while(1)
{
r = read(fd, buff, 1024);
if(r > 0)
send(clientSocket, buff, r, 0);
else
break;
}
//5 close file
sleep(1);
close(fd);
close(clientSocket);
printf("send file is over!\n");
}
2、服务端
2.1 头文件 tcp_server.h
#ifndef UNTITLED_TCP_SERVER_H
#define UNTITLED_TCP_SERVER_H
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <string.h>
#include <signal.h>
#include <fcntl.h>
class tcp_server
{
public:
tcp_server(){};
void hand(int val);
void serverRecive(int argc, char* argv[]);
private:
int serverSocket,clientSocket;
};
#endif //UNTITLED_TCP_SERVER_H
2.2 cpp文件 tcp_server.cpp
#include "tcp_server.h"
void tcp_server::serverRecive(int argc, char* argv[])
{
//1 create socket param1:
serverSocket = socket(AF_INET, SOCK_STREAM, 0);
if(-1 == serverSocket) printf("create socket error: %m\n"), exit(-1);
printf("create socket sucess !\n");
//2 create server agreement adresses
struct sockaddr_in sAddr = {0};
sAddr.sin_family = AF_INET;
sAddr.sin_addr.s_addr = inet_addr("127.0.0.1");
sAddr.sin_port = htons(9527);
//3 binding
int r = bind(serverSocket, (struct sockaddr*)&sAddr, sizeof sAddr);
if(-1 == r) printf("binding is faile :%m ]\n"), close(serverSocket), exit(-2);
printf("binding is sucess! \n");
//4 listen
r = listen(serverSocket, 10);
if(-1 == r) printf("listening is faile:%m \n"), close(serverSocket), exit(-2);
printf(" listening is sucess \n");
// 5 wait client connect
struct sockaddr_in cAddr = {0};
socklen_t len = sizeof(cAddr);
clientSocket = accept(serverSocket, (struct sockaddr*)&cAddr, &len);
if(-1 == clientSocket) printf(" server is bad: %m\n"), close(serverSocket), exit(-3);
printf("there is some clients have connect:%s\n", inet_ntoa((cAddr.sin_addr)));
//6 communication
char fileName[256] = {0};
int fileSize = 0;
char buff[1024] = {0};
int fileCount; // count the size of writing to file
sleep(2);
//6.1 recive file's name
r = recv(clientSocket, fileName, 255, 0);
if(r > 0)
{
printf(">>>>>>>>>%d\n", r);
printf("recive file's name: %s\n", fileName);
}
sleep(2);
//6.2 recive file's size
r = recv(clientSocket, (int*)&fileSize, 4, 0);
if(r == 4)
{
printf("the size of file is :%d\n", r);
printf("recive the size of file is :%d\n", fileSize);
}
//6.3 create file
int fd = open(fileName, O_CREAT | O_WRONLY, 0666);
if(-1 == fd) printf("create file is faile!:%m\n"), close(clientSocket), close(serverSocket), exit(-4);
sleep(2);
//6.4 write to file from recive dat
while(1)
{
r = recv(clientSocket,buff, 1024, 0);
if(r > 0)
{
write(fd, buff, r);
fileCount += r;
if(fileCount >= fileSize)
break;
}
}
//7 close file and connect
sleep(1);
close(fd);
close(serverSocket);
close(serverSocket);
printf("file recive is over!\n");
}
void tcp_server::hand(int val)
{
//7 close connect
close(serverSocket);
printf("bye! \n");
exit(0);
}
3、mian函数
#include "tcp_server.h"
#include "tcp_client.h"
int main(int argc, char* argv[])
{
printf("%d\n",argc);
if(argc == 1)
{
tcp_server server;
server.serverRecive(argc,argv);
}
else
{
TcpLient client;
client.clientSend(argc,argv);
}
// return 0;
// }