C fread()导致我的FTP客户端实现中出现segfault

C fread()导致我的FTP客户端实现中出现segfault,c,ftp,C,Ftp,谢谢你阅读这篇文章。我已经被这个错误困扰了大约5个小时,我只能想象这是最微小的事情阻止我继续这个错误。我正在尝试从头开始编写FTP服务器/客户端。客户端发送“get/send(filename)”,服务器根据clients命令发送或接收它。我被困在一个相当早期的阶段,现在我只是想让它打开文件,读它或尽可能多的它可以到一个缓冲区,并打印它。一旦我知道它打印正确,我会将缓冲区发送给我的客户。但我被困在那里了,据我所知,它是正确打开的,因为它不会产生空指针。但是,在打印文件大小并成功将其发送到客户端后

谢谢你阅读这篇文章。我已经被这个错误困扰了大约5个小时,我只能想象这是最微小的事情阻止我继续这个错误。我正在尝试从头开始编写FTP服务器/客户端。客户端发送“get/send(filename)”,服务器根据clients命令发送或接收它。我被困在一个相当早期的阶段,现在我只是想让它打开文件,读它或尽可能多的它可以到一个缓冲区,并打印它。一旦我知道它打印正确,我会将缓冲区发送给我的客户。但我被困在那里了,据我所知,它是正确打开的,因为它不会产生空指针。但是,在打印文件大小并成功将其发送到客户端后,它总是会出现故障(我已经尝试在文件描述符上打开和读取,以及在文件*上打开和读取fopen和fread,我正在这两个方面进行故障隔离,这就是为什么我认为这在其他地方是一个小错误。)感谢所有帮助,以下是我的服务器代码:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <sys/sendfile.h>
#include <fcntl.h>

int main()
{

  char str[100];
  int listen_fd, comm_fd, rc;

  struct sockaddr_in servaddr;

  listen_fd = socket(AF_INET, SOCK_STREAM, 0);

  bzero( &servaddr, sizeof(servaddr));

  servaddr.sin_family = AF_INET;
  servaddr.sin_addr.s_addr = htons(INADDR_ANY);
  servaddr.sin_port = htons(60072);

  bind(listen_fd, (struct sockaddr *) &servaddr, sizeof(servaddr));

  listen(listen_fd, 10);

  comm_fd = accept(listen_fd, (struct sockaddr*) NULL, NULL);
  while(1) {
    int bytes_read = 0, bytes_sent = 0;
    int which = 0, i = 0, filesize = 0, fd;
    size_t length;
    int offset;
    char *in[15], *token, filename[50];
    struct stat stat_buf;
    bzero( str, 100);

    // Read client command                                                                                                                                                                                                         
    read(comm_fd,str,100);
    printf("Seerver is processing command - %s", str);

    // Parse client command and determine send/recv                                                                                                                                                                                
    token = strtok(str, " ");
    while (token != NULL) {
      in[i] = malloc(strlen(token) + 1);
      strncpy(in[i], token, strlen(token));
      i++;
      if(strcmp(token, "get") == 0) which = 1;
      if(strcmp(token, "send") == 0) which = 2;
      if(strcmp(token, "exit") == 0) exit(0);
      token = strtok(NULL, " ");
      if(i == 1) {
        strcpy(filename, token);
      }
    }
    // Strip newline char sent with fgets                                                                                                                                                                                          
    size_t ln = strlen(filename) - 1;
    if (filename[ln] == '\n') {
      filename[ln] = '\0';
    }
    // Code for SENDING file                                                                                                                                                                                                       
    if (which == 1) {
      char buffer[100];
      // Open file and send file size to client                                                                                                                                                                                    
      stat(filename, &stat_buf);
      filesize = stat_buf.st_size;
      printf("%s successfully opened and has size of %d\n", filename, filesize);
      send(comm_fd, &filesize, sizeof(filesize), 0);
      FILE *fpt;
      bzero(buffer, 100);
      fopen(filename, "r");
      fread(buffer, sizeof(char), 99, fpt);
      printf("%s", buffer);
    }
   }
  }
