ftp client若若的一问(在线给分)

xzhuang 2002-11-15 04:19:38
加精
以下是一个简单的试验。通过socket 连接ftp server的21端口。然后USER anonymous , PASS adfo@eea.net试图登陆服务器(支持匿名登陆,用telent server 21,然后送出USER anonymous , PASS adfo@eea.net。可以得到希望的结果)
////////////////////////////////////
////
#include <stdio.h>
#include <sys/socket.h>
#include <string.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <netdb.h>
#include <pwd.h>
#include <sys/ioctl.h>


#define PORT 21
//struct ioctl_data_t d;


int main(int argc, char *argv[])
{
int socketfd , numreceive;
struct hostent* server;
struct sockaddr_in server_addr;
char buffer[5000];
char hostname[] = "real.nwu.edu.cn";

if ((server = gethostbyname(hostname)) == NULL){ //DNS
printf("Get Host error\n");
exit(-1);
}

if ((socketfd = socket(AF_INET, SOCK_STREAM, 0)) == -1){ //initlization socket
printf("socket initliaztion error\n");
exit(-1);
}
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(PORT);
server_addr.sin_addr = *((struct in_addr*)server->h_addr);
bzero(&(server_addr.sin_zero) , 8);

if (connect(socketfd, (struct sockaddr *)&server_addr, sizeof(struct sockaddr)) == -1){ //connect;
printf("connect error\n");
exit(-1);
}

int i = 1;
while(i!=2){
if ((numreceive = recv(socketfd, buffer, sizeof(buffer), 0)) == -1){ //receive message from a socket
printf("receive message error\n");
exit(-1);
}
i++;
}

int buffer_end = sizeof(buffer) + 1;
buffer[buffer_end] = '\0';
printf("%s" , buffer);

char send_msg[] = "USER anonymous\n"; //send anonymous quest and receive server message;

if ((numreceive = send(socketfd, send_msg, sizeof(send_msg), 0)) == -1){
printf ("send message error\n");
exit(-1);
}
if ((numreceive = recv(socketfd, buffer, sizeof(buffer), 0)) == -1){ //receive message from a socket
printf("receive message error\n");
exit(-1);
}

buffer[numreceive + 1] = '\0';
printf("%s\n", buffer);

char send_msg2[] = "PASS adfoa@245.net\n"; //send password and receive message from server

if ((numreceive = send(socketfd, send_msg2, sizeof(send_msg2), 0)) == -1){
printf ("send message error\n");
exit(-1);
}

if ((numreceive = recv(socketfd, buffer, sizeof(buffer), 0)) == -1){ //receive message from a socket
printf("receive message error\n");
exit(-1);
}

buffer[numreceive + 1] = '\0';
printf("%s\n" , buffer);
close(socketfd);
return 0;
}
//////////////////////////
运行后的提示如下:(faint.........)
///
220 real FTP server (Version wu-2.6.1(1) Wed Aug 9 05:54:50 EDT 2000) ready.
331 Guest login ok, send your complete e-mail address as password.
)
530 Please login with USER and PASS.

问题好像出在PASS *******那块。在SEND passwd时。是否需要加密(md5?)。可是我看了一些ftp client 的源码好像都不用。而且就算要加密。server也应当send一个
encrypt key 过来。
难道要用ioctl来转换么?没用过这个函数。有谁能说说。
...全文
48 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
xzhuang 2002-11-18
  • 打赏
  • 举报
回复
up
xzhuang 2002-11-18
  • 打赏
  • 举报
回复
怎么做?
PASIV
port xxx:ip?
wwwunix 2002-11-18
  • 打赏
  • 举报
回复
在ftp client端被动打开一个端口监听,然后从控制端用PORT命令将端口和IP告诉ftp server.
xzhuang 2002-11-18
  • 打赏
  • 举报
回复
谢谢大家。
我已解决。为题在于应当用strlen,而我用了sizeof.
还有一问。就是,ftp server(不是tftp)有两个端口。21:控制连接。20:数据连接。我怎么建立数据连接。是用另一个socket描述符么?可是,如果用
另一个描述符,server怎么知道我的验证通过了?
xzhuang 2002-11-17
  • 打赏
  • 举报
回复
up
imquestion 2002-11-17
  • 打赏
  • 举报
回复

strcpy(szBuf, "PASS a@aa.com\r\n");
nRet = send(theSocket, //Connected socket
szBuf, //Data buffer
strlen(szBuf), // Length of data
0); // Flags
注意一下recv的次数..
imquestion 2002-11-17
  • 打赏
  • 举报
回复
唉,真不知道你怎么搞得,这个问题真的很简单,
注意一下\r\n就可以了。
上面那个程序我用几分钟就好了,
202.113.88.5
用这个地址,试过了可以。

因为只是为了试一下,没考虑做好。
imquestion 2002-11-17
  • 打赏
  • 举报
回复
#include <stdio.h>
#include <winsock2.h>
#include <windows.h>
#include <conio.h>

void StreamClient(char *szServer, short nPort);

void main()
{
WSADATA wsaData;
int nRet;
short nPort;
char ServerAddr[256];

printf("Server Addr : ");
scanf("%s",ServerAddr);
printf("Server Port : ");
scanf("%d",&nPort);
printf("\n");

nRet = WSAStartup(0x0202, &wsaData);
if (nRet != 0)
{
printf("WSAStartup() failed with error %d\n", nRet);
return;
}

StreamClient(ServerAddr, nPort);

WSACleanup();
}

