WINSOCK 传送文件
SERVER:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 | // send_server.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include <WinSock2.h> #include <stdio.h> #pragma comment(lib,"ws2_32.lib") int main( int argc, char ** argv) { WSADATA wsadata; if (WSAStartup(MAKEWORD(2,2),&wsadata) == -1) { printf ( "wsastartup error\r\n" ); } SOCKET server; server = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP); if (server == SOCKET_ERROR) { printf ( "server socket start error\r\n" ); return 0; } sockaddr_in server_service; server_service.sin_family = AF_INET; server_service.sin_port = htons(8000); server_service.sin_addr.S_un.S_addr = inet_addr( "127.0.0.1" ); if (bind(server,(sockaddr*)&server_service, sizeof (server_service)) == SOCKET_ERROR) { printf ( "Bind Port error\r\n" ); return 0; } if (listen(server,5) == SOCKET_ERROR) { printf ( "Listen client error\r\n" ); return 0; } SOCKET acceptsocket; printf ( "wait accept recv data\r\n" ); while (1) { acceptsocket = SOCKET_ERROR; while (acceptsocket == SOCKET_ERROR) { acceptsocket = accept(server,NULL,NULL); } printf ( "Client connetcd\r\n" ); server = acceptsocket; break ; } char sendbuf[1024] = {0}; DWORD dwread; BOOL bret; char filename[] = "test.exe" ; HANDLE hfile = CreateFileA(filename,GENERIC_READ,0,0,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0); while ( true ) { bret = ReadFile(hfile,sendbuf,1024,&dwread,NULL); if (bret == false ) { printf ( "read file error\r\n" ); break ; } else if (dwread == 0) { printf ( "send file ok" ); break ; } else { send(server,sendbuf,dwread,0); } } CloseHandle(hfile); WSACleanup(); return 0; } |
CLIENT:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 | // send_client.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include <stdio.h> #include <WinSock2.h> #pragma comment(lib,"ws2_32.lib") int main() { WSADATA wsadata; int iResult = WSAStartup(MAKEWORD(2,2),&wsadata); if (iResult != NO_ERROR) { printf ( "Errpr at wsastartup\r\n" ); } SOCKET client; client = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP); if (client == INVALID_SOCKET) { printf ( "error at socket():%ld\r\n" ,WSAGetLastError()); WSACleanup(); return 0; } sockaddr_in clientService; clientService.sin_family = AF_INET; clientService.sin_port = htons(8000); clientService.sin_addr.S_un.S_addr = inet_addr( "127.0.0.1" ); if (connect(client,(SOCKADDR*)&clientService, sizeof (clientService)) == SOCKET_ERROR) { printf ( "Faied to error\r\n" ); WSACleanup(); return 0; } char recvbuf[1024] = {0}; int read; DWORD dwWrite; BOOL bRet; char filename[] = "test.exe" ; HANDLE hfile = CreateFileA(filename,GENERIC_WRITE,0,0,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,0); while ( true ) { read = recv(client,recvbuf,1024,0); if (read ==-1) { break ; } bRet = WriteFile(hfile,recvbuf,read,&dwWrite,NULL); if (bRet == FALSE) { MessageBoxW(NULL,_T( "Write buffer error\r\n" ),NULL,MB_OK); } } MessageBoxW(NULL,_T( "write buffer susccess\r\n" ),NULL,MB_OK); return 0; } |
在发送文件之前,我们可以利用getfilesize来获取文件打开的大小。
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET制作智能桌面机器人:结合BotSharp智能体框架开发语音交互
· 软件产品开发中常见的10个问题及处理方法
· .NET 原生驾驭 AI 新基建实战系列:向量数据库的应用与畅想
· 从问题排查到源码分析:ActiveMQ消费端频繁日志刷屏的秘密
· 一次Java后端服务间歇性响应慢的问题排查记录
· 互联网不景气了那就玩玩嵌入式吧,用纯.NET开发并制作一个智能桌面机器人(四):结合BotSharp
· 一个基于 .NET 开源免费的异地组网和内网穿透工具
· 《HelloGitHub》第 108 期
· Windows桌面应用自动更新解决方案SharpUpdater5发布
· 我的家庭实验室服务器集群硬件清单