使用cpp实现将csv文件作为附件传输到客户端 服务端和客户端的代码分别是什么
时间: 2023-05-24 18:03:54 浏览: 90
圣战源代码,cpp的,分为服务端和客户端
服务端代码(基于TCP socket):
```cpp
#include <iostream>
#include <fstream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cerrno>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#define DEFAULT_PORT 8888
#define MAXLINE 1024
void str_echo(int sockfd) {
char buf[MAXLINE];
int n;
// 打开csv文件
std::ifstream fin("data.csv");
if(!fin.is_open()) {
std::cerr << "Can't open file data.csv" << std::endl;
return;
}
// 读取文件并发送给客户端
while(fin.getline(buf, MAXLINE)) {
if(write(sockfd, buf, strlen(buf)) < 0) {
std::cerr << "Write error: " << strerror(errno) << std::endl;
return;
}
if(write(sockfd, "\n", 1) < 0) {
std::cerr << "Write error: " << strerror(errno) << std::endl;
return;
}
}
// 关闭文件
fin.close();
}
int main(int argc, char** argv) {
int listenfd, connfd;
pid_t childpid;
socklen_t clilen;
struct sockaddr_in cliaddr, servaddr;
// 创建TCP socket
if((listenfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
std::cerr << "Socket error: " << strerror(errno) << std::endl;
return -1;
}
// 初始化服务器地址结构体
memset(&servaddr, 0, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
servaddr.sin_port = htons(DEFAULT_PORT);
// 绑定socket和地址结构体
if(bind(listenfd, (struct sockaddr*)&servaddr, sizeof(servaddr)) < 0) {
std::cerr << "Bind error: " << strerror(errno) << std::endl;
return -1;
}
// 监听socket
if(listen(listenfd, 5) < 0) {
std::cerr << "Listen error: " << strerror(errno) << std::endl;
return -1;
}
for( ; ; ) {
// 接受客户端的连接并创建子进程处理
clilen = sizeof(cliaddr);
if((connfd = accept(listenfd, (struct sockaddr*)&cliaddr, &clilen)) < 0) {
std::cerr << "Accept error: " << strerror(errno) << std::endl;
continue;
}
if((childpid = fork()) == 0) {
// 子进程
close(listenfd);
str_echo(connfd);
close(connfd);
exit(0);
}
close(connfd);
}
return 0;
}
```
客户端代码(基于TCP socket):
```cpp
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cerrno>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#define DEFAULT_PORT 8888
#define MAXLINE 1024
int main(int argc, char** argv) {
int sockfd, n;
char recvline[MAXLINE + 1];
struct sockaddr_in servaddr;
// 命令行参数中指定服务器IP地址,否则使用默认值
const char* server_ip = "127.0.0.1";
if(argc == 2) {
server_ip = argv[1];
}
// 创建TCP socket
if((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
std::cerr << "Socket error: " << strerror(errno) << std::endl;
return -1;
}
// 初始化服务器地址结构体
memset(&servaddr, 0, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(DEFAULT_PORT);
if(inet_pton(AF_INET, server_ip, &servaddr.sin_addr) < 0) {
std::cerr << "Inet_pton error: " << strerror(errno) << std::endl;
return -1;
}
// 连接服务器
if(connect(sockfd, (struct sockaddr*)&servaddr, sizeof(servaddr)) < 0) {
std::cerr << "Connect error: " << strerror(errno) << std::endl;
return -1;
}
// 接收csv文件并输出
while((n = read(sockfd, recvline, MAXLINE)) > 0) {
recvline[n] = 0;
std::cout << recvline;
}
if(n < 0) {
std::cerr << "Read error: " << strerror(errno) << std::endl;
}
return 0;
}
```
阅读全文