【发布时间】:2014-03-18 19:55:56
【问题描述】:
这是我的代码简单的 ftp 客户端,我可以连接到服务器登录,但我的程序从服务器读取随机不完整的消息,有时它们是完整的,但有时它只读取几个字节,我不知道该怎么做请帮助我
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <netdb.h>
#include <sys/time.h>
#include <sys/types.h>
#include <sys/socket.h>
#define BUF_SIZE 5000
int main()
{
struct addrinfo hints;
struct addrinfo *result, *rp;
int my_socket, passive_socket, sock, len, m = 0, bytes;
char buf[BUF_SIZE], i[BUF_SIZE];
memset(&hints, 0, sizeof(struct addrinfo));
hints.ai_family = AF_UNSPEC;
hints.ai_socktype = SOCK_STREAM;
hints.ai_protocol = 0;
if ((sock = getaddrinfo("ftp.linux.cz", "ftp", &hints, &result)) != 0)
{
fprintf(stderr, "%s\n", gai_strerror(sock));
exit(EXIT_FAILURE);
}
for (rp = result; rp != NULL ; rp = rp->ai_next)
{
if ((my_socket = socket(rp->ai_family, rp->ai_socktype, rp->ai_protocol))
== -1)
continue;
if (connect(my_socket, rp->ai_addr, rp->ai_addrlen) != -1)
break;
close(my_socket);
}
freeaddrinfo(result);
read(my_socket, buf, BUF_SIZE);
printf("%s", buf);
len = strlen("USER anonymous\r\n");
write(my_socket, "USER anonymous\r\n", len);
read(my_socket, buf, BUF_SIZE);
printf("%s", buf);
len = strlen("PASS secret\r\n");
write(my_socket, "PASS secret\r\n", len);
read(my_socket, buf, BUF_SIZE);
printf("%d\n", bytes);
for (int n = 0; n < bytes; n++)
printf("%c", buf[n]);
len = strlen("EPSV\r\n");
write(my_socket, "EPSV\r\n", len);
read(my_socket, buf, BUF_SIZE);
//printf( "%s", buf );
for (int n = 39; n > 0; n++)
{
if (buf[n] >= 48 && buf[n] <= 57)
{
i[m] = buf[n];
m++;
}
else
{
i[m] = '\0';
n = -1;
}
}
printf("%s\n", i);
#if 0
if ((sock = getaddrinfo("ftp.fit.vutbr.cz", i, &hints, &result)) != 0)
{
fprintf(stderr, "%s\n", gai_strerror(sock));
exit(EXIT_FAILURE);
}
for (rp = result; rp != NULL ; rp = rp->ai_next)
{
if ((passive_socket = socket(rp->ai_family, rp->ai_socktype,
rp->ai_protocol)) == -1)
continue;
if (connect(passive_socket, rp->ai_addr, rp->ai_addrlen) != -1)
break;
close(passive_socket);
}
read(passive_socket, buf, BUF_SIZE);
printf("%s", buf);
len = strlen("NLST\r\n");
write(my_socket, "NLST\r\n", len);
read(passive_socket, buf, BUF_SIZE);
printf("%s", buf);
#endif
return 0;
}
【问题讨论】:
-
也许可以尝试
bzero(buf,BUF_SIZE);以确保您的缓冲区每次都是干净的 -
Closely read read()/write() 和 learn 的手册页b> 这两个函数不一定接收/发送 bytes 和它们被告知一样多,但很少。因此,围绕此类调用进行循环计数,直到所有预期数据或已接收/发送终止符是一个好主意,而不是说基本必要。
-
我试图清除缓冲区,但仍然相同,例如,对于这个循环,我们有 5 行的消息,一个循环读取第一个循环,然后我们转到另一个循环,服务器如何知道他必须向我们发送第二个行吗?
-