#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#define SERVER_IP "192.168.2.163"
#define SERVER_PORT 69
#define BLOCK_SIZE 512
int main() {
// 打开文件
FILE* file = fopen("./聊天室.txt", "rb");
if (file == NULL) {
perror("File open error");
return -1;
}
// 获取文件大小
fseek(file, 0, SEEK_END);
long fileSize = ftell(file);
fseek(file, 0, SEEK_SET);
// 计算需要发送的数据块数量
int numBlocks = fileSize / BLOCK_SIZE;
if (fileSize % BLOCK_SIZE != 0) {
numBlocks++;
}
printf("预计发送%d块\n",numBlocks);
// 建立UDP连接
int sockfd = socket(AF_INET, SOCK_DGRAM, 0);
if (sockfd < 0) {
perror("socket error");
return -1;
}
// 发送写请求
struct sockaddr_in serverAddr;
serverAddr.sin_family = AF_INET;
serverAddr.sin_port = htons(SERVER_PORT);
serverAddr.sin_addr.s_addr = inet_addr(SERVER_IP);
socklen_t addrlen = sizeof(serverAddr);
char buf[516] = ""; // 分配足够的空间,并初始化为零
int size = sprintf(buf, "%c%c%s%c%s%c", 0, 2, "11.txt", 0, "octet", 0);
printf("%s%d",buf,size);
if (sendto(sockfd, buf, size, 0, (struct sockaddr*)&serverAddr, sizeof(serverAddr)) < 0) {
perror("sendto error");
return -1;
}
printf("发送上传请求成功:%s\n",buf);
// 接收服务器回复
char buffer[BLOCK_SIZE];
struct sockaddr_in responseAddr;
socklen_t addrlen_respon = sizeof(responseAddr);
if((recvfrom(sockfd, buffer, sizeof(buffer), 0, (struct sockaddr*)&responseAddr, &addrlen_respon))<0)
{
perror("recvfrom error");
close(sockfd);
return -1;
}
// 获取服务器的端口号
unsigned short serverPort = ntohs(responseAddr.sin_port);
printf("服务器端口号:%d\n", serverPort);
// 发送数据包
char packet[BLOCK_SIZE + 4];
char responsePacket[4];
for (int blockNumber = 1; blockNumber <= numBlocks; blockNumber++) {
// 构造数据包
sprintf(packet,"%c%c%c%c",0,3,0,1);
printf("packet:%s\n",packet);
// 读取文件数据
int bytesRead = fread(packet+4, 1, BLOCK_SIZE, file);
if (bytesRead < 0) {
perror("fread error");
return -1;
}
printf("bytesRead:%d\n",bytesRead);
// 发送数据块
int num= sendto(sockfd, packet, bytesRead + 4, 0, (struct sockaddr*)&responseAddr, sizeof(responsePacket));
printf("num:%d\n",num);
recvfrom(sockfd, responsePacket, sizeof(responsePacket), 0, (struct sockaddr*)&responseAddr, &addrlen_respon);
// 判断是否传输完成
}
// 关闭套接字和文件
fclose(file);
close(sockfd);
return 0;
}
6.9上传文件
最新推荐文章于 2024-06-23 09:52:46 发布