作者热门文章
- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在构建一个真正的基本代理服务器到我现有的HTTP服务器中。将传入连接添加到队列中,并将信号发送到另一个等待线程队列中的一个线程。此线程从队列中获取传入连接并对其进行处理。
问题是代理程序真的很慢。加载reddit.com需要1分钟。很明显,它没有同时做任何事情。以下是代理函数:
void ProxyConnection::handleConnection() {
if (req->getRequestMethod().compare("GET") == 0) {
addrinfo host_info;
addrinfo *host_info_list;
int proxy_sockfd;
ssize_t n;
memset(&host_info, 0, sizeof host_info);
host_info.ai_family = AF_INET;
host_info.ai_socktype = SOCK_STREAM;
n = getaddrinfo(req->getRequestParam("Host").c_str(), "80",
&host_info, &host_info_list);
if (n == -1)
cout << "ERROR: getaddrinfo" << endl;
proxy_sockfd = socket(host_info_list->ai_family,
host_info_list->ai_socktype,
host_info_list->ai_protocol);
if (proxy_sockfd == -1)
Utils::error("ERROR creating socket");
n = connect(proxy_sockfd, host_info_list->ai_addr,
host_info_list->ai_addrlen);
if (n == -1)
cout << "ERROR connecting" << endl;
// send the request to the destination server
send(proxy_sockfd, req->getSource().c_str(),
req->getSource().length(), 0);
struct timeval tv;
tv.tv_sec = 5;
tv.tv_usec = 0;
setsockopt(proxy_sockfd, SOL_SOCKET, SO_RCVTIMEO,
(char *)&tv,sizeof(struct timeval));
// receive the destination server's response, and send that
// back to the client
while ((n = recv(proxy_sockfd, buf, MAX_BUF, 0)) > 0) {
send(sockfd, buf, n, 0);
}
}
}
recv()
函数上设置了5秒超时,因为有时它不必要地阻塞(即它已经接收到它要接收的所有信息,但是它一直在等待)长达一分钟。
最佳答案
首先,我认为你可以修改连接,连接消耗时间。一个连接超时是75秒。因此,您可以将其修改为Noocket套接字,然后使用SELECT等待结果(此方法称为异步连接)。
如果连接返回错误,则必须关闭套接字。因为当套接字连接发生错误时,套接字将不可用。你必须关闭它并创建一个新的套接字来连接。
因为您是流套接字,所以必须测试send和recv返回。它可能返回的数据不够或更多。所以你必须打包和解包数据。
使用SETSOCKOPT设置超时并不完美。您也可以使用select。选择时间精度优于setsockopt。
我希望我的回答能帮助你。
关于c++ - 多线程多套接字同时发送/接收,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28253226/
我是一名优秀的程序员,十分优秀!