利用socket与ftp服务器建立连接,但是recv得到的结果是错误的,无法返回220
问题描述
利用socket想与ftp服务器(10.3.255.85)建立连接,再进行后续的操作;
建立连接的connect函数没有问题,并成功返回了sockfd,但recv()函数调用时有问题,返回错误代码-1
报错segmentation fault
问题出现的环境背景及自己尝试过哪些方法
看来看去搜了很多例子。。实在是没能解决这个问题,请各位大神帮忙!!!
相关代码
// 请把代码文本粘贴到下方(请勿用图片代替代码)
/* DefinE global variables */
char *host; /* hostname or dotted-decimal string */
char *port;
char *rbuf, *rbuf1; /* pointer that is malloc'ed */
char *wbuf, *wbuf1; /* pointer that is malloc'ed */
struct sockaddr_in servaddr;
int cliopen(char *host, char *port);
void strtosrv(char *str, char *host, char *port);
void cmd_tcp(int sockfd);
void ftp_list(int sockfd);
int ftp_get(int sck, char *pDownloadFileName_s);
int ftp_put (int sck, char *pUploadFileName_s);
int main(int argc, char *argv[])
{
int fd;
if (0 != argc-2)
{
printf("%s\n","missing <hostname>");
exit(0);
}
// passive mode
host = argv[1];
port = "21";
host_bin = inet_addr(host);
printf("host_bin", host_bin);
/*****************************************************************
//1. code here: Allocate the read and write buffers before open().
*****************************************************************/
fd = cliopen(host, port);
printf("the sock fd");
cmd_tcp(fd);
exit(0);
}
/* Establish a TCP connection from client to server */
int cliopen(char *host, char *port){
/*************************************************************
//2. code here
*************************************************************/
int sockfd;
int port;
struct sockaddr_in server;
/*--------------------------socket-------------------------*/
if((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1){
perror("socket error /n");
exit(1);
}
/*----------------------connect---------------------------*/
int num = 0, i = 0;
while(port[i]){
num = num * 10 + (port[i++] - '0');
}
bzero(&server, sizeof(server));
server.sin_family = AF_INET;
server.sin_port = htons(num);
inet_aton(host, &server.sin_addr);
if(connect(sockfd, (struct sockaddr *)&server, sizeof(server)) == -1){
perror("connect() error \n");
exit(1);
}
printf("connect success!");
return sockfd;
}
//waiting for the recv
void cmd_tcp(int sockfd)
{
int maxfdp1, nread, nwrite, fd, replycode;
char host[16];
char port[6];
fd_set rset;
FD_ZERO(&rset);
maxfdp1 = sockfd + 1; /* check descriptors [0..sockfd] */
if (FD_ISSET(sockfd, &rset)) {// the instruct is from the ftp server
if ( (nread = recv(sockfd, rbuf, MAXBUF, 0)) < 0)//ERROR!!!!
printf("recv error\n");
else if (nread == 0)
break;
/* set replycode and wait for user's input */
if (strncmp(rbuf, "220", 3)==0 || strncmp(rbuf, "530", 3)==0){// strncmp: compare the string
strcat(rbuf, "your name: ");
nread += 12;
replycode = USERNAME;
}
/* open data connection*/
if (strncmp(rbuf, "227", 3) == 0) {
strtosrv(rbuf, host, port);
fd = cliopen(host, port);
write(sockfd, wbuf1, nwrite);
nwrite = 0;
}
/* start data transfer */
if (write(STDOUT_FILENO, rbuf, nread) != nread)
printf("write error to stdout\n");
}
}
if (close(sockfd) < 0)
printf("close error\n");
}
你期待的结果是什么?实际看到的错误信息又是什么?
与代码中标注ERROR的部分出现错误,并没有得到与ftp成功连接而返回的“220”代码,而是返回错误代码,并报错segmentation fault,想问一下是否是逻辑有问题,还是在哪里存在疏忽导致了内存出错。。。
能力有限实在是改不出来了。。求各位大神帮忙!!!
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
recv
中的rbuf
只是个指针,没分配空间。你要么之前
要么干脆用缓冲区