c - FTP使用Socket编程

标签 c sockets tcp wininet

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

Segmentation fault: 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);
}

客户端.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);

    }
}

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

最佳答案

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

关于c - FTP使用Socket编程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50046330/

相关文章:

c - 调试将 SIGINT 与 gdb 结合使用的程序

c - snprintf() 只读到换行符?

c - avr-gcc 使用 PROGMEM 没有看到 "const"修饰符

c - _start 是否调用我的程序的主函数和其他基本设置函数?

对 nodejs 服务器的 C++ POST 请求失败(基于套接字)

ios - NSNetService 发布,但从未调用过 didAcceptConnectionWithInputStream...

java - java中可以通过套接字调用远程方法吗?

sockets - 在 WP7 上创建套接字服务器

c# - 如何从 C# 中的另一个事件停止 TCP 服务器

networking - VB.Net - 客户端/服务器游戏的网络方法