#包括
#包括
#包括
#包括
#包括
#包括
int main()
{
char-str[100];
int listen_fd、comm_fd、rc;
servaddr中的结构sockaddr_;
listen\u fd=套接字(AF\u INET,SOCK\u STREAM,0);
bzero(&servaddr,sizeof(servaddr));
servaddr.sin_family=AF_INET;
servaddr.sin\u addr.s\u addr=htons(不包含任何内容);
servaddr.sinu端口=htons(60072);
绑定(listen_fd,(struct sockaddr*)&servaddr,sizeof(servaddr));
听(听10);
comm_fd=accept(listen_fd,(struct sockaddr*)NULL,NULL);
而(1){
int bytes_read=0,bytes_sent=0;
int=0,i=0,filesize=0,fd;
尺寸与长度;
整数偏移量;
[15]中的字符*,*标记,文件名[50];
结构统计;
b0(str,100);
//读取客户端命令
读取(通信fd,str,100);
printf(“服务器正在处理命令-%s”,str);
//解析客户端命令并确定发送/接收
标记=strtok(str,“”);
while(令牌!=NULL){
in[i]=malloc(strlen(token)+1);
strncpy(在[i]中,token,strlen(token));
i++;
if(strcmp(token,“get”)=0,其中=1;
if(strcmp(token,“send”)==0),其中=2;
如果(strcmp(令牌,“退出”)==0)退出(0);
令牌=strtok(空,“”);
如果(i==1){
strcpy(文件名、令牌);
}
}
//与fgets一起发送的带换行符字符
大小\u t ln=strlen(文件名)-1;
如果(文件名[ln]='\n'){
文件名[ln]='\0';
}
//发送文件的代码
if(其中=1){
字符缓冲区[100];
//打开文件并将文件大小发送到客户端
stat(文件名和stat_buf);
filesize=stat\u buf.st\u size;
printf(“%s已成功打开,大小为%d\n”、文件名、文件大小);
发送(comm_fd,&filesize,sizeof(filesize),0);
文件*fpt;
b0(缓冲器,100);
fopen(文件名,“r”);
fread(缓冲区,大小(字符),99,fpt);
printf(“%s”,缓冲区);
}
}
}
这是我的客户代码:

#include <sys/types.h>
#include <sys/socket.h>
#include <stdlib.h>
#include <netdb.h>
#include <stdio.h>
#include <string.h>
#include <fcntl.h>


int main(int argc,char **argv)
{
  int sockfd, n;
  char sendline[100];
  char recvline[100];
  char filedesc[100];
  struct sockaddr_in servaddr;

  sockfd=socket(AF_INET,SOCK_STREAM,0);
  bzero(&servaddr,sizeof servaddr);

  servaddr.sin_family=AF_INET;
  servaddr.sin_port=htons(60072);

  inet_pton(AF_INET,"127.0.0.1",&(servaddr.sin_addr));

  connect(sockfd,(struct sockaddr *)&servaddr,sizeof(servaddr));

  while(1)
    {
      int filesize = 0, fd, read_bytes = 0;
      char buffer[1024];
      bzero(sendline, 100);
      bzero(recvline, 100);
      bzero(filedesc, 100);
      printf("Send: ");
      fgets(sendline,100,stdin);
      // Send filename and command to server                                                                     
      write(sockfd,sendline,strlen(sendline)+1);
      // Receive file size from server                                                                           
      recv(sockfd, &filesize, sizeof(filesize), 0);
      printf("The file is %d bytes\n", filesize);
      fd = open("copy.txt", O_CREAT | O_WRONLY, 0644);
      if (fd < 0) {
        printf("Error creating copy of file");
        exit(0);
      }
      //recv(sockfd, &buffer, filesize, 0);                                                                      
      //printf("%s", buffer);                                                                                    
    }
}
#包括
#包括
#包括
#包括
#包括
#包括
#包括
int main(int argc,字符**argv)
{
int-sockfd,n;
字符发送线[100];
char recvline[100];
char filedesc[100];
servaddr中的结构sockaddr_;
sockfd=套接字(AF_INET,SOCK_STREAM,0);
bzero(&servaddr,servaddr的大小);
servaddr.sin_family=AF_INET;
servaddr.sinu port=htons(60072);
inet_pton(AF_inet,“127.0.0.1”和(servaddr.sin_addr));
connect(sockfd,(struct sockaddr*)&servaddr,sizeof(servaddr));
而(1)
{
int filesize=0,fd,read_字节=0;
字符缓冲区[1024];
bzero(发送线,100);
bzero(recvline,100);
bzero(filedesc,100);
printf(“发送:”);
fgets(发送线,100,标准输入);
//将文件名和命令发送到服务器
写入(sockfd、sendline、strlen(sendline)+1);
//从服务器接收文件大小
recv(sockfd,&filesize,sizeof(filesize),0);
printf(“文件为%d字节\n”,文件大小);
fd=打开(“copy.txt”,O|u CREAT | O|u WRONLY,0644);
如果(fd<0){
printf(“创建文件副本时出错”);
出口(0);
}
//recv(sockfd,&buffer,文件大小,0);
//printf(“%s”,缓冲区);
}
}
我根本不在这里发帖,所以如果我能为你们提供任何其他信息,或者将来做些不同的事情,我完全支持


再次感谢。

您没有检查(甚至没有存储(提示))fopen的结果。您完全正确。我不敢相信我忽视了这一点。感谢您的帮助。这里有一个提示/经验法则:您的代码将包含至少(最低限度)与未检查的系统调用一样多的bug。现在,它看起来很可怕:-)养成习惯,总是在写的时候检查它们,而不是以后(因为以后永远不会发生)