免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1295 | 回复: 0
打印 上一主题 下一主题

请教如何避免broken pipe [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2004-05-03 07:52 |只看该作者 |倒序浏览
下面是我的代码  是一个http的proxy,请教怎么样避免broken pipe。谢谢
#include <stdio.h>;
#include <string.h>;
#include <fcntl.h>;
#include <limits.h>;
#include <errno.h>;
#include <sys/types.h>;
#include <sys/socket.h>;
#include <time.h>;
#include <sys/poll.h>;

#define MAX_HEADER     20480
#define MAX_LINE        2560
#define MAX_FILE_NAME   2560
#define BSIZ            8192

int contentlength(char *header)
{
  int len;
  char line[MAX_LINE];

  if (HTTPheadervalue_case(header, "Content-Length", line))
    sscanf(line, "%d", &len);
  else len = INT_MAX;
  return len;
}

void parserequest(char *request, char *host, int *portno, char *path)
{
  char url[MAX_FILE_NAME] = "";
  char hostport[MAX_FILE_NAME] = "";
  char port[MAX_FILE_NAME] = "";

  sscanf(request, "GET %[^ ] HTTP/1.1", url);
  sscanf(url, "http://%[^\n\r/]%[^\n\r]", hostport, path);
  sscanf(hostport, "%[^:]:%[^\n\r]", host, port);
  if (*port == '\0')
    *portno = 80;
  else
    *portno = atoi(port);
}

int parseresponse(char *statusline)
{
  int v, i;

  sscanf(statusline, "HTTP/1.%d %d ", &v, &i);
  return i;
}

void serviceconn(int cli)
{
  char reqline[MAX_LINE];
  char resline[MAX_LINE];
  char reqhead[MAX_HEADER];
  char reshead[MAX_HEADER];
  char host[MAX_FILE_NAME];
  char path[MAX_FILE_NAME];
  char tbuff[BSIZ];
  int srv, i, n, len, clen, portno, status;

  TCPreadline(cli, reqline, MAX_LINE);
  parserequest(reqline, host, &portno, path);
  HTTPreadheader(cli, reqhead, MAX_HEADER);
  HTTPheaderremove_case(reqhead, "Connection";
  srv = activesocket(host, portno);
  sprintf(reqline, "GET %s HTTP/1.1\r\n", path);
  write(srv, reqline, strlen(reqline));
  strcpy(reqline, "Connection: close\r\n";
  write(srv, reqline, strlen(reqline));
  write(srv, reqhead, strlen(reqhead));
  TCPreadline(srv, resline, MAX_LINE);
  status = parseresponse(resline);
  HTTPreadheader(srv, reshead, MAX_HEADER);
  HTTPheaderremove_case(reshead, "Connection";
  if(write(cli, resline, strlen(resline)) <= 0) return;
  strcpy(resline, "Connection: close\r\n";
  if(write(cli, resline, strlen(resline)) <= 0) return;
  if(write(cli, reshead, strlen(reshead)) <= 0) return;
  if (status == 204 || status == 304)
    clen = 0;
  else
    clen = contentlength(reshead);
  len = 0;
  while (len < clen) {
    n = read(srv, tbuff, BSIZ);
    if (n == 0) break;
    i = write(cli, tbuff, n);
        if(i <=0) return;
    len += n;
  }
  close(srv);
  close(cli);
}

main(int argc, char *argv[])
{
  int p, cli;

  p = atoi(argv[1]);
  printf("**port %d\n", p);
  if ((cli = passivesocket(p)) < 0) {
    perror("open";
    exit(1);
  }
  while(1)
    serviceconn(acceptconnection(cli));
}
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP