欲用C++Builder实现一简单的FTP Server

zhouming 2000-08-15 06:13:00
欲实现一简单的FTP Server,只需上传、删除命令即可。各位高手有什么高招么?
...全文
301 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
playpcgame 2000-09-08
  • 打赏
  • 举报
回复
建立socket,监听端口21#include "stdafx.h" #include "winsock2.h" #include "resource.h" #include "ftp.h" CString GetHostIP() { char name[255]; CString ip; struct hostent * hostinfo; WORD wVersionRequested; WSADATA wsadata; wVersionRequested=MAKEWORD(2,0); if(WSAStartup(wVersionRequested,&wsadata)==0) if(gethostname(name,sizeof(name))==0) if((hostinfo=gethostbyname(name))!=NULL) { ip=inet_ntoa(*(struct in_addr *)*hostinfo->h_addr_list); WSACleanup(); return(ip); } WSACleanup(); return(""); } BOOL DoListen(SOCKET *s,HWND m_hWnd) { char temp[20]; int error; //SOCKET *s; // it is now a data member. if(listen(*s,SOMAXCONN)==SOCKET_ERROR) //0 means no error. { error=GetLastError(); sprintf(temp,"listen error=%d",error); //AfxMessageBox(temp); return(FALSE); } return(TRUE); } BOOL socketClose(SOCKET *s) { shutdown(*s,0); shutdown(*s,1); closesocket(*s); WSACleanup(); return(TRUE); } BOOL socketAccept(SOCKET *s, SOCKET *client, HWND m_hWnd, char *remoteIP) { unsigned int wMsg=UM_SOCK; int error=0, lasterror=0; SOCKADDR_IN clientAddr; int clientAddrLen=sizeof(SOCKADDR_IN); MSG pMsg; char optval[1024]; char recvbuf[1024]; char sendbuf[100]="220 FTPU server Version 1.0, accepted request.\r\n"; *client=accept(*s,(struct sockaddr *)&clientAddr,(int *)&clientAddrLen); if(*client==INVALID_SOCKET) { error=GetLastError(); sprintf(recvbuf,"Accept error=%d",error); //AfxMessageBox(recvbuf); strcpy(remoteIP,""); return(FALSE); } // for(;;) { strcpy(remoteIP,inet_ntoa(clientAddr.sin_addr)); strcpy(recvbuf,"remote IP "); strcat(recvbuf,remoteIP); //AfxMessageBox(recvbuf); setsockopt(*client,SOL_SOCKET,SO_KEEPALIVE,optval,sizeof(optval)); WSAAsyncSelect(*client,m_hWnd,wMsg,FD_READ|FD_WRITE|FD_CLOSE); if((error=recv(*client,recvbuf,1024,0))==SOCKET_ERROR) { //AfxMessageBox(recvbuf); } if((error=send(*client,sendbuf,strlen(sendbuf),0))==SOCKET_ERROR) { lasterror=GetLastError(); sprintf(recvbuf,"send error value=%d",lasterror); //AfxMessageBox(recvbuf); } else { sprintf(recvbuf,"%d",error); strcat(recvbuf," bytes has been sent."); //AfxMessageBox(recvbuf); } while(::PeekMessage(&pMsg,m_hWnd,0,0,PM_REMOVE)) { ::TranslateMessage(&pMsg); ::DispatchMessage(&pMsg); } } return(TRUE); } BOOL socketStartup(SOCKET *s, HWND m_hWnd) { CString ip=GetHostIP(); if(ip=="") { return(FALSE); } WORD wVersionRequested; wVersionRequested=MAKEWORD(VERSION_MAJOR,VERSION_MINOR); WSADATA lpWSAData; int error=WSAStartup(wVersionRequested, &lpWSAData); if(error) { return(FALSE); } if((*s=socket(AF_INET,SOCK_STREAM,0))==INVALID_SOCKET) { return(FALSE); } struct sockaddr_in sockAddr; unsigned long argp; unsigned int wMsg=UM_SOCK; inet_addr(ip.GetBuffer(ip.GetLength())); memset(&sockAddr,0,sizeof(sockAddr)); sockAddr.sin_family=AF_INET; sockAddr.sin_port= htons(FTP_PORT); error=bind(*s,(LPSOCKADDR)&sockAddr,sizeof(sockAddr)); if(error==SOCKET_ERROR) { return(FALSE); } ioctlsocket(*s,FIONBIO,&argp); error=WSAAsyncSelect(*s, m_hWnd, wMsg,FD_ACCEPT|FD_CLOSE); if(error) { return(FALSE); } return(TRUE); } BOOL socketRead(SOCKET *s, SOCKET *client,HWND m_hWnd, char *remoteIP, char* recvbuf) { strcpy(remoteIP,""); strcpy(recvbuf,""); unsigned int wMsg=UM_SOCK; int error=0, lasterror=0; CString msg; MSG pMsg; char optval[10]; setsockopt(*client,SOL_SOCKET,SO_KEEPALIVE,optval,sizeof(optval)); WSAAsyncSelect(*client,m_hWnd,wMsg,FD_READ|FD_WRITE|FD_CLOSE); error=recv(*client,recvbuf,1024,0); if(error==SOCKET_ERROR) { strcpy(recvbuf,""); return(FALSE); } else { recvbuf[error]='\0'; } while(::PeekMessage(&pMsg,m_hWnd,0,0,PM_REMOVE)) { ::TranslateMessage(&pMsg); ::DispatchMessage(&pMsg); } msg=recvbuf; msg.MakeUpper(); if(msg.Find("USER",0)!=-1) { msg="331 User name Okay, Password required.\r\n"; send(*client,msg.GetBuffer(msg.GetLength()),msg.GetLength(),0); } else if(msg.Find("PASS",0)!=-1) { msg="230 User logged in.\r\n"; send(*client,msg.GetBuffer(msg.GetLength()),msg.GetLength(),0); } else if(msg.Find("QUIT",0)!=-1) { WSAAsyncSelect(*client,m_hWnd,wMsg,NULL); shutdown(*client,0); shutdown(*client,1); closesocket(*client); } else { msg="\r\n"; send(*client,msg.GetBuffer(msg.GetLength()),msg.GetLength(),0); } return(TRUE); } 下面的代码放在dialog中。BOOL CFTPUDlg::PreTranslateMessage(MSG* pMsg) { switch(pMsg->message) { case UM_SOCK: ::PeekMessage(pMsg,m_hWnd,0,0,PM_REMOVE); switch(pMsg->lParam) { case FD_ACCEPT: if(socketAccept(&s,&client,m_hWnd, remoteIP)) { m_strOutput+="Accept a client from "; m_strOutput+=remoteIP; m_strOutput+="\r\n"; } else { m_strOutput+="Error in accepting a client.\r\n"; } break; case FD_READ: if(socketRead(&s,&client,m_hWnd,remoteIP,recvbuf)) { m_strOutput+="Receive data from "; m_strOutput+=remoteIP; m_strOutput+="\r\n"; m_strOutput+=recvbuf; m_strOutput+="\r\n"; } else { m_strOutput+="Error in reading data from client.\r\n"; } UpdateData(FALSE); break; case FD_WRITE: m_strOutput+="Write data to client.\r\n"; break; case FD_CLOSE: m_strOutput+="Cleints stopped the connection.\r\n"; break; default: break; } UpdateData(FALSE); break; default: break; } return CDialog::PreTranslateMessage(pMsg); }



