- 论坛徽章:
- 0
|
大家好,我用SOCKET写了个FTP测试程序,下载没发现问题.但是上传文件的时候却只能上传第一次读取出的信息,以后的读取不能上传成功.但是当我用DBX 跟进去单步执行的时候,又没有问题.整个文件全部上传成功.
比较郁闷.请高手指点迷津, 程序的红色为上传部分,谢谢.
#include <string>
#include <stdlib.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <time.h>
#include <dirent.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <fcntl.h>
#include <string>
#include <vector>
using namespace std;
#define HOST "192.168.175.232"
#define USER_NAME "administrator"
#define PASSWORD "smart"
#define FTP_PORT 21
int main(int argc, char **argv)
{
int controlSock, listenSock,transferSock;
struct sockaddr_in serverAddr, clientAddr;
int ret;
char recvBuf[4096], sendBuf[1024];
memset(recvBuf, 0x00, sizeof(recvBuf));
memset(sendBuf, 0x00, sizeof(recvBuf));
if ((controlSock=socket(AF_INET,SOCK_STREAM,0)) < 0)
{
perror("socket");
return false;
}
memset(&serverAddr, 0x00, sizeof(serverAddr));
serverAddr.sin_family = AF_INET;
serverAddr.sin_addr.s_addr = inet_addr(HOST);
serverAddr.sin_port = htons(21);
if (connect(controlSock, (struct sockaddr *)&serverAddr, sizeof(serverAddr)) < 0)
{
perror("connect");
return false;
}
printf("ftp %s\n",inet_ntoa(serverAddr.sin_addr));
if ((ret = recv(controlSock, recvBuf, 4095, 0)) <0)
{
perror("recv");
}
printf("%s", recvBuf);
memset(recvBuf, 0x00, sizeof(recvBuf));
if ((ret=send(controlSock, "USER administrator\r\n", strlen("USER administrator\r\n"), 0))<0)
{
perror("send");
}
if ((ret = recv(controlSock, recvBuf, 4095, 0)) <0)
{
perror("recv");
}
printf("%s", recvBuf);
memset(recvBuf, 0x00, sizeof(recvBuf));
if ((ret=send(controlSock, "PASS smart\r\n", strlen("PASS smart\r\n"), 0))<0)
{
perror("send");
}
if ((ret = recv(controlSock, recvBuf, 4095, 0)) <0)
{
perror("recv");
}
printf("%s", recvBuf);
memset(recvBuf, 0x00, sizeof(recvBuf));
if ((ret=send(controlSock, "CWD /cdrbk/200801/\r\n", strlen("CWD /cdrbk/200801/\r\n"), 0))<0)
{
perror("send");
}
if ((ret = recv(controlSock, recvBuf, 4095, 0)) <0)
{
perror("recv");
}
printf("%s", recvBuf);
memset(recvBuf, 0x00, sizeof(recvBuf));
if ((listenSock=socket(AF_INET,SOCK_STREAM,0)) < 0)
{
perror("socket");
return false;
}
printf("listenSock construct!\n");
memset(&clientAddr, 0x00, sizeof(clientAddr));
clientAddr.sin_family = AF_INET;
clientAddr.sin_addr.s_addr = inet_addr("192.168.175.205");
clientAddr.sin_port = 0;
if (bind(listenSock, (struct sockaddr*)&clientAddr, sizeof(clientAddr))<0)
{
perror("bind");
printf("binding failure!\n");
return -1;
}
if (listen(listenSock, 3)<0)
{
perror("listen");
return -2;
}
socklen_t sockLen=sizeof(clientAddr);
getsockname(listenSock, (struct sockaddr*)&clientAddr, (socklen_t *)&sockLen);
printf("%d\n",ntohs(clientAddr.sin_port));
sprintf(sendBuf, "PORT 192,168,175,205,%d,%d\r\n", ntohs(clientAddr.sin_port)/256, ntohs(clientAddr.sin_port)%256);
sendBuf[strlen(sendBuf)] = '\0';
if ((ret=send(controlSock, sendBuf, strlen(sendBuf), 0))<0)
{
perror("send");
}
printf("send have finished!\n");
if ((ret = recv(controlSock, recvBuf, 4095, 0)) <0)
{
perror("recv");
}
printf("recv:%s", recvBuf);
memset(recvBuf, 0x00, sizeof(recvBuf));
if ((ret=send(controlSock, "REST 0\r\n", strlen("REST 0\r\n"), 0))<0)
{
perror("send");
}
if ((ret = recv(controlSock, recvBuf, 4095, 0)) <0)
{
perror("recv");
}
printf("%s", recvBuf);
memset(recvBuf, 0x00, sizeof(recvBuf));
if ((ret=send(controlSock, "TYPE A\r\n", strlen("TYPE A\r\n"), 0))<0)
{
perror("send");
}
if ((ret = recv(controlSock, recvBuf, 4095, 0)) <0)
{
perror("recv");
}
printf("%s\n", recvBuf);
memset(recvBuf, 0x00, sizeof(recvBuf));
if ((ret=send(controlSock, "LIST\r\n", strlen("LIST\r\n"), 0))<0)
{
perror("send");
}
if ((ret = recv(controlSock, recvBuf, 4095, 0)) <0)
{
perror("recv");
}
printf("%s\n", recvBuf);
memset(recvBuf, 0x00, sizeof(recvBuf));
sockLen=sizeof(clientAddr);
if ((transferSock=accept(listenSock,(struct sockaddr*)&clientAddr,(socklen_t *)&sockLen )) < 0)
{
perror("accept");
}
if ((ret = recv(transferSock, recvBuf, 4095, 0)) <0)
{
perror("recv");
}
printf("recv:%s\n", recvBuf);
memset(recvBuf, 0x00, sizeof(recvBuf));
if ( close(transferSock)) printf("the transferSock close error!\n");
close(listenSock);
//下载
if ((listenSock=socket(AF_INET,SOCK_STREAM,0)) < 0)
{
perror("socket");
return false;
}
printf("listenSock construct!\n");
memset(&clientAddr, 0x00, sizeof(clientAddr));
clientAddr.sin_family = AF_INET;
clientAddr.sin_addr.s_addr = inet_addr("192.168.175.205");
clientAddr.sin_port = 0;
if (bind(listenSock, (struct sockaddr*)&clientAddr, sizeof(clientAddr))<0)
{
perror("bind");
printf("binding failure!\n");
return -1;
}
if (listen(listenSock, 3)<0)
{
perror("listen");
return -2;
}
sockLen=sizeof(clientAddr);
getsockname(listenSock, (struct sockaddr*)&clientAddr, (socklen_t *)&sockLen);
sprintf(sendBuf, "PORT 192,168,175,205,%d,%d\r\n", ntohs(clientAddr.sin_port)/256, ntohs(clientAddr.sin_port)%256);
sendBuf[strlen(sendBuf)] = '\0';
if ((ret=send(controlSock, sendBuf, strlen(sendBuf), 0))<0)
{
perror("send");
}
printf("send have finished!\n");
if ((ret = recv(controlSock, recvBuf, 4095, 0)) <0)
{
perror("recv");
}
printf("recv:%s", recvBuf);
memset(recvBuf, 0x00, sizeof(recvBuf));
if ((ret=send(controlSock, "RETR patch\r\n", strlen("RETR patch\r\n"), 0))<0)
{
perror("send");
}
if ((ret = recv(controlSock, recvBuf, 4095, 0)) <0)
{
perror("recv");
}
printf("%s\n", recvBuf);
memset(recvBuf, 0x00, sizeof(recvBuf));
fd_set readfds;
struct timeval tv;
tv.tv_sec=0;
tv.tv_usec=0;
int fileSize=0;
while (1)
{
memset(&readfds, 0x00, sizeof(readfds));
FD_SET(listenSock, &readfds);
if (!select(listenSock+1, &readfds, NULL, NULL, &tv))
continue;
if (!FD_ISSET(listenSock, &readfds))
continue;
if ((transferSock=accept(listenSock,(struct sockaddr*)&clientAddr,(socklen_t *)&sockLen )) < 0)
{
perror("accept");
}
memset(recvBuf, 0x00, sizeof(recvBuf));
while (1)
{
memset(&readfds, 0x00, sizeof(readfds));
FD_SET(transferSock, &readfds);
if (!select(transferSock+1, &readfds, NULL, NULL, &tv))
continue;
if (!FD_ISSET(transferSock, &readfds))
continue;
if ((ret = recv(transferSock, recvBuf, 4095, 0)) < 0)
{
perror("recv");
break;
}
// printf("%s\n",recvBuf);
fileSize += ret;
ret=0;
if (fileSize < 33127)
{
continue;
}
else if (fileSize == 33127 )
{
break;
}
else
{
printf("file transfer error!!!\n");
break;
}
}
close(transferSock);
break;
}
close(listenSock);
//sleep(3);
//上传
if ((listenSock=socket(AF_INET,SOCK_STREAM,0)) < 0)
{
perror("socket");
return false;
}
printf("listenSock construct!\n");
memset(&clientAddr, 0x00, sizeof(clientAddr));
clientAddr.sin_family = AF_INET;
clientAddr.sin_addr.s_addr = inet_addr("192.168.175.205");
clientAddr.sin_port = 0;
if (bind(listenSock, (struct sockaddr*)&clientAddr, sizeof(clientAddr))<0)
{
perror("bind");
printf("binding failure!\n");
return -1;
}
if (listen(listenSock, 3)<0)
{
perror("listen");
return -2;
}
sockLen=sizeof(clientAddr);
getsockname(listenSock, (struct sockaddr*)&clientAddr, (socklen_t *)&sockLen);
printf("begin send PORT!!!!\n");
sprintf(sendBuf, "PORT 192,168,175,205,%d,%d\r\n", ntohs(clientAddr.sin_port)/256, ntohs(clientAddr.sin_port)%256);
sendBuf[strlen(sendBuf)] = '\0';
if ((ret=send(controlSock, sendBuf, strlen(sendBuf), 0))<0)
{
perror("send");
}
printf("send have finished!\n");
memset(recvBuf, 0x00, sizeof(recvBuf));
if ((ret = recv(controlSock, recvBuf, 4095, 0)) <0)
{
perror("recv");
}
printf("recv:%s", recvBuf);
memset(recvBuf, 0x00, sizeof(recvBuf));
if ((ret=send(controlSock, "STOR /cdrbk/200801/test.txt\r\n", strlen("STOR /cdrbk/200801/test.txt\r\n"), 0))<0)
{
perror("send");
}
if ((ret = recv(controlSock, recvBuf, 4095, 0)) <0)
{
perror("recv");
}
printf("%s\n", recvBuf);
memset(recvBuf, 0x00, sizeof(recvBuf));
struct stat fileBuf;
fd_set writefds;
FILE *fp;
if (stat("/home/ocs/srcbk/script/test2/test.txt", &fileBuf) < 0)
{
printf("stat get filestate error!\n");
return -1;
}
fileSize= fileBuf.st_size;
while (1)
{
memset(&writefds, 0x00, sizeof(writefds));
memset(&readfds, 0x00, sizeof(readfds));
FD_SET(listenSock, &readfds);
if (!select(listenSock+1, &readfds, NULL, NULL, &tv))
continue;
if (!FD_ISSET(listenSock, &readfds))
continue;
if ((transferSock=accept(listenSock,(struct sockaddr*)&clientAddr,(socklen_t *)&sockLen )) < 0)
{
perror("accept");
}
memset(recvBuf, 0x00, sizeof(recvBuf));
fp = fopen("/home/ocs/srcbk/script/test2/test.txt", "r");
if (fp == NULL)
{
printf("/home/ocs/srcbk/script/test2/test.txt open failure!\n");
return -1;
}
while (!feof(fp))
{
memset(&writefds, 0x00, sizeof(writefds));
FD_SET(transferSock, &writefds);
if (!select(transferSock+1, NULL, &writefds, NULL, &tv))
continue;
if (!FD_ISSET(transferSock, &writefds))
continue;
if ((ret =fread(recvBuf, 1, 4095, fp)) < 0)
{
printf("read file error!\n");
}
recvBuf[ret]='\0';
fileSize -= ret;
if ((ret = send(transferSock, recvBuf, 4095, 0)) < 0)
{
perror("recv");
printf("send(transferSock, recvBuf, 4095, 0) function exit!!!!\n");
break;
}
printf("%s\n",recvBuf);
memset(recvBuf, 0x00, sizeof(recvBuf));
if (fileSize > 0)
{
continue;
}
else if (fileSize == 0 )
{
printf("exit in normal access!!!\n");
break;
}
else
{
printf("file transfer error!!!\n");
break;
}
}
close(transferSock);
fclose(fp);
break;
}
close(listenSock);
close(controlSock);
return 0;
}
[ 本帖最后由 houhulou 于 2008-4-29 04:37 编辑 ] |
|