LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 752|回复: 3

有段代码看不懂了 。。。。。

[复制链接]
发表于 2005-4-8 23:49:01 | 显示全部楼层 |阅读模式
[PHP]
int
QueryDir (char *outfile, char fetchType, char *outfilename)
{
  struct sockaddr_in da;
  int foo;
  int hh;
  int rc;
  int i, s, ns;
  int Port;
  FILE *in, *out;
  char *ptr;
  da = sa;
  da.sin_addr.s_addr = myaddr.addr;
  da.sin_port = 0;
  s = socket (AF_INET, SOCK_STREAM, 0);
  if (s < 0)
    {
      perror ("socket");
      return (S_ERROR);
    }
  foo = sizeof (da);
  while (bind (s, (struct sockaddr *) &da, foo) < 0)
    {
      perror ("bind");
      return (S_ERROR);
    }
  if (getsockname (s, (struct sockaddr *) &da, &foo) < 0)
    {
      perror ("ftp: getsockname");
      return (S_ERROR);
    }
  Port = ntohs (da.sin_port);
  if (listen (s, 1) < 0)
    {
      perror ("listen");
      return (S_ERROR);
    }
  fprintf (CtlOut, "ORT %u,%u,%u,%u,%u,%u\r\n",
           (unsigned char) myaddr.bytes[0],
           (unsigned char) myaddr.bytes[1],
           (unsigned char) myaddr.bytes[2],
           (unsigned char) myaddr.bytes[3], Port / 256,
           Port - (unsigned int) (Port / 256) * 256);
  if ((rc = WaitReply ()) == S_OK)
    {
      switch (fetchType)
        {
        case 0:
          fprintf (CtlOut, "LIST\r\n");
          break;
        case 1:
          fprintf (CtlOut, "LIST -lR\r\n");
          break;
        case 2:
          fprintf (CtlOut, "TYPE I\r\n");
          WaitReply ();
          fprintf (CtlOut, "RETR %s\r\n", outfilename);
          //命令:>          RETR [dmhy][nadesico][001][jap_chn][500k].rmvb
          break;
        default:
          puts ("Wrong kind of `fetchType' argument in QueryDir");
          return (S_ERROR);
        }
      if (WaitReply () != S_PREOK)
        return (S_ERROR_INFIMA);
      if ((hh = creat (outfile, MODE)) == -1)
        return (S_ERROR);
      foo = sizeof da;
      ns = accept (s, (struct sockaddr *) &da, &foo);
      if (ns < 0)
        {
          perror ("accept");
          return (S_ERROR);
        }
      close (s);
      if (fetchType == 2)
        while (1)
          {
            i = read (ns, Line, MAX);
            if (!i)
              break;
            alarm (TIMEOUT);
            write (hh, Line, i);
          }

      else
        {
          if (!(in = fdopen (ns, "r")))
            {
              perror ("fdopen in here");
              exit (0);
              return (S_ERROR);
            }
          if (!(out = fdopen (hh, "w")))
            {
              perror ("fdopen out");
              return (S_ERROR);
            }
          while (1)
            {
              fgets (Line, MAX, in);
              if (feof (in))
                break;
              if ((ptr = strchr (Line, CR)) != NULL)
                *ptr = '\0';
              if ((ptr = strchr (Line, LF)) != NULL)
                *ptr = '\0';
              fprintf (out, "%s\n", Line);
              alarm (TIMEOUT);
            }
          fclose (out);
          fclose (in);
        }
      DEB ("Done with fetching the directory");
      close (ns);
      close (hh);
      rc = WaitSucc ();
    }
  return (rc);
}
[/PHP]
这里我把creat换成open,open的flag是读写和创建
碰到很奇怪问题,这里创建成功没返回错误,但是写入的文件不存在。。。。
有什么办法能在文件写完后知道这个文件是否创建成功?在open下?
发表于 2005-4-9 09:23:05 | 显示全部楼层
Post by dancingpig
[PHP]
int
QueryDir (char *outfile, char fetchType, char *outfilename)
{
  struct sockaddr_in da;
  int foo;
  int hh;
  int rc;
  int i, s, ns;
  int Port;
  FILE *in, *out;
  char *ptr;
  da = sa;
  da.sin_addr.s_addr = myaddr.addr;
  da.sin_port = 0;
  s = socket (AF_INET, SOCK_STREAM, 0);
  if (s < 0)
    {
      perror ("socket");
      return (S_ERROR);
    }
  foo = sizeof (da);
  while (bind (s, (struct sockaddr *) &da, foo) < 0)
    {
      perror ("bind");
      return (S_ERROR);
    }
  if (getsockname (s, (struct sockaddr *) &da, &foo) < 0)
    {
      perror ("ftp: getsockname");
      return (S_ERROR);
    }
  Port = ntohs (da.sin_port);
  if (listen (s, 1) < 0)
    {
      perror ("listen");
      return (S_ERROR);
    }
  fprintf (CtlOut, "ORT %u,%u,%u,%u,%u,%u\r\n",
           (unsigned char) myaddr.bytes[0],
           (unsigned char) myaddr.bytes[1],
           (unsigned char) myaddr.bytes[2],
           (unsigned char) myaddr.bytes[3], Port / 256,
           Port - (unsigned int) (Port / 256) * 256);
  if ((rc = WaitReply ()) == S_OK)
    {
      switch (fetchType)
        {
        case 0:
          fprintf (CtlOut, "LIST\r\n");
          break;
        case 1:
          fprintf (CtlOut, "LIST -lR\r\n");
          break;
        case 2:
          fprintf (CtlOut, "TYPE I\r\n");
          WaitReply ();
          fprintf (CtlOut, "RETR %s\r\n", outfilename);
          //命令:>          RETR [dmhy][nadesico][001][jap_chn][500k].rmvb
          break;
        default:
          puts ("Wrong kind of `fetchType' argument in QueryDir");
          return (S_ERROR);
        }
      if (WaitReply () != S_PREOK)
        return (S_ERROR_INFIMA);
      if ((hh = creat (outfile, MODE)) == -1)
        return (S_ERROR);
      foo = sizeof da;
      ns = accept (s, (struct sockaddr *) &da, &foo);
      if (ns < 0)
        {
          perror ("accept");
          return (S_ERROR);
        }
      close (s);
      if (fetchType == 2)
        while (1)
          {
            i = read (ns, Line, MAX);
            if (!i)
              break;
            alarm (TIMEOUT);
            write (hh, Line, i);
          }

      else
        {
          if (!(in = fdopen (ns, "r")))
            {
              perror ("fdopen in here");
              exit (0);
              return (S_ERROR);
            }
          if (!(out = fdopen (hh, "w")))
            {
              perror ("fdopen out");
              return (S_ERROR);
            }
          while (1)
            {
              fgets (Line, MAX, in);
              if (feof (in))
                break;
              if ((ptr = strchr (Line, CR)) != NULL)
                *ptr = '\0';
              if ((ptr = strchr (Line, LF)) != NULL)
                *ptr = '\0';
              fprintf (out, "%s\n", Line);
              alarm (TIMEOUT);
            }
          fclose (out);
          fclose (in);
        }
      DEB ("Done with fetching the directory");
      close (ns);
      close (hh);
      rc = WaitSucc ();
    }
  return (rc);
}
[/PHP]
这里我把creat换成open,open的flag是读写和创建
碰到很奇怪问题,这里创建成功没返回错误,但是写入的文件不存在。。。。
有什么办法能在文件写完后知道这个文件是否创建成功?在open下?

open 这样用好像没问题啊,
perror呢?
回复 支持 反对

使用道具 举报

发表于 2005-4-9 12:49:23 | 显示全部楼层
open("filename", O_WRONLY|O_CREAT).
RETURN VALUE
       open and creat return the new file descriptor, or -1  if  an  error  occurred  (in
       which  case,  errno is set appropriately).
楼主的代码好象出自parker!
哈哈,哪个代码问题多了去了,我大幅度的修改了一次。
除了说明部分没有改之外,都改了。
详见附件!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-4-9 16:17:28 | 显示全部楼层
谢谢,偶看看
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表