VC2010基于TCP/IP的Modbus传输实现

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,这是一个很好的毕设主题。下面是一个基于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; } ``` 以上代码只是服务器端的实现,客户端的实现类似,但需要从本地读取文件并将其分块发送给服务器端。您可以使用此代码作为参考,进行必要的修改和扩展,以实现您的毕设要求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值