The simplest ftpget ftpput source code under linux

  1. /*FtpGetRun*/

  2. #include <sys/types.h>

  3. #include <sys/socket.h>

  4.  
  5. #include <netinet/in.h>

  6.  
  7. #include <arpa/inet.h>

  8.  
  9. #include <fcntl.h>

  10.  
  11. #include <unistd.h>

  12.  
  13. #include <stdarg.h>

  14.  
  15. #include <stdio.h>

  16.  
  17. #include <netdb.h>

  18.  
  19. /*FtpGetRun Variable*/

  20.  
  21. FILE *pFtpIOFile = NULL;

  22.  
  23. FILE *pFileCmdChmod; //使用popen方式修改文件属性为可执行的文件指针

  24.  
  25. FILE *pRunGetFile; //使用popen方式执行文件的文件指针

  26.  
  27. char aFtpBuffer[4096];

  28.  
  29. /*Http Variable*/

  30.  
  31. FILE *pFileCmdChmod;

  32.  
  33. FILE *pRunGetFile;

  34.  
  35. char aRequestHead[1000];

  36.  
  37. char aResponseHead[1000];

  38.  
  39. static int iSockHttpMark=-1;

  40. int iGetRunMark;//用来标记是get模式,还是getrun模式1为get模式,2为getrun模式

  41. char acChmodCmd[50];//用来使用chmode命令行

  42. char acRunCmdLine[50];//用来运行程序

  43.  
  44. int FtpCmd(int iSockFtpCmd,char *cFmt,...)

  45. {

  46. va_list vVaStartUse;

  47. int iFtpCmdReturn;

  48. int iFtpLength;

  49.  
  50. if (pFtpIOFile == NULL)

  51. {

  52. pFtpIOFile = fdopen(iSockFtpCmd,"r");

  53. if (pFtpIOFile == NULL)

  54. {

  55. printf("The ERROR of pointer of pFtpIOFile");

  56. return -1;

  57. }

  58. }

  59. if (cFmt)

  60. {

  61. va_start(vVaStartUse,cFmt);

  62. iFtpLength = vsprintf(aFtpBuffer,cFmt,vVaStartUse);

  63. aFtpBuffer[iFtpLength++] = '\r';

  64. aFtpBuffer[iFtpLength++]='\n';

  65. write(iSockFtpCmd,aFtpBuffer,iFtpLength); //如同send

  66. }

  67. do

  68. {

  69. if (fgets(aFtpBuffer,sizeof(aFtpBuffer),pFtpIOFile) == NULL)

  70. {

  71. return -1;

  72. }

  73. } while(aFtpBuffer[3] == '-');

  74.  
  75. sscanf(aFtpBuffer,"%d",&iFtpCmdReturn);

  76. return iFtpCmdReturn;

  77. }

  78.  
  79. int FtpGet(char *host,char *user,char *pass,char *filename,char *pcSaveFile)

  80. {

  81. int iSockFtpCmd = -1;//用来socket接受调用后返回的套接口描述符号

  82. int iSockFtpData = -1;//datasocket建立后返回的套接口描述符号

  83. int iSockAccept = -1;

  84. struct sockaddr_in addr;//定义socket结构

  85. unsigned long hostip;//存放主机地址的变量

  86. int iFtpLength;

  87. int tmp;

  88. int iFtpCmdReturn;

  89. int retval = -1;

  90. int iOpenReturn; //接收open函数的返回值

  91. unsigned char *c;//用来指向data连接时候的主机地址

  92. unsigned char *p;//用来指向data连接时候的端口

  93. struct hostent *he;

  94. hostip = inet_addr(host); //转换主机地址为网络排序模式

  95. if (hostip == -1)

  96. {

  97. printf("\nHostIP is ERROR!!\n");

  98. }

  99.  
  100. //建立socket

  101. //设定相应的socket协议和地址

  102. /**********************************************************/

  103. iSockFtpCmd = socket(AF_INET,SOCK_STREAM,0);

  104.  
  105. if (iSockFtpCmd == -1)

  106. goto out;

  107.  
  108. addr.sin_family = PF_INET;

  109. addr.sin_port = htons(21);

  110. addr.sin_addr.s_addr = hostip;

  111.  
  112. /**********************************************************/

  113. /*connect*/

  114. if (connect(iSockFtpCmd,(struct sockaddr *)&addr,sizeof(addr)) == -1)

  115. goto out;

  116. iFtpCmdReturn = FtpCmd(iSockFtpCmd,NULL);

  117. if (iFtpCmdReturn != 220)

  118. goto out;

  119.  
  120. iFtpCmdReturn = FtpCmd(iSockFtpCmd,"USER %s",user);

  121. if (iFtpCmdReturn != 331)

  122. goto out;

  123.  
  124. iFtpCmdReturn = FtpCmd(iSockFtpCmd,"PASS %s",pass);

  125. if (iFtpCmdReturn != 230)

  126. goto out;

  127.  
  128. iFtpCmdReturn = FtpCmd(iSockFtpCmd,"TYPE I");

  129. if (iFtpCmdReturn != 200)

  130. goto out;

  131.  
  132. /*建立data socket*/

  133. iSockFtpData = socket(AF_INET,SOCK_STREAM,0);

  134.  
  135. if (iSockFtpData == -1)

  136. goto out;

  137.  
  138. tmp = sizeof(addr);

  139.  
  140. getsockname(iSockFtpCmd,(struct sockaddr *)&addr,&tmp);

  141. addr.sin_port = 0;

  142.  
  143. /*绑定*/

  144. if (bind(iSockFtpData,(struct sockaddr *)&addr,sizeof(addr)) == -1)

  145. goto out;

  146.  
  147. if (listen(iSockFtpData,1) == -1)

  148. goto out;

  149.  
  150. tmp = sizeof(addr);

  151. getsockname(iSockFtpData,(struct sockaddr *)&addr,&tmp);

  152. c = (unsigned char *)&addr.sin_addr;

  153. p = (unsigned char *)&addr.sin_port;

  154.  
  155. iFtpCmdReturn = FtpCmd(iSockFtpCmd,"PORT %d,%d,%d,%d,%d,%d", c[0],c[1],c[2],c[3],p[0],p[1]);

  156.  
  157. if (iFtpCmdReturn != 200)

  158. goto out;

  159.  
  160. iFtpCmdReturn = FtpCmd(iSockFtpCmd,"RETR %s",filename);

  161. if (iFtpCmdReturn != 150)

  162. goto out;

  163.  
  164. tmp = sizeof(addr);

  165. iSockAccept = accept(iSockFtpData,(struct sockaddr *)&addr,&tmp);

  166.  
  167. if (iSockAccept == -1)

  168. goto out;

  169. //

  170. iOpenReturn = open(pcSaveFile,O_WRONLY|O_CREAT,0644);

  171. if (iOpenReturn == -1)

  172. goto out;

  173.  
  174. retval = 0;

  175. while ((iFtpLength=read(iSockAccept,aFtpBuffer,sizeof(aFtpBuffer)))>0)

  176. {

  177. write(iOpenReturn,aFtpBuffer,iFtpLength);

  178. retval += iFtpLength;

  179. };

  180.  
  181. close(iOpenReturn);

  182.  
  183. out:

  184. close(iSockAccept);

  185. close(iSockFtpData);

  186. close(iSockFtpCmd);

  187. if (pFtpIOFile)

  188. {

  189. fclose(pFtpIOFile);

  190. pFtpIOFile = NULL;

  191. }

  192. return retval;

  193. }

  194.  
  195.  
  196. int FtpPut(char *host,char *user,char *pass,char *filename,char *pcSaveFile)

  197. {

  198. int iSockFtpCmd = -1;//用来socket接受调用后返回的套接口描述符号

  199. int iSockFtpData = -1;//datasocket建立后返回的套接口描述符号

  200. int iSockAccept = -1;

  201. struct sockaddr_in addr;//定义socket结构

  202. unsigned long hostip;//存放主机地址的变量

  203. int iFtpLength;

  204. int tmp;

  205. int iFtpCmdReturn;

  206. int retval = -1;

  207. int iOpenReturn; //接收open函数的返回值

  208. unsigned char *c;//用来指向data连接时候的主机地址

  209. unsigned char *p;//用来指向data连接时候的端口

  210. struct hostent *he;

  211. hostip = inet_addr(host); //转换主机地址为网络排序模式

  212. if (hostip == -1)

  213. {

  214. printf("\nHostIP is ERROR!!\n");

  215. }

  216.  
  217. //建立socket

  218. //设定相应的socket协议和地址

  219. /**********************************************************/

  220. iSockFtpCmd = socket(AF_INET,SOCK_STREAM,0);

  221.  
  222. if (iSockFtpCmd == -1)

  223. goto out;

  224.  
  225. addr.sin_family = PF_INET;

  226. addr.sin_port = htons(21);

  227. addr.sin_addr.s_addr = hostip;

  228.  
  229. /**********************************************************/

  230. /*connect*/

  231. if (connect(iSockFtpCmd,(struct sockaddr *)&addr,sizeof(addr)) == -1)

  232. goto out;

  233.  
  234. iFtpCmdReturn = FtpCmd(iSockFtpCmd,NULL);

  235. if (iFtpCmdReturn != 220)

  236. goto out;

  237.  
  238. iFtpCmdReturn = FtpCmd(iSockFtpCmd,"USER %s",user);

  239. if (iFtpCmdReturn != 331)

  240. goto out;

  241.  
  242. iFtpCmdReturn = FtpCmd(iSockFtpCmd,"PASS %s",pass);

  243. if (iFtpCmdReturn != 230)

  244. goto out;

  245.  
  246. iFtpCmdReturn = FtpCmd(iSockFtpCmd,"TYPE I");

  247. if (iFtpCmdReturn != 200)

  248. goto out;

  249.  
  250. /*建立data socket*/

  251. iSockFtpData = socket(AF_INET,SOCK_STREAM,0);

  252.  
  253. if (iSockFtpData == -1)

  254. goto out;

  255.  
  256. tmp = sizeof(addr);

  257.  
  258. getsockname(iSockFtpCmd,(struct sockaddr *)&addr,&tmp);

  259. addr.sin_port = 0;

  260.  
  261. /*绑定*/

  262. if (bind(iSockFtpData,(struct sockaddr *)&addr,sizeof(addr)) == -1)

  263. goto out;

  264.  
  265. if (listen(iSockFtpData,1) == -1)

  266. goto out;

  267.  
  268. tmp = sizeof(addr);

  269. getsockname(iSockFtpData,(struct sockaddr *)&addr,&tmp);

  270. c = (unsigned char *)&addr.sin_addr;

  271. p = (unsigned char *)&addr.sin_port;

  272.  
  273. iFtpCmdReturn = FtpCmd(iSockFtpCmd,"PORT %d,%d,%d,%d,%d,%d", c[0],c[1],c[2],c[3],p[0],p[1]);

  274.  
  275. if (iFtpCmdReturn != 200)

  276. goto out;

  277.  
  278. iFtpCmdReturn = FtpCmd(iSockFtpCmd,"STOR %s",filename);

  279. if (iFtpCmdReturn != 150)

  280. goto out;

  281.  
  282. tmp = sizeof(addr);

  283. iSockAccept = accept(iSockFtpData,(struct sockaddr *)&addr,&tmp);

  284.  
  285. if (iSockAccept == -1)

  286. goto out;

  287. //

  288. iOpenReturn = open(pcSaveFile,O_RDONLY,0644);

  289. if (iOpenReturn == -1)

  290. goto out;

  291.  
  292. retval = 0;

  293.  
  294. retval=read(iOpenReturn,aFtpBuffer,4096);

  295.  
  296. while(retval!=0)

  297. {

  298. write(iSockAccept,aFtpBuffer,retval);

  299. retval=read(iOpenReturn,aFtpBuffer,4096);

  300. }

  301.  
  302. close(iOpenReturn);

  303.  
  304. out:

  305. close(iSockAccept);

  306. close(iSockFtpData);

  307. close(iSockFtpCmd);

  308. if (pFtpIOFile)

  309. {

  310. fclose(pFtpIOFile);

  311. pFtpIOFile = NULL;

  312. }

  313. return retval;

  314. }

  315. int main(int argc,char *argv[])

  316. {

  317. iGetRunMark=1;/*设定为get模式*/

  318. if(strcmp("get",argv[1])==0)

  319. {

  320. printf("\nFTP protocol ...\n");

  321. FtpGet(argv[2],argv[3],argv[4],argv[5],argv[6]);

  322. }

  323. if(strcmp("put",argv[1])==0)

  324. {

  325. printf("\nFTP protocol ...\n");

  326. FtpPut(argv[2],argv[3],argv[4],argv[5],argv[6]);

  327. }

  328. return 0;

  329. }

  330.  
Published 115 original articles · Like 29 · Visitors 50,000+

Guess you like

Origin blog.csdn.net/huabiaochen/article/details/103857066