LinuxSir.cn,穿越时空的Linuxsir!

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

怎样编一个c语言的客户端程序下载流媒体?(解决)

[复制链接]
发表于 2006-2-11 17:20:18 | 显示全部楼层 |阅读模式
如下是一个简单的client程序,将 127.0.0.1:9000 的数据读入写到/tmp/data.txt中
[php]
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>

void
error (char *msg)
{
  perror (msg);
  exit (0);
}

int
main ()
{
  int sockfd, portno, n;
  struct sockaddr_in serv_addr;
  struct hostent *server;

  char buffer[4086 * 4086];
  portno = atoi ("9000");
  sockfd = socket (AF_INET, SOCK_STREAM, 0);
  if (sockfd < 0)
    error ("ERROR opening socket");
  server = gethostbyname ("127.0.0.1");
  if (server == NULL)
    {
      fprintf (stderr, "ERROR, no such host\n");
      exit (0);
    }
  memset ((char *) &serv_addr, 0, sizeof (serv_addr));
  serv_addr.sin_family = AF_INET;
  memcpy ((char *) &serv_addr.sin_addr.s_addr, (char *) server->h_addr,
          server->h_length);
  serv_addr.sin_port = htons (portno);
  if (connect (sockfd, &serv_addr, sizeof (serv_addr)) < 0)
    error ("ERROR connecting");

  memset (buffer, 0, sizeof buffer);
  n = read (sockfd, buffer, sizeof (buffer) - 1);
  if (n < 0)
    error ("ERROR reading from socket");
  ////////////////////   

  FILE *fp = fopen ("/tmp/data.txt", "w");
  fwrite (buffer, sizeof buffer, 1, fp);
  fclose (fp);
}
[/php]
设定产生到 127.0.0.1:9000 的媒体数据流,运行程序,结束后产生1.6M的/tmp/data.txt文件,但只有前3,4行有几k的数据。后面全是0了。为什么读了一会就中断了?client程序应该怎样写?
 楼主| 发表于 2006-2-11 20:31:23 | 显示全部楼层
已搞定:
[php]
int
socklib_recvall (int sock, char *buffer, int size, int timeout)
{
  int ret = 0, read = 0;
  fd_set fds;
  struct timeval tv;

  FD_ZERO (&fds);
  while (size)
    {
      if (timeout > 0)
        {
          // Wait up to 'timeout' seconds for data on socket to be ready for read
          FD_SET (sock, &fds);
          tv.tv_sec = timeout;
          tv.tv_usec = 0;
          ret = select (sock + 1, &fds, NULL, NULL, &tv);
          if (ret == -1)
            return -1;
          if (ret != 1)
            return -2;
        }
      ret = recv (sock, &buffer[read], size, 0);
      if (ret == -1)
        {
          fprintf (stderr, "RECV failed\n");
          return -3;
        }
      /* Got zero bytes on blocking read.  For unix this is an
         orderly shutdown. */
      if (ret == 0)
        {
          fprintf (stderr, "recv recieved zero bytes!\n");
          break;
        }
      read += ret;
      size -= ret;
    }
  return read;
}
[/php]
回复 支持 反对

使用道具 举报

发表于 2006-2-11 22:22:04 | 显示全部楼层
这段代码,干嘛用的
这样就能下载流媒体?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-2-12 10:09:25 | 显示全部楼层
connect上后,循环调用该函数读数据包,再写到文件中。
回复 支持 反对

使用道具 举报

发表于 2006-2-12 11:17:28 | 显示全部楼层
Post by dyte200
connect上后,循环调用该函数读数据包,再写到文件中。

怎么指定对端的地址啊?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-2-12 14:21:15 | 显示全部楼层
Post by Illidan
怎么指定对端的地址啊?

第一贴。
%%%%%
实际上第一贴把read放入一个循环中基本上就解决问题了。结果同recv.
我用该程序成功下载asf流媒体,下载后删除前两行,file 检测为asf文件。
回复 支持 反对

使用道具 举报

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

本版积分规则

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