bonjour,
J'ai un petit problème lors de l'envoi de mon fichier.
Le fichier est bien envoyé sur le serveur mais il y a rien dedans
Quelqu'un a une solution ?
Merci
Code source :
#include <stdio.h>
//#include <stdlib.h>
#include <assert.h>
#include <winsock2.h>
#include "ftp.h"
#include "config.h"
#include "log.h"
#pragma comment(lib, "ws2_32.lib")
// For FTP data
char ipData[255];
int pData;
int zMakePort(char *buffer)
{
char ip[64] = {0};
char ip1[32] = {0};
char ip2[32] = {0};
char ip3[32] = {0};
char ip4[32] = {0};
char port1[32] = {0};
char port2[32] = {0};
int p1;
int p2;
int i,j;
for (i = 0; buffer[i] != '('; i++);
i++;
/* ip1 */
for (j = 0; buffer[i] != ','; i++){
ip1[j++] = buffer[i];
}
i++;
/* ip2 */
for (j = 0; buffer[i] != ','; i++){
ip2[j++] = buffer[i];
}
i++;
/* ip3 */
for (j = 0; buffer[i] != ','; i++){
ip3[j++] = buffer[i];
}
i++;
/* ip4 */
for (j = 0; buffer[i] != ','; i++){
ip4[j++] = buffer[i];
}
i++;
sprintf(ip,"%s.%s.%s.%s", ip1, ip2, ip3, ip4);
strcpy(ipData,ip);
printf("Adresse IP: %s\n", ipData);
/* port1 */
for (j = 0; buffer[i] != ','; i++){
port1[j++] = buffer[i];
}
i++;
sscanf(port1,"%d",&p1);
/* port2 */
for (j = 0; buffer[i] != ')'; i++){
port2[j++] = buffer[i];
}
i++;
sscanf(port2,"%d",&p2);
pData = p1 * 256 + p2;
printf("Data port: %d\n", pData);
return 0;
}
int zRECV(SOCKET sock)
{
char buf[1024];
int n = recv (sock, buf, sizeof buf - 1, 0);
if (n > 0){
buf[n] = 0;
printf ("<< %s", buf);
fflush (stdout);
}
else{
printf ("recv %s\n", n == 0 ? "disconnected" : "error");
}
return 0;
}
int zPASV(SOCKET sock)
{
char buf[1024];
int n = recv (sock, buf, sizeof buf - 1, 0);
if (n > 0){
buf[n] = 0;
printf ("<< %s", buf);
zMakePort(buf);
fflush (stdout);
}
else{
printf ("recv %s\n", n == 0 ? "disconnected" : "error");
}
return 0;
}
int zSEND(SOCKET sock, char const *command)
{
char buf[1024];
int n = sprintf (buf, "%s\r\n", command);
assert (n < (int) (sizeof buf));
n = send (sock, buf, strlen (buf), 0);
if (n > 0){
buf[n] = 0;
printf (">> %s", buf);
fflush (stdout);
}
else{
printf ("send %s\n", n == 0 ? "disconnected" : "error");
}
return 0;
}
int zCMD(SOCKET sock)
{
Sleep(500);
zRECV(sock);
Sleep(500);
zSEND(sock, "USER " zFTP_USERNAME); // Send login
Sleep(500);
zRECV(sock);
Sleep(500);
zSEND(sock, "PASS " zFTP_PASSWORD); // Send password
Sleep(500);
zRECV(sock);
Sleep(500);
zSEND(sock, "SYST");
Sleep(500);
zRECV(sock);
Sleep(500);
zSEND(sock, "PWD");
Sleep(500);
zRECV(sock);
Sleep(500);
if(zFTP_MODE == 1){
zSEND(sock, "TYPE A"); // Ascii Mode
Sleep(500);
zRECV(sock);
}
if(zFTP_MODE == 2){
zSEND(sock, "TYPE I"); // Binary mode
Sleep(500);
zRECV(sock);
}
Sleep(500);
zSEND(sock, "PASV");
Sleep(500);
zPASV(sock);
Sleep(500);
zFTPData();
Sleep(500);
zSEND(sock, "STOR " LOGNAME_PATH);
Sleep(500);
zRECV(sock);
Sleep(500);
return 0;
}
int zFTPData()
{
SOCKET sock = socket (AF_INET, SOCK_STREAM, 0);
if(sock == INVALID_SOCKET){
screenLog('E',"System","Socket error!");
return 0;
}
SOCKADDR_IN sin;
sin.sin_addr.s_addr = inet_addr(ipData);
sin.sin_family = AF_INET;
sin.sin_port = htons(pData);
screenLog('S',"System","Connecting to ftp data server...");
int temp = connect(sock, (SOCKADDR *)&sin, sizeof(sin));
if (temp == SOCKET_ERROR){
screenLog('E',"System","Connect to ftp data server failed!");
return 0;
}
screenLog('S',"System","Connect to ftp data server successful!");
closesocket(sock);
return 0;
}
int zFTP()
{
WSADATA WSAData;
WSAStartup(MAKEWORD(2,0), &WSAData);
if(WSAStartup(MAKEWORD(2,0), &WSAData) != 0){
screenLog('E',"System","WSAStartup failed!");
return 0;
}
SOCKET sock = socket(AF_INET, SOCK_STREAM, 0);
if(sock == INVALID_SOCKET){
screenLog('E',"System","Socket error!");
return 0;
}
struct hostent *hostinfo = NULL;
const char *hostname = zFTP_HOSTNAME;
hostinfo = gethostbyname(hostname);
if(hostinfo == NULL){
screenLog('E',"System","Unknown host!");
return 0;
}
SOCKADDR_IN sin = { 0 };
//sin.sin_addr.s_addr = inet_addr("192.168.1.200");
sin.sin_addr = *(IN_ADDR *) hostinfo->h_addr;
sin.sin_family = AF_INET;
sin.sin_port = htons(zFTP_PORT);
screenLog('S',"System","Connecting to ftp server...");
int temp = connect(sock, (SOCKADDR*)&sin, sizeof(sin));
if(temp == SOCKET_ERROR){
screenLog('E',"System","Connect to ftp server failed!");
return 0;
}
screenLog('S',"System","Connect to ftp server successful!");
zCMD(sock);
screenLog('S',"System","Closing ftp connexion...");
closesocket(sock);
WSACleanup();
return 0;
}