读一个套接字

时间:2017-05-21 13:53:55

标签: c server ftp

我正在尝试模拟一个小型ftp服务器,通过接受来自客户端的连接并与好的回复进行通信并完成所要求的任务来训练自己。但我不明白为什么我的服务器在读取套接字以获取客户端命令时总是遇到错误。我想这可能是因为getline()但我不明白为什么会这样

这是“接受”功能

    static int              my_startserver(char *path, int ssock)
    {
      int                   csock;
      struct sockaddr_in    addr;
      socklen_t             size;

      size = sizeof(&addr);
      printf("Server ready\n");
      while (42)
        {
          if ((csock = accept(ssock, (struct sockaddr*)(&addr), &size)) == -1)
            return (my_error(6, NULL, ssock));
          printf("New connection detected\n");
          if (fork() == 0)
            {
              close(ssock);
              my_newconnexion(my_getdata(csock, path));
            }
          else
            close(csock);
          printf("Waiting for new connexion\n\n");
        }
      return (0);
    }

static t_data   *my_getdata(int fd, char *path)
{
  t_data        *data;

  if (!(data = malloc(sizeof(t_data*))))
    return (NULL);
  else
    {
      if (!(data->fp = fdopen(fd, "r+")))
        {
          write(fd, "540 A stream creation failed.\r\n", 31);
          free(data);
          return (NULL);
        }
      data->fd = fd;
      data->path = path;
    }
  printf("Service ready\n");
  fprintf(data->fp, "220 Service ready for new user.\r\n");
  return (data);
}

这是在fork之后处理与客户端的连接的函数

void    my_newconnexion(t_data *data)
    {
      char  *line;

      if (!data)
        return;
      line = NULL;
      printf("Waiting for command\n");
      while (getline(&line, NULL, data->fp) > -1)
        {
          printf("Command: %s\n", line);
          if (my_getcommand(data, line, strlen(line) - 2))
            {
              my_treatcommand(data);
              free(data->cmd);
              free(data->par);
            }
          free(line);
          line = NULL;
          printf("Waiting for command\n");
        }
      my_quit(data, -1);
    }

1 个答案:

答案 0 :(得分:0)

好的所以我用一个自制函数替换了getline(),该函数从文件描述符(套接字)执行相同的操作,所以我不必用fdopen打开它的文件指针给它getline,现在它完美无缺。