c语言实现ftp网络应用程序,使用C语言socket实现windows pc与ftp服务器通信---socket实现ftp客户端...

code

// Client.cpp : 定义控制台应用程序的入口点。

//

#include "stdafx.h"

#include

#include

#include

#pragma comment(lib,"WS2_32.lib")

using namespace std;

#define PORT 21//FTP端口

#define IP_ADDR "x.x.x.x"//主机地址

int getPortNum(char* buf);

bool executeFTPCmd(SOCKET controlSocket, char* buf, int len, int stateCode);

int getStateCode(char* buf);

int main()

{

WSADATA dat;

SOCKET controlSocket, dataSocket;

SOCKADDR_IN serverAddr;

int dataPort, ret, stateCode;

char buf[100]={0}, sendBuf[1024]={0};

//初始化,很重要

if (WSAStartup(MAKEWORD(2,2),&dat)!=0)//Windows Sockets Asynchronous启动

{

cout<

system("pause");

return -1;

}

//创建Socket

controlSocket=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);

if(controlSocket==INVALID_SOCKET)

{

cout<

system("pause");

return -1;

}

//构建服务器访问参数结构体

serverAddr.sin_family=AF_INET;

serverAddr.sin_addr.S_un.S_addr=inet_addr(IP_ADDR);//地址

serverAddr.sin_port=htons(PORT);//端口

memset(serverAddr.sin_zero,0,sizeof(serverAddr.sin_zero));

//连接

ret=connect(controlSocket,(struct sockaddr*)&serverAddr,sizeof(serverAddr));

if(ret==SOCKET_ERROR)

{

cout<

system("pause");

return -1;

}

cout<

//接收返回状态信息

recv(controlSocket,buf,100,0);

cout<

//根据返回信息提取状态码,进行判断

if(getStateCode(buf) != 220)

{

cout<

system("pause");

exit(-1);

}

//用户名

memset(buf,0,100);

sprintf(buf,"USER %s\r\n","xxxx");

executeFTPCmd(controlSocket, buf, 100, 331);//331

//密码

memset(buf,0,100);

sprintf(buf,"PASS %s\r\n","xxxx");

executeFTPCmd(controlSocket, buf, 100, 230);//230

//=======================================

//切换到被动模式

memset(buf,0,100);

sprintf(buf,"PASV\r\n");

executeFTPCmd(controlSocket, buf, 100, 227);//227

//返回的信息格式为---h1,h2,h3,h4,p1,p2

//其中h1,h2,h3,h4为服务器的地址,p1*256+p2为数据端口

dataPort=getPortNum(buf);

//客户端数据传输socket

dataSocket=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);

serverAddr.sin_port=htons(dataPort);//更改连接参数中的port值

ret=connect(dataSocket,(struct sockaddr*)&serverAddr,sizeof(serverAddr));

if(ret==SOCKET_ERROR)

{

cout<

system("pause");

return -1;

}

cout<

//更改当前目录

memset(buf,0,100);

sprintf(buf,"CWD %s\r\n","/ftpxxxx/web/monitor");//250

executeFTPCmd(controlSocket, buf, 100, 250);

//上传文件

memset(buf,0,100);

sprintf(buf,"STOR %s\r\n","1.jpg");

executeFTPCmd(controlSocket, buf, 100, 125);//125

FILE* f=fopen("1.jpg","rb");

if(f==NULL)

{

cout<

cout<

exit(-1);

}

while( !feof(f) )

{

fread(sendBuf, 1, 1024, f);

send(dataSocket, sendBuf, 1024, 0);

}

fclose(f);

//释放资源

closesocket(dataSocket);

closesocket(controlSocket);

WSACleanup();

system("pause");

return 0;

}

//从返回信息“227 Entering Passive Mode (182,18,8,37,10,25).”中

//获取数据端口

int getPortNum(char* buf)

{

int num1=0,num2=0;

char* p=buf;

int cnt=0;

while( 1 )

{

if(cnt == 4 && (*p) != ',')

{

num1 = 10*num1+(*p)-'0';

}

if(cnt == 5)

{

num2 = 10*num2+(*p)-'0';

}

if((*p) == ',')

{

cnt++;

}

p++;

if((*p) == ')')

{

break;

}

}

cout<

return num1*256+num2;

}

//通过控制socket执行FTP命令

bool executeFTPCmd(SOCKET controlSocket, char* buf, int len, int stateCode)

{

send(controlSocket, buf, len, 0);

memset(buf, 0, len);

recv(controlSocket, buf, 100, 0);

cout<

if(getStateCode(buf) == stateCode)

{

return true;

}

else

{

cout<

return false;

}

}

