使用C语言socket实现windows pc与ftp服务器通信---socket实现ftp客户端

参考资料1点击打开链接

参考资料2点击打开链接

code

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

#include "stdafx.h"
#include <iostream>
#include <fstream>
#include <WinSock2.h>
#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<<"Init Falied: "<<GetLastError()<<endl;
		system("pause");
		return -1;
	}

	//创建Socket
	controlSocket=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
	if(controlSocket==INVALID_SOCKET)
	{
		cout<<"Creating Control Socket Failed: "<<GetLastError()<<endl;
		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<<"Control Socket connecting Failed: "<<GetLastError()<<endl;
		system("pause");
		return -1;
	}
	cout<<"Control Socket connecting is success."<<endl;
	//接收返回状态信息
	recv(controlSocket,buf,100,0);
	cout<<buf;													//220
	//根据返回信息提取状态码,进行判断
	if(getStateCode(buf) != 220)
	{
		cout<<"Error: Control Socket connecting Failed"<<endl;
		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<<"Data Socket connecting Failed: "<<GetLastError()<<endl;
		system("pause");
		return -1;
	}
	cout<<"Data Socket connecting is success."<<endl;
	//更改当前目录
	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<<"The file pointer is NULL!"<<endl;
		cout<<"Error: "<<__FILE__<<" "<<__LINE__<<endl;
		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<<"The data port number is "<<num1*256+num2<<endl;
	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<<buf;
	if(getStateCode(buf) == stateCode)
	{
		return true;
	}
	else
	{
		cout<<"The StateCode is Error!"<<endl;
		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;
}

时间: 2024-10-26 08:59:53

使用C语言socket实现windows pc与ftp服务器通信---socket实现ftp客户端的相关文章

Windows Server 2003 下如何安装及配置 FTP 服务器(转)

Windows Server 2003 下如何安装及配置 FTP 服务器 一.安装 FTP 服务器组件: 写在这里的一点 : 安装及配置 FTP 服务器之前 , 必须先手工配置服务器本身的 IP 地址 ( 因为 服务器本身的 IP 地址一定要是静态的 ). 本文分步介绍了如何在独立服务器上配置一台基于 Windows Server 2003 的文件传输 协议 (FTP) 服务器,以便为网络上的客户端计算机提供资源的传输和访问. FTP 服务 组件是 2003 系统中的 IIS 6.0 集成的网络

socket实现两台FTP服务器指定目录下的文件转移(不依赖第三方jar包)

通过socket实现两台FTP服务器指定目录下的文件转移,其中包含了基础了ftp文件列表显示.上传和下载.这里仅供学习用,需掌握的点有socket.ftp命令.文件流读取转换等 完整代码如下: FtpFileTransfer.java package com.xxx.ftp.client; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.IOException; import java.io

Windows Phone 7 下 Socket(TCP) 与 PC 通讯

Windows Phone 7 下 Socket(TCP) 与 PC 通讯,使用 WP7 模拟器与 PC 上的 Simple TCP 服务进行通讯. TCP 客户端主要实现 Socket 连接的建立.数据的发送与接收和关闭已经建立的 Socket. 1 using System; 2 using System.Net; 3 using System.Windows; 4 using System.Windows.Controls; 5 using System.Windows.Documents

如何把一个c语言程序做成windows服务开机自启动

原文:如何把一个c语言程序做成windows服务开机自启动 目前写的程序是一个用c语言实现socket侦听的,那么如何把这个程序做成开机自启动呢? 我们是通过vs6.0,编译后生成了.exe文件,然后对这个exe文件进行开机自启动设置.具体设置步骤如下: 第一,注册服务名称. (1)下载Instsrv.exe和srvany.exe两个文件.并将其拷贝到C:\WINDOWS文件夹下. (2)执行命令.C:\WINDOWS>instsrv hope c:\WINDOWS\srvany.exe 这里,

Android客户端与PC服务器通过socket进行交互实例(转)

一直以来对Android socket通信都很模糊,今天终于研究了一个网上的例子,自己又修改了下,算是对Android socket通信有点了解了. 下面是具体的代码,说明都在注释中了.需要注意的是,只有客户端发送了信息给服务器后,服务器才能响应客户端的输入,然后返回信息给客户端,这是客户端才能读取服务器返回的信息.如果客户端和服务器都处于等待对方的信息,那样就会造成阻塞,导致ANR了. 1.服务器端代码,就是一个java程序,与android无关,运行于服务器上,即PC机上. [java] v

socket在windows下和linux下的区别

windows到Linux代码移植遇到的问题 1.一些常用函数的移植 http://www.vckbase.com/document/viewdoc/?id=1586 2.网络 ------ 转载 & 修改(待整理) socket相关程序从windows移植到linux下需要注意的 1)头文件 windows下winsock.h/winsock2.h linux下sys/socket.h 错误处理:errno.h 2)初始化 windows下需要用WSAStartup linux下不需要 3)关

android使用socket进行本地PC通信

一.编写思路 手机端为客户端,PC为服务端,手机访问PC通信,需建立一个虚拟的通信链路,客户端通过socket发送请求到服务端,服务端通过serversocket监听来自客户端的socket请求,并生成一个socket.这样就建立了一条虚拟通信网络,然后再通过相关方法进行通信.项目需在服务端建立一个java程序,客户端建立一个android程序. 二.代码编写 (一) PC端的代码编写--java程序 (1)相关方法 Socket accept() :如果接收到一个来自客户端的socket的连接

(8)Linux(客户端)和Windows(服务端)下socket通信实例

Linux(客户端)和Windows(服务端)下socket通信实例: (1)首先是Windows做客户端,Linux做服务端的程序 Windows   Client端 #include <stdio.h> #include <Windows.h> #pragma comment(lib, "ws2_32.lib") #define Port 5000 #define IP_ADDRESS "192.168.1.30"     //服务器地址

微软:Xbox One也是一台Windows PC(转)

(原标题:微软:Xbox One也是一台Windows PC) 早些时候微软为Xbox One带来了基于Windows 10开发的全新系统,玩家不仅获得了全新的系统界面,而且还能够与自己的Windows PC串流游戏,甚至兼容以往的Xbox 360作品. 那么如此一来,Xbox One与Windows PC又有什么区别呢? 微软CEO纳德拉表示“没区别”. 是的,Xbox One实际上也是另一台“Windows PC”,它是放在客厅中的娱乐中心,能够通过跨平台功能将用户的Windows PC.W