gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 23:20:32 28 4
gpt4 key购买 nike

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

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com