//从返回信息中获取状态码

int getStateCode(char* buf)

{

int num=0;

char* p=buf;

while(p != NULL)

{

num=10*num+(*p)-'0';

p++;

if(*p==' ')

{

break;

}

}

return num;

}

0818b9ca8b590ca3270a3433284dd417.png

0818b9ca8b590ca3270a3433284dd417.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/475072.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Readonly 与Const

Readonly 与Const readonly 关键字是可以在字段上使用的修饰符。当字段声明包括 readonly修饰符时&#xff0c;该声明引入的字段赋值只能作为声明的一部分出现&#xff0c;或者出现在同一类的构造函数中。 对于实例字段&#xff0c;在包含字段声明的类的实例构造函数中&#x…

LeetCode 562. 矩阵中最长的连续1线段(DP)

文章目录1. 题目2. 解题1. 题目 给定一个01矩阵 M&#xff0c;找到矩阵中最长的连续1线段。 这条线段可以是水平的、垂直的、对角线的或者反对角线的。 示例: 输入: [[0,1,1,0],[0,1,1,0],[0,0,0,1]] 输出: 3 提示: 给定矩阵中的元素数量不会超过 10,000。来源&#xff1a;力…

生活中c语言排序案例,C语言之数字排序-基于冒泡排序法的一些案例(对未知数量的数字进行排序)...

C语言之数字排序在学习C语言的时候遇到了几个比较基础的排序问题&#xff0c;又结合了之前的处理方法。觉得在这个需要再系统地进行复习一下。当我们在初学C语言的时候&#xff0c;我们都会结合三个数字的排序来理解计算机处理问题的方式&#xff1a;计算机不会像人一样直观地去…

疑问集锦

1.怎样动态的配置程序中的数据库连接参数&#xff0c;已达到系统的打包后的可安装性&#xff1f; 2.Form的数量会不会影响程序的大小&#xff1f; 3.怎样给程序瘦身&#xff0c;以提高程序的效率&#xff1f; 4.怎样在没有安装独立数据库的机器中运行有数据库文件的软件呢&…

LeetCode 1151. 最少交换次数来组合所有的 1(滑动窗口)

文章目录1. 题目2. 解题1. 题目 给出一个二进制数组 data&#xff0c;你需要通过交换位置&#xff0c;将数组中 任何位置 上的 1 组合到一起&#xff0c;并返回所有可能中所需 最少的交换次数。 示例 1&#xff1a; 输入&#xff1a;[1,0,1,0,1] 输出&#xff1a;1 解释&#…

android闹钟测试工具,android开发:AlarmManager闹钟管理器的实例

1、AlarmManager&#xff0c;顾名思义&#xff0c;就是“提醒”&#xff0c;是Android中常用的一种系统级别的提示服务&#xff0c;在特定的时刻为我们广播一个指定的PendingIntent。通俗点&#xff0c;就是设置一个时间&#xff0c;在指定的时间里&#xff0c;Alarm会帮我们执…

discuz程序的阅读(1)

今天开始阅读discuz2.5的源码&#xff0c;这是发现的一些收获&#xff0c;记录一下。有兴趣的同学可以去试试 CREATE TABLE pre_forum_post ( pid int(10) unsigned NOT NULL COMMENT 帖子id, fid mediumint(8) unsigned NOT NULL default 0 COMMENT 论坛id, tid mediumint(8) …

LeetCode 742. 二叉树最近的叶节点(建立父节点信息+BFS)

文章目录1. 题目2. 解题1. 题目 给定一个 每个结点的值互不相同 的二叉树&#xff0c;和一个目标值 k&#xff0c;找出树中与目标值 k 最近的叶结点。 这里&#xff0c;与叶结点 最近 表示在二叉树中到达该叶节点需要行进的边数与到达其它叶结点相比最少。 而且&#xff0c;当…

SharePoint 大局观(4)——从开发人员角度

内容摘要 SharePoint是微软提供的一个企业级别的协作平台&#xff0c;目前最新的版本是2010&#xff0c;它的功能相当多&#xff0c;而且也相当灵活。为了帮助大家更好地&#xff0c;从相对较高的层面了解SharePoint 2010的体系结构&#xff0c;我这里分七讲来分别介绍。 本节讲…

LeetCode 490. 迷宫(BFS/DFS)

