使用TCP连接提交TXT文本作业
Linux-C 简单的TCP文件传输例子
https://blog.csdn.net/nanfeibuyi/article/details/88752382
②主机内写好作业
③主机写好程序代码(在虚拟机中操作也行,在主机中写好再拖拽到虚拟机中共享依赖于你已经装好VMwaretools)
③进入虚拟机系统打开终端
nano task1.c //nano新建代码文件
//将代码复制到到文件内Ctrl+O 保存
回到文件内可看到已经生成的文件task1.c
④同理nano 命令生成CH1task.txt文件用于存放作业内容并保存
⑤新建终端首先编译task1.c
gcc task1.c -o task1 //编译生成可执行task1文件
⑥执行task1文件
./task1 IP地址 端口号 // IP地址和端口号均为接收方所提供
成功!
//程序代码:
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>//socket函数
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <string.h>
#include <pthread.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <libgen.h>//使用basename(),从路径中获取文件名及后缀
int main(int argc, char * argv[])//两个参数分别代表IP地址和端口号
{
if(argc != 3)
{
printf("IP 端口号\n");
return -1;
}
int port = atoi(argv[2]);
int tcp_socket = socket(AF_INET, SOCK_STREAM, 0);//创建TCP通信socket
if (tcp_socket == -1)//创建失败
{
perror("create socketfd is fail\n");
return -1;
}
struct sockaddr_in dest_addr = {0};
dest_addr.sin_family = AF_INET;
dest_addr.sin_port = htons(port);
dest_addr.sin_addr.s_addr = inet_addr(argv[1]);
int ret = -1;
ret = connect(tcp_socket, (struct sockaddr *)&dest_addr, sizeof(dest_addr));
if(ret != 0)
{
perror("connect failed\n");
return -1;
}
printf("\nConnect succeed!\n");
char file_path[128] = {0};//传输文件路径
char file_info[2048] = {0};//传输文件信息
char buf[1024] = {0};
printf("请输入文件路径: ");
scanf("%s", file_path);
char file_name[128] = {0};
strncpy(file_name, basename(file_path), sizeof(file_name));//读取文件信息并从中获得文件后缀
int fd = open(file_path, O_RDWR);
if (fd == -1)
{
printf("open [%s] failed", file_path);
return -1;
}
int len = lseek(fd, 0, SEEK_END);
lseek(fd, 0, SEEK_SET);
sprintf(file_info, "%d", len);//获取文件信息
strcpy(file_info + 16, file_name); //copy文件
write(tcp_socket, file_info, 144);
int send_len = 0;
while (1)
{
bzero(buf, sizeof(buf));
ret = read(fd, buf, sizeof(buf));
if (ret <= 0)
{
printf("send file[%s] succeed!!!!\n", file_name);
break;
}
write(tcp_socket, buf, ret);
send_len += ret; //上传文件的百分比
printf("uploading %.2f%%\n", (float)send_len/len * 100);
}
close(fd); // 关闭文件
close(tcp_socket);//关闭通信socket
return 0;
}