FTP使用Socket编程

Posted

技术标签:

【中文标题】FTP使用Socket编程【英文标题】:FTP using Socket Progarmming 【发布时间】:2018-04-26 15:03:56 【问题描述】:

所以我试图使用套接字编程来实现一个基本的文件读取程序。我正在使用 TCP 连接到服务器。客户端发送文件名,服务器读取它并将其内容发送回客户端。 问题是我在服务器程序中遇到错误:

分段错误:11

这里是程序:

Server.c

#include<stdio.h>
#include<unistd.h>
#include<netdb.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<strings.h>
#include <netinet/in.h>
int main()

    int s=socket(AF_INET,SOCK_STREAM,0);

    struct sockaddr_in saddr;
    saddr.sin_family=AF_INET;
    saddr.sin_port=htons(1999);
    saddr.sin_addr.s_addr=htonl(INADDR_ANY);

    socklen_t slen=sizeof(saddr);

    bind(s,(struct sockaddr*)&saddr,slen);
    printf("Server Running..\n");

    listen(s,5);

    struct sockaddr_in caddr;
    socklen_t clen=sizeof(caddr);
    int ad=accept(s,(struct sockaddr*)&caddr,&clen);
    printf("Client Connected\n");

    FILE *fp;
    char buff[1024],file[1000];
    while(1)
    
    bzero(&buff,sizeof(buff));
    bzero(&file,sizeof(file));

    recv(ad,buff,sizeof(buff),0);
    fp=fopen(buff,"r");
    fread(file,sizeof(file),1,fp);
    send(ad,file,sizeof(file),0);
    
    close(s);

Client.c

#include<stdio.h>
#include<unistd.h>
#include<netdb.h>
#include<sys/types.h>
#include<sys/socket.h>
#include <netinet/in.h>
#include<strings.h>
int main()

    int s=socket(AF_INET,SOCK_STREAM,0);

    struct sockaddr_in saddr;
    saddr.sin_family=AF_INET;
    saddr.sin_port=htons(1999);
    saddr.sin_addr.s_addr=inet_addr("127.0.0.1");

    socklen_t slen=sizeof(saddr);

    connect(s,(struct sockaddr*)&saddr,slen);
    char b[1024],f[1000];

    while(1)
    
        bzero(&b,sizeof(b));
        bzero(&f,sizeof(f));
        printf("Enter the name of file : ");
        fgets(b,sizeof(b),stdin);

        send(s,b,sizeof(b),0);
        recv(s,f,sizeof(f),0);

        printf("The contents are : %s", f);

    

谁能告诉我这里可能出现的错误?

【问题讨论】:

使用调试器首先找到代码中发生崩溃的地方... 如果我使用静态文件名,它可以工作。但是,如果我从用户那里获取输入,将其发送到服务器并通过“buff”打开它,那么它就会崩溃。 这里有一个想法:尝试检查那些裸 IO 调用的实际成功/失败状态。例如:您假设您已成功打开文件。如果没有,你 fread 上一个空指针。忽略Spencers Sixth Commandment 是从不建议的。 你为什么给这个问题命名为 FTP ?这与FTP协议无关...... 【参考方案1】:

您永远不会检查 fopen(). 的结果。它可能失败了,因为客户端正在使用 fgets() 并且将换行符留在输入缓冲区中。所以文件名末尾有一个额外的\n。此外,您永远不会关闭文件。

【讨论】:

以上是关于FTP使用Socket编程的主要内容,如果未能解决你的问题,请参考以下文章

第八篇:socket网络编程

Python学习笔记——基础篇第七周———FTP作业(面向对象编程进阶 & Socket编程基础)

go语言网络编程(Socket编程)

网络编程 --ftp上传

11.Socket网络编程

python socket编程