文章目录1. 题目2. 解题2.1 BFS2.2 DFS1. 题目 由空地和墙组成的迷宫中有一个球。 球可以向上下左右四个方向滚动&#xff0c;但在遇到墙壁前不会停止滚动。 当球停下时&#xff0c;可以选择下一个方向。 给定球的起始位置&#xff0c;目的地和迷宫&#xff0c;判断球能否在目…

android studio moudel,Android Studio 添加其他目录下的module

Android Studio 添加其他目录下的moduleadmin • 2020 年 11 月 07 日[title]需要操作的原因[/title]在我们写程序的时候&#xff0c;经常会因为重复性的代码而耽误工夫&#xff0c;所以会编写一些常用的工具类和模块进行调用。在网上搜索到的都是同一个工程下如何配置模块&…

Photoshop Blendmodi in GLSL

转载自&#xff1a;http://renderingpipeline.com/2012/06/photoshop-blendmodi-glsl/ I once wrote a texturing tool in which you could paint on a 3D model on multiple layers. These layers were composing the final texture just as you know it from photoshop, comp…

LeetCode 505. 迷宫 II(BFS / Dijkstra 最短路径)

文章目录1. 题目2. 解题2.1 BFS2.2 Dijkstra 最短路径1. 题目 由空地和墙组成的迷宫中有一个球。 球可以向上下左右四个方向滚动&#xff0c;但在遇到墙壁前不会停止滚动。 当球停下时&#xff0c;可以选择下一个方向。 给定球的起始位置&#xff0c;目的地和迷宫&#xff0c…

数据冗余的理解和相关概念

2012年6月22日有同学去完爱森哲面试回来说&#xff0c;有一问题是问如何消除数据冗余的&#xff0c;我一时也忘了数据冗余的相关概念&#xff0c;于是再复习了一遍&#xff1a; 数据冗余 关系数据库的数据冗余形成的原因&#xff1a;表的重复、属性的重复、元组的重复、属性值的…

红米note3android版本,小米-红米note3-LOS-安卓9.0.0-稳定版Stable3.0-来去电归属-农历等-本地化增强适配...

制作者&#xff1a;MOS-Developer基于版本&#xff1a;LineageOS Android最新安卓9.0.0代码适合机型&#xff1a;小米红米note3高配/标配/低配/kenzo注意事项&#xff1a;为了能一直更新和维护&#xff0c;不付费不收费&#xff0c;请把预装的4个软件使用3-5天后再卸载&#xf…

LeetCode 305. 岛屿数量 II(并查集)

文章目录1. 题目2. 解题2.1 超时解2.1 改进计算方法1. 题目 假设你设计一个游戏&#xff0c;用一个 m 行 n 列的 2D 网格来存储你的游戏地图。 起始的时候&#xff0c;每个格子的地形都被默认标记为「水」。 我们可以通过使用 addLand 进行操作&#xff0c;将位置 (row, col)…

cygwin下的gcc-4.7.1编译心得

步骤&#xff1a; 1、先编译gmp mpfr mpc这几个库&#xff0c;注意configure时--prefix/usr/local/ 2、中间碰到过can not compute suffix的错误&#xff0c;在命令 export LD_LIBRARY_PATH/usr/local/:${LD_LIBRARY_PATH} export LD_RUN_PATH/usr/local/:${LD_RUN_PATH} 也不行…

鸿蒙系统怎么换windows,求助~鸿蒙系统windows环境搭建(hpm-cli安装失败)!

系统win10&#xff0c;执行命令“npm install -g ohos/hpm-cli”&#xff0c;报错如下&#xff1a;npm ERR! code EEXISTnpm ERR! path C:\Users\jay\AppData\Roaming\npm\node_modules\ohos\hpm-cli\bin\hpmnpm ERR! dest C:\Users\jay\AppData\Roaming\npm\hpmnpm ERR! EEXIS…

LeetCode 265. 粉刷房子 II(DP)

文章目录1. 题目2. 解题1. 题目 假如有一排房子&#xff0c;共 n 个&#xff0c;每个房子可以被粉刷成 k 种颜色中的一种&#xff0c;你需要粉刷所有的房子并且使其相邻的两个房子颜色不能相同。 当然&#xff0c;因为市场上不同颜色油漆的价格不同&#xff0c;所以房子粉刷成…

string::size_type

重读c primier, 从这个文章开始做个记录&#xff0c;方便以后自己查阅。 1、string::size_type,string的size&#xff08;&#xff09;方法返回的类型&#xff0c;可以保证string的任意长度。作为配套类型使得string类型的操作与机器无关。 2、操作时需加上作用于操作符&#x…