- 论坛徽章:
- 0
|
下面是我的代码 是一个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));
} |
|