好的,这是一个很好的毕设主题。下面是一个基于TCP/IP的文件传输的简单设计和实现建议,使用VC代码实现:
1. 建立客户端和服务器端的TCP连接。
2. 客户端选择要传输的文件并将其读取到内存中。
3. 客户端将文件大小发送给服务器端。
4. 服务器端接收到文件大小后,分配一个缓冲区来存储接收到的文件。
5. 服务器端发送一个确认消息给客户端,表示已经准备好接收文件。
6. 客户端开始将文件数据分成固定大小的块,并将每个块发送给服务器端。
7. 服务器端接收每个块,并将其存储到缓冲区中。
8. 当客户端发送完整个文件后,它会发送一个文件传输完成的消息给服务器端。
9. 服务器端接收到文件传输完成的消息后,将缓冲区中的数据写入磁盘中,并发送一个确认消息给客户端,表示文件传输完毕。
10. 客户端接收到确认消息后,断开TCP连接。
这是一个基本的文件传输协议的设计和实现,您可以根据需要进行修改和扩展。以下是一个简单的VC代码示例,实现上述协议:
```c++
#include <stdio.h>
#include <winsock2.h>
#pragma comment(lib,"ws2_32.lib") //Winsock Library
#define BUF_SIZE 1024
int main(int argc, char* argv[])
{
WSADATA wsa;
SOCKET s, new_socket;
struct sockaddr_in server, client;
int c;
char* message;
char buffer[BUF_SIZE];
int recv_size;
FILE* fp;
long file_size;
long remain_size;
long read_size;
long write_size;
char filename[BUF_SIZE];
printf("\nInitialising Winsock...");
if (WSAStartup(MAKEWORD(2, 2), &wsa) != 0)
{
printf("Failed. Error Code : %d", WSAGetLastError());
return 1;
}
printf("Initialised.\n");
//Create a socket
if ((s = socket(AF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET)
{
printf("Could not create socket : %d", WSAGetLastError());
}
printf("Socket created.\n");
//Prepare the sockaddr_in structure
server.sin_family = AF_INET;
server.sin_addr.s_addr = INADDR_ANY;
server.sin_port = htons(8888);
//Bind
if (bind(s, (struct sockaddr*)&server, sizeof(server)) == SOCKET_ERROR)
{
printf("Bind failed with error code : %d", WSAGetLastError());
exit(EXIT_FAILURE);
}
puts("Bind done");
//Listen to incoming connections
listen(s, 3);
//Accept and incoming connection
puts("Waiting for incoming connections...");
c = sizeof(struct sockaddr_in);
new_socket = accept(s, (struct sockaddr*)&client, &c);
if (new_socket == INVALID_SOCKET)
{
printf("accept failed with error code : %d", WSAGetLastError());
return 1;
}
puts("Connection accepted");
//Receive file size
memset(buffer, 0, BUF_SIZE);
recv_size = recv(new_socket, buffer, BUF_SIZE, 0);
file_size = *(long*)buffer;
printf("File size: %ld\n", file_size);
//Receive file name
memset(buffer, 0, BUF_SIZE);
recv_size = recv(new_socket, buffer, BUF_SIZE, 0);
strcpy(filename, buffer);
printf("File name: %s\n", filename);
//Open file
fp = fopen(filename, "wb+");
if (fp == NULL)
{
printf("Could not open file %s", filename);
exit(EXIT_FAILURE);
}
//Receive file data
remain_size = file_size;
while (remain_size > 0)
{
read_size = BUF_SIZE;
if (remain_size < BUF_SIZE)
{
read_size = remain_size;
}
memset(buffer, 0, BUF_SIZE);
recv_size = recv(new_socket, buffer, read_size, 0);
write_size = fwrite(buffer, 1, recv_size, fp);
if (write_size != recv_size)
{
printf("Could not write to file %s", filename);
exit(EXIT_FAILURE);
}
remain_size -= write_size;
}
printf("File received: %s\n", filename);
//Send confirmation
message = "File received";
send(new_socket, message, strlen(message), 0);
//Close socket and file
fclose(fp);
closesocket(new_socket);
closesocket(s);
WSACleanup();
return 0;
}
```
以上代码只是服务器端的实现,客户端的实现类似,但需要从本地读取文件并将其分块发送给服务器端。您可以使用此代码作为参考,进行必要的修改和扩展,以实现您的毕设要求。