利用socket与ftp服务器建立连接,但是recv得到的结果是错误的,无法返回220

发布于 2022-09-11 20:13:11 字数 3872 浏览 16 评论 0

问题描述

利用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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

长发绾君心 2022-09-18 20:13:11

recv中的rbuf只是个指针,没分配空间。

你要么之前

char* rbuf = malloc(MAXBUF);

要么干脆用缓冲区

char rbuf[MAXBUF];
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文