c++ - 多线程多套接字同时发送/接收

标签 c++ multithreading sockets http-proxy

我正在构建一个真正的基本代理服务器到我现有的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/

相关文章:

c# - WPF:动态连接 Canvas 上的矩形与之间的路径

sockets - 为另一个用户调用 imap 套接字请求

带有 Socks5 代理的 Java SSLSocket

c++ - 函数原型(prototype)的返回值

c++ - 如何查找列表是否是另一个列表的子集?

c++ - 赋值运算符重载——删除堆内存导致崩溃

java - 我如何使用 wait/notifyAll

.net - 是否可以杀死 BackgroundWorker 的线程?

sockets - boost 套接字async_send : how does it handle ewouldblock?

c++ - 临时文件流