tlc97 2000-09-07
  • 打赏
  • 举报
回复
WXZ:
例子是客户端的
wwwunix 2000-08-28
  • 打赏
  • 举报
回复
你是强吗?:-)
zhouming 2000-08-28
  • 打赏
  • 举报
回复
发现一个好地址
http://users.swing.be/francois.piette/indexuk.htm
wxz 2000-08-16
  • 打赏
  • 举报
回复
cb随带了一个例子,为什么不看看呢
LaoZheng 2000-08-16
  • 打赏
  • 举报
回复
写一服务程序来完成. clinet向服务程序发命令.
wolfop 2000-08-16
  • 打赏
  • 举报
回复
何必呢, Warftp server有完整的source, 直接使用不就可以了.
wwwunix 2000-08-16
  • 打赏
  • 举报
回复
C++ Builder自带了一个FTP控件。另:你可以用Socket Server控件。
alexela 2000-08-16
  • 打赏
  • 举报
回复
用API函数:
首先用internetOpen(lpszAgent,dwAccessType,lpszProxyName,lpszProxyBypass,dwflags)打开会话,
再用InternetConnect(hInternetSession,lpszServerName,nServerPort,lpszUserName,lpszPassword,dwService,dwFlags,dwContext)建立与服务器的连接
再用下面的函数完成你的功能:
1。发送文件 FtpPutFile(FFtpHandle,//handle of session
FTPFile.c_str(),//filename to send
newFile.c_str(),//file in server--destination filename
FTP_TRANSFER_TYPE_BINARY,//ASCII or BINARY
0 //use to be 0
);
2.删除文件
FtpDeleteFile(FFtpHandle,filename.c_str())
祝你好运

13,825

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