void StreamClient(char *szServer, short nPort)
{
printf("Stream Client connecting to server: %s on port: %d\n\n",
szServer, nPort);

LPHOSTENT lpHostEntry;

lpHostEntry = gethostbyname(szServer);
if (lpHostEntry == NULL)
{
printf("gethostbyname() error\n");
return;
}

SOCKET theSocket;

theSocket = socket(AF_INET, // Address family
SOCK_STREAM, // Socket type
IPPROTO_TCP); // Protocol
if (theSocket == INVALID_SOCKET)
{
printf("socket() error\n");
return;
}

SOCKADDR_IN saServer;

saServer.sin_family = AF_INET;
saServer.sin_addr = *((LPIN_ADDR)*lpHostEntry->h_addr_list);
// ^ Server's address
saServer.sin_port = htons(nPort); // Port number from command line

int nRet;

nRet = connect(theSocket, // Socket
(LPSOCKADDR)&saServer, // Server address
sizeof(struct sockaddr));// Length of server address structure
if (nRet != SOCKET_ERROR)
{
printf("connect\n");
}
else
{
printf("socket() error\n");
closesocket(theSocket);
return;
}

char szBuf[256];

strcpy(szBuf, "USER anonymous\r\n");
nRet = send(theSocket, // Connected socket
szBuf, // Data buffer
strlen(szBuf), // Length of data
0); // Flags
if(nRet!=SOCKET_ERROR)
{
printf("Client send: %s\n",szBuf);
}
else
{
printf("send error: %d\n",WSAGetLastError());
closesocket(theSocket);
return;
}

memset(szBuf, 0, sizeof(szBuf));
nRet = recv(theSocket, // Connected socket
szBuf, // Receive buffer
sizeof(szBuf), // Size of receive buffer
0); // Flags
if(nRet!=SOCKET_ERROR)
{
printf("Client recv: %s\n",szBuf);
}
else
{
printf("recv error: %d\n",WSAGetLastError());
closesocket(theSocket);
return;
}

memset(szBuf, 0, sizeof(szBuf));
nRet = recv(theSocket, // Connected socket
szBuf, // Receive buffer
sizeof(szBuf), // Size of receive buffer
0); // Flags
if(nRet!=SOCKET_ERROR)
{
printf("Client recv: %s\n",szBuf);
}
else
{
printf("recv error: %d\n",WSAGetLastError());
closesocket(theSocket);
return;
}



/////////////////////////////////////////////////////
strcpy(szBuf, "PASS a@aa.com\r\n");
nRet = send(theSocket, // Connected socket
szBuf, // Data buffer
strlen(szBuf), // Length of data
0); // Flags
if(nRet!=SOCKET_ERROR)
{
printf("Client send: %s\n",szBuf);
}
else
{
printf("send error: %d\n",WSAGetLastError());
closesocket(theSocket);
return;
}

memset(szBuf, 0, sizeof(szBuf));
nRet = recv(theSocket, // Connected socket
szBuf, // Receive buffer
sizeof(szBuf), // Size of receive buffer
0); // Flags
if(nRet!=SOCKET_ERROR)
{
printf("Client recv: %s\n",szBuf);
}
else
{
printf("recv error: %d\n",WSAGetLastError());
closesocket(theSocket);
return;
}

memset(szBuf, 0, sizeof(szBuf));
nRet = recv(theSocket, // Connected socket
szBuf, // Receive buffer
sizeof(szBuf), // Size of receive buffer
0); // Flags
if(nRet!=SOCKET_ERROR)
{
printf("Client recv: %s\n",szBuf);
}
else
{
printf("recv error: %d\n",WSAGetLastError());
closesocket(theSocket);
return;
}


printf("Client Over\n");
getch();

closesocket(theSocket);
return;
}
xzhuang 2002-11-17
  • 打赏
  • 举报
回复
up
xzhuang 2002-11-17
  • 打赏
  • 举报
回复
解决了给1000分。我在vc下用CString能通过。但是直接Send("PASS asdfadso@asdfads.net\r\n" , sizeof("PASS..."))也不行。
xzhuang 2002-11-17
  • 打赏
  • 举报
回复
是啊。我也觉得没什么问题。可是她就是有问题。我用别的ftp client就可以。
imquestion 2002-11-17
  • 打赏
  • 举报
回复
用telent server 21,然后送出USER anonymous , PASS adfo@eea.net。可以得到希望的结果

如果这样都可以,那没理由不行。
用个ftp客户端软件,用那个用户名和密码试试,看看会不会是服务器设置的问题。
按理说这个编程不该有难度啊。
xzhuang 2002-11-17
  • 打赏
  • 举报
回复
up
xzhuang 2002-11-17
  • 打赏
  • 举报
回复
///
220 real FTP server (Version wu-2.6.1(1) Wed Aug 9 05:54:50 EDT 2000) ready.
331 Guest login ok, send your complete e-mail address as password.
)
530 Please login with USER and PASS.
wwwunix 2002-11-17
  • 打赏
  • 举报
回复
报什么错呢?
xzhuang 2002-11-15
  • 打赏
  • 举报
回复
都改了。不行!
wwwunix 2002-11-15
  • 打赏
  • 举报
回复
你的username和password都要改成\r\n,这是ftp的规则。
xzhuang 2002-11-15
  • 打赏
  • 举报
回复
我改成\r\n了,也不行。
imquestion 2002-11-15
  • 打赏
  • 举报
回复
joners(疯狂坦克) 说得很对,
很有可能就是那样。
xzhuang 2002-11-15
  • 打赏
  • 举报
回复
up
加载更多回复(4)

4,356

社区成员

发帖
与我相关
我的任务
社区描述
通信技术相关讨论
社区管理员
  • 网络通信
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