我正在尝试编写代理服务器,现在我想实现流水线操作。我遇到了一个问题但需要帮助。我检查了this问题,但我认为它不适用,因为我有从套接字读取的数据。
主要思想如下。对于每个连接,我创建一个处理它的线程,对于此连接中的每个请求,我想创建一个处理该请求的线程。到目前为止,我已经设法编写第一部分的代码并且它正常工作(线程也处理连接的所有请求)。
现在,当我尝试从套接字读取时,从请求处理线程中,它会挂起。我用来读取数据的功能与之前相同(在工作版本中)。
void copydata(int from, int to, int len)
{
char tbuff[BSIZ];
int n;
while (len > 0)
{
if ((n = read(from, tbuff, BSIZ)) <= 0) break;
if (write(to, tbuff, n) < n) break;
len -= n;
}
}
from,to和len变量具有适当的值(我检查过它们)。有什么可以导致这种行为吗?
PS:如果需要更多代码请告诉我。
修改
以下是获得len的方式:
int contentlength(char *header)
{
int len = INT_MAX;
char line[MAX_LINE];
if (HTTPheadervalue_case(header, "Content-Length", line)) sscanf(line, "%d", &len);
return len;
}
调用copydata(其中activesocket是打开套接字的函数):
if ((srv = activesocket(host, portno)) < 0)
{
sprintf(reshead, "HTTP/1.1 503\r\nContent-Length: 12\r\nConnection: close\r\n\r\nNon-existent");
write(cli, reshead, strlen(reshead));
} else
{
sprintf(reqhead1, "%s %s HTTP/1.1\r\n", "GET", path);
if (HTTPheadervalue_case(reqhead1, "Connection", result)) if (strcasecmp(result, "close") == 0) cli_terminate[cli] = TRUE;
strcat(reqhead1, reqhead);
write(srv, reqhead1, strlen(reqhead1));
while (completed[cli] != id)
;
copydata(cli, srv, contentlength(reqhead));
parseResponse(&srv, cli);
completed[cli] = (completed[cli] + 1) % ULONG_MAX;
}
修改
一个示例请求标头如下:
Host: www.google.com
User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-GB; rv:1.9.1.16) Gecko/20120421 Iceweasel/3.5.16 (like Firefox/3.5.16)
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-gb,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Proxy-Connection: keep-alive
Cookie: cookie content
我试图剥离保持活标志,但仍然会发生同样的情况。
答案 0 :(得分:2)
我猜这是你的问题(来自accept(2)
):
在Linux上,accept()
返回的新套接字 不 继承了O_NONBLOCK
和O_ASYNC
等文件状态标志监听套接字。
即。你需要明确地使每个新接受的套接字不阻塞。