2022年C++实现FTP服务器 .pdf
《2022年C++实现FTP服务器 .pdf》由会员分享,可在线阅读,更多相关《2022年C++实现FTP服务器 .pdf(28页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、准备工作 VC6.0 添加 ws2_32.lib到工程,如下图操作:1.首先添加 winsock 库到工程2.添加 lib 库文件3.添加 ws2_32.lib切记用空格隔开名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 28 页 - - - - - - - - - 4.点击 OK 即可源代码:FTP_Client: #pragma comment( lib, ws2_32.lib ) #include #include #include #include #includ
2、e #include #define TRAN_SUCCESS 1 /传输成功名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 28 页 - - - - - - - - - #define SOCK_WSA_ERR (-1) /启动 winsock 库失败#define SOCK_CRSOCK_ERR (-2) /创建套接字失败#define SOCK_BIND_ERR (-3) /绑定端口失败#define SOCK_LISTEN_ERR (-4) /监听失败#defin
3、e SOCK_ACCEPT_ERR (-5) /等待连接失败#define SOCK_SEND_ERR (-6) /发送数据失败#define SOCK_CLOSE_ERR (-7) /关闭SOCKET 失败#define SOCK_RECVE_ERR (-8) /接受数据失败#define SOCK_CONNECT_ERR (-10) #define FILE_ERR (-9) /文件错误#define Other_ERR (0) /其他不明原因#define SVR_PORT 6000 /服务器端口#define SEND_BUFFER_SIZE 4096 /每次发送大小#define R
4、ECV_BUFFER_SIZE 4096 /每次发送大小struct Fileinfo char fileName50; /文件名int fileBlock; / 文件分块大小int BlockNum; /文件块数量unsigned long fileSize; /文件总大小名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 28 页 - - - - - - - - - ; int RecevData( SOCKET s ); int Client(char* fileNam
5、e); void PrintReturn(int nRet); int Client( char* strIP) /int Client() /int Client(char* fileName) int nResult = 0; /1、启动 Winsock :对 Winsock DLL进行初始化,协商Winsock 的版本支持并分配必要的资源。(服务器端和客户端)WORD wVersion = MAKEWORD( 2, 0 );/wversion为 winsock 库的版本,高位字节为副版本,地位字节为主版本WSADATA wsData; nResult = WSAStartup( wVer
6、sion, &wsData );/加载 winsock 库, wsData 参数是指向LPWSADATA结构的指针if( nResult !=0 ) return SOCK_WSA_ERR; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 28 页 - - - - - - - - - if( LOBYTE( wsData.wVersion ) != 2 | HIBYTE( wsData.wVersion ) != 0 ) WSACleanup(); / return; e
7、xit(0); /2、创建套接字: (服务器端和客户端)SOCKET s = socket( AF_INET, SOCK_STREAM, 0 );/创建套接字if( s = INVALID_SOCKET ) return SOCK_CRSOCK_ERR; /错误处理 /* unsigned long uladdr; uladdr = inet_addr(127.0.0.1); /sock=socket(AF_INET,SOCK_STREAM,0); sockaddr_in sa; memset(&sa,0,sizeof(sa); 名师资料总结 - - -精品资料欢迎下载 - - - - - -
8、 - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 5 页,共 28 页 - - - - - - - - - sa.sin_family=AF_INET; sa.sin_port=htons(5150); sa.sin_addr.S_un.S_addr=uladdr; nResult = connect(s,(const sockaddr*)&sa,sizeof(sa); /4、套接字的连结:将两个套接字连结起来准备通信。(客户端)*/ /*int connect(SOCKET s, const struct sockaddr FAR * name,
9、 int namelen ) s 为欲连结的已创建的套接字。name 为欲连结的socket 地址。namelen 为 socket 地址的结构的长度。*/ unsigned long uladdr; uladdr = inet_addr(strIP); / uladdr = inet_addr(192.168.2.79); /此处设定的是Server 端 IP 地址/ uladdr = inet_addr(127.0.0.1); sockaddr_in addr; memset( &addr , 0 x00 , sizeof( addr ); addr. sin_family = AF_IN
10、ET; addr. sin_port = htons(SVR_PORT); /保证字节顺序/ addr. sin_addr.s_addr = htonl( uladdr ); / 保 证 字 节 顺 序 *这 种 写 法 很 奇名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 6 页,共 28 页 - - - - - - - - - 怪?*/ addr.sin_addr.S_un.S_addr = uladdr; nResult = connect( s, ( sockaddr*)&a
11、ddr, sizeof( sockaddr ) ); if( nResult0) return SOCK_CONNECT_ERR; /错误处理 /*/ char RecvBuf100; recv(s,RecvBuf,100,0); printf(%sn,RecvBuf); / char SendFileName100; / send(s,fileName,strlen(fileName) + 1,0); /*/ /6、 套接字的数据接收: (客户端)nResult = RecevData( s ); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - -
12、- - - - - 名师精心整理 - - - - - - - 第 7 页,共 28 页 - - - - - - - - - if(nResult0) return nResult; /错误处理 /7、 关闭套接字:释放所占有的资源。(服务器端和客户端)nResult=closesocket(s); if(nResult0) return SOCK_CLOSE_ERR; /错误处理 return TRAN_SUCCESS; /- int RecevData( SOCKET s ) FILE* stream; struct Fileinfo fileinfo; int nRet = 0; 名师资料
13、总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 8 页,共 28 页 - - - - - - - - - / unsigned long dataLength, cbBytesRet, cbLeftToReceive; unsigned long dataLength, cbLeftToReceive; BYTE* recdData = NULL; memset( &fileinfo, 0 x00, sizeof(fileinfo) ); nRet = recv( s , ( char *)
14、&fileinfo, sizeof(fileinfo), 0 ); if( nRet = SOCKET_ERROR ) return SOCK_RECVE_ERR; if( ( stream = fopen( fileinfo.fileName, wb) ) = NULL) return FILE_ERR; / char *tt; / nRet = send( s, ( char *)OK , sizeof( OK ),0 ); dataLength = fileinfo.fileSize; recdData = new byteRECV_BUFFER_SIZE; 名师资料总结 - - -精品
15、资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 9 页,共 28 页 - - - - - - - - - cbLeftToReceive = dataLength; int ii=0; do int iiGet, iiRecd; iiGet = ( cbLeftToReceive 0 ); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 10 页,共 28 页 - - - - - - - - - re
16、turn TRAN_SUCCESS; void PrintReturn( int nRet) switch( nRet ) case TRAN_SUCCESS: coutTRAN_SUCCESSendl; break; /传输成功case SOCK_WSA_ERR: coutSOCK_WSA_ERRendl; break; /启动 winsock失败case SOCK_CRSOCK_ERR: coutSOCK_CRSOCK_ERRendl; break; / 创 建 套接字失败case SOCK_BIND_ERR: coutSOCK_BIND_ERRendl; break; /绑定端口失败ca
17、se SOCK_LISTEN_ERR: coutSOCK_LISTEN_ERRendl; break; /监听失败case SOCK_ACCEPT_ERR: coutSOCK_ACCEPT_ERRendl; break; / 等 待 连 接 失败case SOCK_SEND_ERR: coutSOCK_SEND_ERRendl; break; /发送数据失败case SOCK_CLOSE_ERR: coutSOCK_CLOSE_ERRendl; break; /关闭SOCKET 失败case SOCK_RECVE_ERR: coutSOCK_RECVE_ERRendl; break; / 接
18、受 数 据 失败名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 11 页,共 28 页 - - - - - - - - - case SOCK_CONNECT_ERR: coutSOCK_CONNECT_ERRendl; break; case FILE_ERR: coutFILE_ERRendl; break; /文件错误case Other_ERR: coutOther_ERRendl; break; /其他不明原因default: coutNO ERRORendl; int m
19、ain() char ip = ; / char filename = ; coutPlease enter the FTPServers IP Address:ip; / scanf(%s,ip); / coutplease enter the file you want on the FTP:filename; / scanf(%s,filename); system(pause); int nRet = Client(ip); PrintReturn( nRet ); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精
20、心整理 - - - - - - - 第 12 页,共 28 页 - - - - - - - - - coutRecv OK!endl; return 0; FTP_Server: #pragma comment( lib, ws2_32.lib ) #include #include #include #include #include #define TRAN_SUCCESS 1 /传输成功#define SOCK_WSA_ERR (-1) /启动 winsock 失败#define SOCK_CRSOCK_ERR (-2) /创建套接字失败#define SOCK_BIND_ERR (-3
21、) /绑定端口失败#define SOCK_LISTEN_ERR (-4) /监听失败#define SOCK_ACCEPT_ERR (-5) /等待连接失败#define SOCK_SEND_ERR (-6) /发送数据失败#define SOCK_CLOSE_ERR (-7) /关闭SOCKET 失败#define SOCK_RECVE_ERR (-8) /接受数据失败名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 13 页,共 28 页 - - - - - - - - - #d
22、efine FILE_ERR (-9) /文件错误#define Other_ERR (0) /其他不明原因#define SVR_PORT 6000 /服务器端口#define SEND_BUFFER_SIZE 4096 /每次发送大小struct Fileinfo char fileName50; /文件名int fileBlock; / 文件分块大小int BlockNum; /文件块数量unsigned long fileSize; /文件总大小; bool GetLocalIP( char caIpAddr ); int FileSeReturn( int nRet); int Fi
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 2022年C+实现FTP服务器 2022 C+ 实现 FTP 服务器
限制150内